【发布时间】:2017-03-05 08:26:46
【问题描述】:
在 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如何将乱序的数据包恢复到原来的顺序?
【问题讨论】:
标签: networking tcp