TCP序列号的最大值是多少?

6
我正在尝试捕获数据包并重新组织数据包以获取原始的HTTP请求。我使用IPQUEUE(通过iptables规则)来捕获数据包,但是我发现数据包的顺序不正确。我已经知道在TCP协议中,需要对数据包进行重新排序,因此我正在尝试按照序列号重新排序数据包。根据维基百科的介绍,TCP的序列号是32位数字。那么,当序列号达到最大的32位数字时会发生什么?由于SYN数据包的序列号是随机数,所以我认为这个限制很快就会被达到。如果有人对此有任何建议或有一些有用的链接,请给我留言。
4个回答

7

From RFC-1185

  Avoiding reuse of sequence numbers within the same connection is
  simple in principle: enforce a segment lifetime shorter than the
  time it takes to cycle the sequence space, whose size is
  effectively 2**31.

  If the maximum effective bandwidth at which TCP
  is able to transmit over a particular path is B bytes per second,
  then the following constraint must be satisfied for error-free 
  operation:
      2**31 / B  > MSL (secs)  

简单来说,TCP会处理这个问题。除了这个条件之外,TCP还有时间戳的概念来处理序列号环绕的情况。这是从上述RFC中得出的。

  Timestamps carried from sender to receiver in TCP Echo options can
  also be used to prevent data corruption caused by sequence number
  wrap-around, as this section describes.

具体来说,TCP使用PAWS机制来处理TCP包绕情况。您可以在RFC-1323中找到更多关于PAWS的信息。


0

RFC793第3.3节:

必须记住实际序列号空间是有限的,尽管非常大。该空间范围从0到2*32-1。 由于空间是有限的,所有涉及序列号的算术运算都必须执行模2*32。这种无符号算术保留了序列号的关系,因为它们从2**32-1再次循环到0。计算机模数算术存在一些微妙之处,因此在编程比较此类值时应格外小心。

对序列号进行的任何算术运算都是模2^32的。


0
简单来说,32位无符号数将会循环回绕:
...
0xFFFFFFFE
0xFFFFFFFF
0x00000000
0x00000001
...

如果序列号发生了环绕,我该如何区分正确的序列数据包和重传的数据包? - Wonjae Lee
例如,如果头部序列号从0x00000000开始并循环,最后变成0x00000001,我如何知道具有0x00000001作为序列号的数据包不是重传数据包? - Wonjae Lee
1
一个数据包不会在0xFFFFFFFF(4G)内循环。 - Jonathon Reinhart
那个负评的解释可能会有所帮助,不是吗? - Jonathon Reinhart
要明确一点-这些评论是不正确的。窗口大小与序列号歧义无关;它完全取决于带宽、延迟和MSL。在一个大而快的管道上,重新传输很可能会被误认为是具有相同序列号的新数据包,尤其是在32位数字被环绕后。PAWS使用TCP时间戳来处理这种情况,但如果没有它,你绝对会看到它发生。 - Nick
显示剩余3条评论

0

欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接到的页面中最相关的部分,以防目标页面无法访问。 - cursorrux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接