【问题标题】:packet order in TCP packet fragmentationTCP 数据包分片中的数据包顺序
【发布时间】:2017-03-05 08:26:46
【问题描述】:

在 TCP/IP 中,我们在发送和接收数据包时有 MSS 和 MTU。

  1. MTU 是一个IP 层概念,由底层硬件决定。它显示了 IP 层数据包在一次传输期间可以包含的最大数据大小。
  2. MSS 是 TCP 层的概念,受 MTU 限制,表明 TCP 数据流会被分片成 MSS 大小的数据包。

我们的协议位于 TCP 之上,每个协议都会定义自己的数据包。一个例子是 MySQL,它定义了它的数据包大小为 2^24-1,即大约 16M。当足够大的协议包到达 TCP 时,会根据 MSS 进行分片。

假设客户端需要将 DATA1 和 DATA2 发送到服务器。 DATA2大小大于MSS,DATA2会被分片成DATA2_1、DATA2_2。由于数据包将由IP层处理,因此每个数据包到达服务器的时间可能与客户端发送它们的时间不同。

所以我认为数据包到达的顺序可能如下:

  1. DATA1 DATA2_1, DATA2_2
  2. DATA1、DATA2_1、DATA2_2
  3. DATA1、DATA2_2、DATA2_1

在第一种情况下,服务器在一个 tcp 数据包中接收到 DATA1 和 DATA2_1,然后另一个包含 DATA2_2 的数据包到达。

第二种情况,服务器分三个包接收DATA1、DATA2_1和DATA2_2。

第三种情况,服务器先接收DATA2_2,再接收DATA2_1。

我的问题:

第三种情况可能吗?

如果是,则不遵守TCP是流协议,应订购流协议。而且即使这样也不破坏流规则,如何处理这种情况?

如果不是,TCP如何将乱序的数据包恢复到原来的顺序?

【问题讨论】:

    标签: networking tcp


    【解决方案1】:

    可以通过网络接收该序列,但是 TCP 实现将对您的应用程序隐藏该详细信息,并且仅按流顺序将数据提供给您。 (事实上​​,由于碎片发生在 IP 层,它甚至不会显示给 TCP 层,直到第二部分也到达)

    事实上,即使在某些情况下接收到数据包后,也必须将其保存在缓冲区中,这就是为什么您会看到人们将 UDP 称为更适合低延迟应用程序的原因:您可以使用 UDP 无序接收数据报,并且由您的应用程序决定如何处理这种可能性。

    【讨论】:

      【解决方案2】:

      第三种可能吗?

      是的,当然。

      如果是这样,它就违背了TCP是流协议...

      没有。

      您的案例涉及 IP 数据包到达主机。 TCP 作为流协议是关于将数据传递到应用程序中。

      IP 层以正确的顺序重新组装数据包片段,并通过 TCP 以正确的顺序将数据包重新组装成段,并将现在正确排序的数据流传递给应用程序。

      【讨论】:

        猜你喜欢
        • 2017-04-19
        • 2011-02-16
        • 2014-04-09
        • 2010-10-02
        • 2013-12-08
        • 1970-01-01
        • 2023-03-15
        • 2016-04-19
        • 2015-02-05
        相关资源
        最近更新 更多