【问题标题】:TCP 4-way closeTCP 4 路关闭
【发布时间】:2018-12-16 00:37:14
【问题描述】:

我的印象是,为了关闭 TCP 会话,需要进行 4 次关闭/握手。查看 TCP 转储(来自 F5 负载均衡器)

21:44:39.149332 IP 1.1.1.1.54934 > 2.2.2.2.https: 标志 [S], seq 2406625584, win 29200, options [mss 1460,sackOK,TS val 1897921772 ecr 0,nop,wscale 7], 长度 0 出 slot1/tmm1 lis=

21:44:39.163133 IP 2.2.2.2.https > 1.1.1.1.54934: 标志 [S.], seq 4293133240, ack 2406625585, win 28960, options [mss 1418,sackOK, TS val 220337697 ecr 1897921772,nop,wscale 7],slot1/tmm1 中的长度 0 lis=

21:44:39.163277 IP 1.1.1.1.54934 > 2.2.2.2.https: 标志 [.], ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697 ],长度为 0 出 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: 标志 [F.], seq 1, ack 1, win 229, options [nop,nop,TS val 1897921786 ecr 220337697],长度为 0 出 slot1/tmm1 lis=

21:44:39.176912 IP 2.2.2.2.https > 1.1.1.1.54934:标志 [F.],seq 1,ack 2,win 227,选项 [nop,nop,TS val 220337700 ecr 1897921786],slot1/tmm1 中的长度 0 lis=

21:44:39.177067 IP 1.1.1.1.54934 > 2.2.2.2.https: 标志 [.], ack 2, win 229, options [nop,nop,TS val 1897921800 ecr 220337700 ],长度为 0 出 slot1/tmm1 lis=

我错过了什么?

【问题讨论】:

    标签: tcp handshake


    【解决方案1】:

    注意其他对等点堆栈如何将FINACK 组合在一起。

    四次握手真的是:

    1. 本地主机向远程主机发送FIN
    2. 远程主机为上一条消息发送ACK
    3. 远程主机向本地主机发送FIN
    4. 本地主机向远程主机发送ACK

    远程对等点将两个中间步骤合并为一个步骤作为优化(以限制发送的数据包数量)。

    【讨论】:

    • 这仍然无法解释我所看到的。仔细看。一个点代表一个 ACK​​。所以我看到了 3 个 ACK​​... 请解释最后的 ACK。我看到这个:1. FIN ACK 2. FIN ACK 3. ACK。直到第 2 条,你的故事是有道理的,但最后一个 ACK​​ 呢……
    • @frankguthrie 第一个ACK 可能是发送给您的previous`数据包。因此,您的主机发送一个FIN(开始拆卸)和一个ACK 用于前一个数据包。然后远程主机回复它的ACK *和它自己的FIN,最后是你的主机ACK它收到的FIN。将ACK 与另一个数据包结合起来并不少见,恰恰相反,
    • 实际上,我并没有从输出中遗漏任何内容。我们对 TCP 端口进行监控,因此没有数据发送。在 TCP 3 次握手(SYN、SYN ACK、ACK)之后,连接立即终止,没有数据发送。那么为什么第一个 ACK​​ 会与第一个 FIN ACK 结合起来呢??
    • @frankguthrie 好的,这有点不同。您可能应该编辑您的问题以显示 complete 日志(因为它不会比您已有的日志长)并详细说明该问题(基本上是您在此评论中所说的)。
    • 完整的日志显示完全相同,它是上面看到的 2 个块的重复。 TCP 运行状况监视器检查 TCP 端口是否正在侦听该端口。
    【解决方案2】:

    好的,

    我和我的一位同事一起研究过这个问题,他对我们为什么会看到双重 ACK 有一个可能的答案。

    我们在 TCP 3-way SYN 的第 3 个数据包和 TCP 4-way close 的第一个数据包中看到相同的 ACK。根据我大学的说法,因为在 3 次握手之后没有实际发送数据,它会发送另一个 ACK​​ 以确保对方知道会话已终止,因为没有数据在流动,所以对方看不到数据流停止。所以它会发送另一个 ACK​​ 来确认。

    所以实际的 TCP 关闭是:
    -> 鳍
    -> 确认

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2011-07-12
      • 2011-01-26
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2012-04-12
      相关资源
      最近更新 更多