我尝试在客户端使用 telnet,在服务器端使用 tcpdump 来实现简单的三方握手,客户端和服务器都在虚拟机内部。
我这样使用 telnet:
telnet 172.10.10.21 80
在服务器端,我查看 tcpdump 跟踪:
18:09:33.669452IP 172.10.10.11.43124 > 172.10.10.21.http: 标志 [S], 序列号 803884468,win 29200,选项 [mss 1460,sackOK,TS val 1452463 ecr 0,nop,wscale 7],长度 0
18:09:33.669727IP 172.10.10.21.http > 172.10.10.11.43124:标志 [S.],序列号 2031277521,确认 803884469,win 28960,选项 [mss 1460,sackOK,TS val 1451501 ecr 1452463,nop,wscale 6],长度 0
18:09:33.670525IP 172.10.10.11.43124 > 172.10.10.21.http: 标志 [.], ack 2031277522,win 229,选项 [nop,nop,TS val 1452463 ecr 1451501],长度 0
这样我们就可以进行三次握手了。
但是当查看服务器端的 TCP 状态时,它仍然处于 SYN_RECV。大约 30 秒后,我们可以在 tcpdump 中看到新的东西:
18:10:04.667812IP 172.10.10.21.http > 172.10.10.11.43124:标志 [S.],序列号 2031277521,确认 803884469,win 28960,选项 [mss 1460,sackOK,TS val 1459251 ecr 1452463,nop,wscale 6],长度 0
18:10:04.669330IP 172.10.10.11.43124 > 172.10.10.21.http: 标志 [.], ack 2031277522,win 229,选项 [nop,nop,TS val 1460213 ecr 1451501],长度 0
服务器又发送了一个 SYN+ACK。
看来它第一次没有收到客户端的 ACK。
这一次,服务器端的 TCP 状态是 ESTABLISHED。为什么第一次没有建立连接?
我试了几次,结果还是一样。