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