为什么四次握手中有一次会与命令 nc 发生错误

为什么四次握手中有一次会与命令 nc 发生错误

我正在使用该命令nc来模拟与客户端和服务器的 TCP 连接。

我在服务器上执行该命令nc -l 1234,并且在客户端执行该命令。tcpdump -i eth0 port 1234nc IP_OF_SERVER 1234

然后我在客户端输入abcd并。Ctrl+D

在 终端上tcpdump,我得到如下输出:

13:35:11.800516 IP 172.19.48.20.51678 > 172.19.48.2.1234: Flags [S], seq 3620507131, win 29200, options [mss 1460,sackOK,TS val 2065731649 ecr 0,nop,wscale 7], length 0
13:35:11.800529 IP 172.19.48.2.1234 > 172.19.48.20.51678: Flags [S.], seq 451776773, ack 3620507132, win 28960, options [mss 1460,sackOK,TS val 1583409528 ecr 2065731649,nop,wscale 7], length 0
13:35:11.800586 IP 172.19.48.20.51678 > 172.19.48.2.1234: Flags [.], ack 1, win 229, options [nop,nop,TS val 2065731649 ecr 1583409528], length 0
13:35:13.793724 IP 172.19.48.20.51678 > 172.19.48.2.1234: Flags [P.], seq 1:6, ack 1, win 229, options [nop,nop,TS val 2065733642 ecr 1583409528], length 5
13:35:13.793733 IP 172.19.48.2.1234 > 172.19.48.20.51678: Flags [.], ack 6, win 227, options [nop,nop,TS val 1583410026 ecr 2065733642], length 0
13:35:18.442459 IP 172.19.48.20.51678 > 172.19.48.2.1234: Flags [F.], seq 6, ack 1, win 229, options [nop,nop,TS val 2065738291 ecr 1583410026], length 0
13:35:18.442479 IP 172.19.48.2.1234 > 172.19.48.20.51678: Flags [F.], seq 1, ack 7, win 227, options [nop,nop,TS val 1583411188 ecr 2065738291], length 0
13:35:18.442520 IP 172.19.48.20.51678 > 172.19.48.2.1234: Flags [.], ack 2, win 229, options [nop,nop,TS val 2065738291 ecr 1583411188], length 0

因此,我可以看到,一开始有三次握手,向服务器发送长度为 5 的消息,然后向客户端发送一个确认,这些正是我所期望的。

但是断开连接的记录好像只有三条,我们都知道TCP断开连接需要四次握手,为什么只有三条记录,而不是四条呢?

答案1

众所周知,TCP 连接断开需要四次握手。

TCP 不需要四方式握手断开连接。它需要四个握手:

  1. A发送FIN
  2. B 向 FIN 发送 ACK
  3. B发送FIN
  4. A 向 B 的 FIN 发送 ACK

步骤 2+3 可以合并为一个步骤,即发送带有 FIN+ACK 的数据包,如下所示:

[1]    13:35:18.442459 A > B: Flags [F.], seq 6, ack 1, ...
[2+3]  13:35:18.442479 B > A: Flags [F.], seq 1, ack 7, ... 
[4]    13:35:18.442520 A > B: Flags [.], ack 2, ...

相关内容