在一本关于Python网络编程的着名书中(没有提到将该问题视为该书的广告的标题),解释TCP,作者写道:
TCP不使用顺序整数(1,2,3 ...)来对数据包进行排序,而是使用计数器 计算传输的字节数。一个1,024字节的数据包,序列号为7,200, 例如,后面会跟一个序列号为8,224的数据包。这意味着 繁忙的网络堆栈不必记住它如何将数据流分解为数据包。 如果要求重传,它可以通过其他方式将流分解为新的数据包 (如果现在有更多字节在等待传输,它可能会让更多数据进入数据包), 并且接收器仍然可以将数据包重新组合在一起。
这种编号模式(计算数据包中的字节数而不是每个序列数据包加1)会使发送方更容易重新发送数据包吗?
答案 0 :(得分:3)
它使得它变得更容易,因为本质上每个字节都以这种方式编号,让您生成新的序列ID,而不必担心已经使用了更高序列ID。
假设前8,224个字节的传输成功,但接下来的2个数据包需要重新发送。此外,最后2个数据包不是最佳大小,它们可能是2048字节长,1024字节是更好的数据包大小(可能是路由被切换,或其他原因)。
如果数据包按顺序编号,则无法分解这两个数据包,因为以后已经收到的数据包已经使用了系列中的下一个数字。这两个数据包可能编号为10和11,你将它们分解并使用12和13,因为这些数据已经在这一系列数据包中被采用。
但是如果您使用8224和10272,现在您可以分解数据包并发送序列号8224,9248,10272和11296,而不会破坏整个序列的顺序。