1、前言:

socket建立连接的时候,服务器端需要socket ,bind,listen,accept:

其中,bind需要绑定服务器端的ip地址和端口号;

accept之后,会生成一个新的socket ,这个socket即与客户端进行通信的socket;

客户端需要socket,connect:(当然也可以使用bind,指定客户端的ip和端口号)

多个客户端可以同时去连接同一个服务器端。

客户端也可以使用bind函数来绑定自身ip和自定义端口号,但一般在客户端程序中不使用,所以系统就会隐式绑定一个随机的端口号;

这也就是为什么,

 服务器端的端口号是我们固定的端口号23,而客户端对应的端口号是49361,46100,这种随机的端口号原因。

2、命令结果分析

proto:连接方式

local address:本地连接地址

foreign address:和本地建立连接的地址

state:当前端口状态,其中state会出现以下各种情况:

       LISTEN:侦听来自远方的TCP端口的连接请求-->表明这是服务器端,调用accpt()之后,就会处于listen状态;
       SYN_SENT:再发送连接请求后等待匹配的连接请求-->主动发起连接的一方,发送syn后的状态;
  SYN_RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认-->被动连接的一方接收syn,后,并发送syn,ack后的状态
  ESTABLISHED:代表一个打开的连接-->客户端接收syn和ack
  FIN_WAIT_1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  FIN_WAIT_2:从远程TCP等待连接中断请求
  CLOSE_WAIT:等待从本地用户发来的连接中断请求
  CLOSING:等待远程TCP对连接中断的确认
  LAST_ACK:等待原来的发向远程TCP的连接中断请求的确认
  TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  CLOSED:没有任何连接状态

通过这个命令查看计算机上的连接。

由上图可知:local Address 是我们本地机IP,后面跟着的是端口号;

Foreign  Address是与该主机连接的电脑ip,后面跟着的是与之相连的客户端随机分配的端口号(相当于accept之后的端口值);

23端口是telnet 服务,我们看到有2台foreign机通过telnet连接了本地机。

表示23端口在监听listen状态,表示是服务器端进程。

 可以看到有两台客户端电脑在通过telnet连接服务器,两个客户端分别分配了49361和46100两个端口号;

3、总结:

客户端connect服务器端的23端口程序;

服务器端accept   A客户端后,创建了一个新的socket,对应一个新的端口号49361;

服务器端accept B客户端后,创建了一个另一个新的socket,对应另一个新的端口号46100。

也就是说,最终一个客户端进程对应一个端口号。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐