Tcp
為什麼命令 nc 的四次握手之一失敗
我正在使用該命令
nc
來模擬與客戶端和伺服器的 TCP 連接。我在伺服器上執行命令
nc -l 1234
,在客戶端執行命令。tcpdump -i eth0 port 1234``nc IP_OF_SERVER 1234
然後我在客戶端鍵入
abcd
和 aCtrl+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 的發送消息到伺服器和一個 ack 到客戶端,這些正是我所期望的。
但是,關於斷線的記錄似乎只有三條。眾所周知,TCP需要四次握手才能斷開連接。為什麼只有三個記錄,而不是四個?
眾所周知,TCP需要四次握手才能斷開連接。
TCP 不需要四次握手來斷開連接。相反,它需要一個四步握手:
- A發送一個FIN
- B 向 FIN 發送 ACK
- B 發送一個 FIN
- 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, ...