TCP 4路关闭
TCP 4-way close
我的印象是,为了关闭 TCP 会话,需要进行 4 向 close/handshake。查看 TCP 转储(来自 F5 负载均衡器)
21:44:39.149332 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [S], seq 2406625584, win 29200, options [mss 1460,sackOK,TS val 1897921772 ecr 0,nop,wscale 7], length 0 out slot1/tmm1 lis=
21:44:39.163133 IP 2.2.2.2.https > 1.1.1.1.54934: Flags [S.], seq 4293133240, ack 2406625585, win 28960, options [mss 1418,sackOK,TS val 220337697 ecr 1897921772,nop,wscale 7], length 0 in slot1/tmm1 lis=
21:44:39.163277 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [.], ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697], length 0 out slot1/tmm1 lis=
用于建立连接的 TCP 3 次握手看起来完全符合预期,带有 SYN、SYN ACK 和 SYN。然而,拆解使用了 3 条消息:FIN ACK、FIN ACK 和 ACK……我不明白为什么这与文献所说的不同。这是 F5 使用的 TCP 实现吗?供应商是否使用不同的 TCP 实现?
21:44:39.163282 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [F.], seq 1, ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697], length 0 out slot1/tmm1 lis=
21:44:39.176912 IP 2.2.2.2.https > 1.1.1.1.54934: Flags [F.], seq 1, ack 2, win 227, options [nop,nop,TS val 220337700 ecr 1897921786], length 0 in slot1/tmm1 lis=
21:44:39.177067 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [.], ack 2, win 229, options [nop,nop,TS val 1897921800 ecr 220337700], length 0 out slot1/tmm1 lis=
我错过了什么?
注意其他节点堆栈如何将 FIN
与 ACK
结合起来。
四次握手真的是:
- 本地主机发送
FIN
到远程主机
- 远程主机发送
ACK
用于上一条消息
- 远程主机发送
FIN
到本地主机
- 本地主机发送
ACK
到远程主机
远程对等点将中间的两个步骤合并为一个步骤作为优化(以限制发送的数据包数量)。
好的,
我和我的一位同事一起研究过这个问题,他对为什么我们看到双重 ACK 有一个可能的答案。
我们在 TCP 3 向 SYN 的第 3 个数据包和 TCP 4 向关闭的第一个数据包中看到相同的 ACK。根据我的大学,因为在 3 次握手后没有实际发送数据,它会发送另一个 ACK 以确保另一台主机知道会话已终止,因为没有数据在流动,所以另一方看不到停止数据流。所以它发送另一个ACK来确定。
所以实际的TCP关闭是:
-> 鳍
<- 确认,确认
-> 确认
我的印象是,为了关闭 TCP 会话,需要进行 4 向 close/handshake。查看 TCP 转储(来自 F5 负载均衡器)
21:44:39.149332 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [S], seq 2406625584, win 29200, options [mss 1460,sackOK,TS val 1897921772 ecr 0,nop,wscale 7], length 0 out slot1/tmm1 lis=
21:44:39.163133 IP 2.2.2.2.https > 1.1.1.1.54934: Flags [S.], seq 4293133240, ack 2406625585, win 28960, options [mss 1418,sackOK,TS val 220337697 ecr 1897921772,nop,wscale 7], length 0 in slot1/tmm1 lis=
21:44:39.163277 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [.], ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697], length 0 out slot1/tmm1 lis=
用于建立连接的 TCP 3 次握手看起来完全符合预期,带有 SYN、SYN ACK 和 SYN。然而,拆解使用了 3 条消息:FIN ACK、FIN ACK 和 ACK……我不明白为什么这与文献所说的不同。这是 F5 使用的 TCP 实现吗?供应商是否使用不同的 TCP 实现?
21:44:39.163282 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [F.], seq 1, ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697], length 0 out slot1/tmm1 lis=
21:44:39.176912 IP 2.2.2.2.https > 1.1.1.1.54934: Flags [F.], seq 1, ack 2, win 227, options [nop,nop,TS val 220337700 ecr 1897921786], length 0 in slot1/tmm1 lis=
21:44:39.177067 IP 1.1.1.1.54934 > 2.2.2.2.https: Flags [.], ack 2, win 229, options [nop,nop,TS val 1897921800 ecr 220337700], length 0 out slot1/tmm1 lis=
我错过了什么?
注意其他节点堆栈如何将 FIN
与 ACK
结合起来。
四次握手真的是:
- 本地主机发送
FIN
到远程主机 - 远程主机发送
ACK
用于上一条消息 - 远程主机发送
FIN
到本地主机 - 本地主机发送
ACK
到远程主机
远程对等点将中间的两个步骤合并为一个步骤作为优化(以限制发送的数据包数量)。
好的,
我和我的一位同事一起研究过这个问题,他对为什么我们看到双重 ACK 有一个可能的答案。
我们在 TCP 3 向 SYN 的第 3 个数据包和 TCP 4 向关闭的第一个数据包中看到相同的 ACK。根据我的大学,因为在 3 次握手后没有实际发送数据,它会发送另一个 ACK 以确保另一台主机知道会话已终止,因为没有数据在流动,所以另一方看不到停止数据流。所以它发送另一个ACK来确定。
所以实际的TCP关闭是:
-> 鳍
<- 确认,确认
-> 确认