在TCP / IP中,我们在发送和接收数据包时有MSS和MTU。
我们的协议位于TCP之上,每个协议都将定义自己的数据包。一个例子是MySQL,它将数据包大小定义为2 ^ 24-1,即大约16M。当足够大的协议数据包进入TCP时,它将根据MSS进行分段。
假设客户端需要将DATA1和DATA2发送到服务器。 DATA2大小大于MSS,DATA2将分段为DATA2_1,DATA2_2。由于数据包将由IP层处理,因此每个数据包到达服务器的时间可能与客户端发送数据包的时间不同。
所以我认为数据包的到达顺序可能如下:
在第一种情况下,服务器在一个tcp数据包中接收DATA1和DATA2_1,然后另一个包含DATA2_2的数据包到达。
在第二种情况下,服务器接收三个数据包中的DATA1,DATA2_1和DATA2_2。
在第三种情况下,服务器首先接收DATA2_2然后接收DATA2_1。
第三种情况可能吗?
如果是,则不遵守TCP是流协议,并且应该对流协议进行排序。即使这不打破流规则,如何处理这种情况?
如果不是,TCP如何使无序数据包进入原始顺序?
答案 0 :(得分:1)
可以通过网络接收该序列,但TCP实现将隐藏应用程序中的详细信息,并仅按流顺序将数据提供给您。 (事实上,由于碎片发生在IP层,它甚至不会显示到TCP层,直到第二部分也到达)
接收到的数据包必须保留在缓冲区中,即使在某些情况下接收它们之后也是如此,这就是为什么你会看到人们将UDP称为更好的低延迟应用程序:你可以通过UDP接收无序的数据报由您的应用程序决定如何处理这种可能性。
答案 1 :(得分:1)
第三种情况是否可能。
是的,当然。
如果是这样,它违反了TCP是流协议......
不,不。
您的案例涉及IP数据包到达主机。作为流协议的TCP是关于将数据传递到应用程序中的。
IP层以正确的顺序重新组装数据包片段,并通过TCP以正确的顺序将数据包重新组合成段,并将现在正确排序的数据流传送到应用程序。