tcp必须一端listen一端connect才能建立连接吗?

关键字:同时发起连接,三路握手,tcp自连接

 

tcp必须一端listen一端connect才能建立连接吗?

    即:必须一端是服务器,另一端是客户端,2端才能握手成功,进行通信?

 

首先给出结果:并不需要

 


 

看实验:

A、B  两台机器

A的ip:192.168.0.107

B的ip:192.168.0.100

 

A机器: 通过8888端口连接对端的9999端口

➜  ~ nc 192.168.0.100 9999 -p 8888 

 

B机器:通过9999端口连接对端的8888端口

➜  ~ nc 192.168.0.107 8888 -p 9999 

 

A和B上输入以上命令,同时按下回车,可以发现,A、B是可以成功建立连接的

此时在终端里随便输入点东西,另一台机器成功收到

A:

➜  ~ nc 192.168.0.100 9999 -p 8888 
abc
def

B:

➜  ~ nc 192.168.0.107 8888 -p 9999 
abc
def

 

 

B机器上用ss查看一下:

➜  ~ ss -tpn4
State  Recv-Q   Send-Q     Local Address:Port                   Peer Address:Port               Process
ESTAB  0        0              127.0.0.1:65530                     127.0.0.1:46806              
ESTAB  0        0              127.0.0.1:46822                     127.0.0.1:65530              
ESTAB  0        0              127.0.0.1:65530                     127.0.0.1:46826              
ESTAB  0        0              127.0.0.1:65530                     127.0.0.1:46779              
ESTAB  0        0          192.168.0.100:49622                       8.8.8.8:853                
ESTAB  0        0              127.0.0.1:46826                     127.0.0.1:65530
ESTAB  0        0          192.168.0.100:9999                  192.168.0.107:8888                users:(("nc",pid=25383,fd=3))   <<<<<<<这一行
ESTAB  0        0              127.0.0.1:65530                     127.0.0.1:46822              
ESTAB  0        0              127.0.0.1:46806                     127.0.0.1:65530              
ESTAB  0        0              127.0.0.1:46779                     127.0.0.1:65530~

本地端口9999,对端端口8888

 

 


 

 

或者,也可以在一台机器上做这个实验

➜  ~ nc 127.0.0.1 8888 -p 8888
abc   <<<输入
abc   <<<输出

用ss看一下:

➜  ~ ss -tpn4
State         Recv-Q    Send-Q         Local Address:Port            Peer Address:Port    Process                                                                                   
SYN-SENT      0         1              192.168.0.108:49808          172.217.24.14:443      users:(("chrome",pid=2378,fd=58))                                                        
SYN-SENT      0         1              192.168.0.108:49806          172.217.24.14:443      users:(("chrome",pid=2378,fd=24))                                                        
CLOSE-WAIT    1         0              192.168.0.108:52998         61.135.169.125:443      users:(("chrome",pid=2378,fd=42))                                                        
ESTAB         0         0                  127.0.0.1:8888               127.0.0.1:8888     users:(("nc",pid=3074,fd=3))  

 

 


对应解释可以看TCP状态转换图

简单地说就是:

发送SYN后,收到对端的SYN+ACK之前,先收到了对端的SYN

那么,进入SYN_RECV状态(也就是一般情况下,LISTEN状态时收到SYN,进入的那个状态)

然后,收到了对端的ACK,进入ESTABLISHED状态

 

即  两端同时打开   这一情况

 

 


 

为更直观一些,用tcpstates看一下状态转换(另一个终端nc 127.0.0.1 8888 -p 8888进行自连接)

tools _ ./tcpstates
SKADDR           C-PID C-COMM     LADDR           LPORT RADDR           RPORT OLDSTATE    -> NEWSTATE    MS
ffff917e180fe040 2005  nc         127.0.0.1       8888  127.0.0.1       8888  CLOSE       -> SYN_SENT    0.000
ffff917e180fe040 2005  nc         127.0.0.1       8888  127.0.0.1       8888  SYN_SENT    -> SYN_RECV    0.049
ffff917e180fe040 2005  nc         127.0.0.1       8888  127.0.0.1       8888  SYN_RECV    -> ESTABLISHED 0.013

 

posted @ 2020-06-13 13:14  drelo  阅读(369)  评论(0编辑  收藏  举报