繁体   English   中英

TCP数据包分片中的数据包顺序

[英]packet order in TCP packet fragmentation

在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如何使无序数据包恢复其原始顺序?

可以通过网络接收该序列,但是TCP实现将在您的应用程序中隐藏该细节,并且仅以流顺序将数据提供给您。 (实际上,由于分段发生在IP层,因此直到第二部分也到达TCP层时才显示)

即使在这样的情况下,即使在接收到数据包之后也必须将其保存在缓冲区中,这就是为什么您会看到人们将UDP称为低延迟应用程序更好的原因:您可以使用UDP乱序接收数据报,而这取决于您的应用程序以弄清楚如何处理这种可能性。

第三种情况是可能的。

当然是。

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

不,不是。

您的案例涉及IP数据包到达主机。 TCP是一种流协议,它涉及将数据传送到应用程序中。

IP层以正确的顺序将数据包片段重组,而TCP则以正确的顺序将数据包重组为段,然后将正确排序的数据流传递给应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM