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