TCP数据包编号如何使重传更容易?

时间:2015-08-15 08:29:35

标签: python networking tcp

在一本关于Python网络编程的着名书中(没有提到将该问题视为该书的广告的标题),解释TCP,作者写道:

  

TCP不使用顺序整数(1,2,3 ...)来对数据包进行排序,而是使用计数器   计算传输的字节数。一个1,024字节的数据包,序列号为7,200,   例如,后面会跟一个序列号为8,224的数据包。这意味着   繁忙的网络堆栈不必记住它如何将数据流分解为数据包。   如果要求重传,它可以通过其他方式将流分解为新的数据包   (如果现在有更多字节在等待传输,它可能会让更多数据进入数据包),   并且接收器仍然可以将数据包重新组合在一起。

这种编号模式(计算数据包中的字节数而不是每个序列数据包加1)会使发送方更容易重新发送数据包吗?

1 个答案:

答案 0 :(得分:3)

它使得它变得更容易,因为本质上每个字节都以这种方式编号,让您生成新的序列ID,而不必担心已经使用了更高序列ID。

假设前8,224个字节的传输成功,但接下来的2个数据包需要重新发送。此外,最后2个数据包不是最佳大小,它们可能是2048字节长,1024字节是更好的数据包大小(可能是路由被切换,或其他原因)。

如果数据包按顺序编号,则无法分解这两个数据包,因为以后已经收到的数据包已经使用了系列中的下一个数字。这两个数据包可能编号为10和11,你将它们分解并使用12和13,因为这些数据已经在这一系列数据包中被采用。

但是如果您使用8224和10272,现在您可以分解数据包并发送序列号8224,9248,10272和11296,而不会破坏整个序列的顺序。