重新认识 TCP 的握手和挥手

在教科书上,我们学过 TCP 的 3 次握手和 4 次挥手,请读者思考一下:TCP 握手一定会使用 3 个包吗?TCP 的挥手一定会使用 4 个包吗?

下载这个抓包文件,并且分析以下问题:

问题1: 这个抓包文件中,一共有几个 TCP 连接?

问题2: 对于每一个 TCP 连接,请找出来和 TCP 握手有关的 3 个包,以及和 TCP 挥手有关的 4 个包

TCP 是可靠的传输层协议,这意味着在 TCP 连接中,丢失的每一个数据都会被识别出来。考虑这种情况:在一个 TCP 连接中,发送端发送完最后一个 segment,然后发送 FIN 包结束连接。即,发送端发送了两个包。这时候:

  • 假设 segment 数据丢失了,那么发送端不会得到这个 segment 的 ACK,需要重传 segment 数据;
  • 如果 FIN 丢了,也需要重传 FIN,4 次挥手中,ACK 的作用就是确保 FIN 也得到了 ACK 确认。

那么最后的问题是:如果发送端发送了 segment 数据和 FIN,但是只收到一个 ACK,发送端如何知道 ACK 的是 segment 数据,还是 FIN 包,还是二者都是?注意,ACK 会有 ACK 的序列号,表示这个号码之前的数据都已收到。但是 FIN 的数据长度是 0。那么 ACK 如何区分 FIN这个包 和 FIN 之前的数据呢?

发送端的问题

提示:TCP 肯定已经处理好了这种情况,所以答案就在 RFC 793 中。如果不想阅读 RFC,那么可以仔细分析 ACK number 来找到答案。

目录

这个系列正在连载中,没有链接的目录还没有写完,敬请期待……

  1. 序章
  2. 抓包技术以及技巧
  3. 理解网络的分层模型
  4. 数据是如何路由的
  5. 网络问题排查的思路和技巧
  6. 不可以用路由器?
  7. 网工闯了什么祸?
  8. 网络中的环路和防环技术
  9. 延迟增加了多少?
  10. TCP 延迟分析
  11. 重新认识 TCP 的握手和挥手
  12. 重新认识 TCP 的握手和挥手:答案和解析
  13. 后记:学习网络的一点经验分享
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 4.0 国际 协议。
如果本文对您有帮助,欢迎打赏支持,正是订阅者的支持,让我公开写这个系列成为可能,感谢!


重新认识 TCP 的握手和挥手”已经有4条评论

  1. 1. Statistics → Conversations 可以从 TCP 那页看到会话数量。
    2. 右键用 steam id 过滤,可以看到每一个 TCP 连接的包。HTTP 解析器会干扰 TCP 的显示,可以从 Analyze → Enabled Protocols… 临时关掉,这样更方便看。
    3. data=0 不代表不能占用 sequence number。假设相对 Seq 从 0 开始,发送方数据是从 Seq=1 开始的,FIN 也一样可以占 1 位。

  2. This is achieved by implicitly including
    some control flags in the sequence space so they can be retransmitted
    and acknowledged without confusion (i.e., one and only one copy of the
    control will be acted upon). Control information is not physically
    carried in the segment data space. Consequently, we must adopt rules
    for implicitly assigning sequence numbers to control. The SYN and FIN
    are the only controls requiring this protection, and these controls
    are used only at connection opening and closing. For sequence number
    purposes, the SYN is considered to occur before the first actual data
    octet of the segment in which it occurs, while the FIN is considered
    to occur after the last actual data octet in a segment in which it
    occurs. The segment length (SEG.LEN) includes both data and sequence
    space occupying controls.

Leave a comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注