【问题标题】:Do Application Layer protocols have to use sequence numbers应用层协议是否必须使用序列号
【发布时间】:2013-11-26 22:57:02
【问题描述】:
好的,我知道 TCP 使用序列号来满足片段的排序,但我也认为在 TCP 之上工作的应用程序必须使用序列号来确保处理从应用程序角度来看有意义的数据包以正确的顺序。例如,如果应用程序发送 packet1 和 packet2 (p1,p2) TCP 将为 p1 和 p2 创建片段,并确保这些片段以正确的顺序组装以在另一端创建 p1 和 p2,但它不能保证p1 和 p2 以正确的顺序到达应用层?
那么,我的理解正确吗?
【问题讨论】:
标签:
networking
tcp
packet
【解决方案1】:
不,使用 TCP 时不需要序列号。正如您所说,TCP 已经拥有它们,并且您收到的流(不是数据包!)与您发送的完全相同。您需要以某种方式将其拆分为数据包。之后,您将拥有所有数据包并按正确顺序排列。
在 TCP 流中标记数据包边界的流行方法是将数据包大小作为数据包头,例如
[packet size: 4 bytes][your packet payload][packet size:...
【解决方案2】:
TCP 按照应用层指定的顺序重新排列数据包。您正在考虑的是UDP。 UDP 没有固有的顺序,因为所有数据包都是相互独立的。
使用 TCP,您可以将排序留给此(链接)层。使用 UDP,您必须在应用层管理排序。
这能回答你的问题吗?