TCP数据包头的序列号是否会回绕?


16

我想知道,由于TCP头字段中的序列号是在握手期间随机选择的,并且随着数据包交换而逐渐增加,所以2 ^ 32-initial_seq_no传输后会发生什么?序列号是否会重新缠绕并变为0,还是会重用初始值(还是从上一个停止的位置开始初始化新连接)?

Answers:


19

它回绕到0。根据RFC 793

重要的是要记住,实际的序列号空间是有限的,尽管非常大。该空间的范围是0到2 ** 32-1。由于该空间是有限的,因此所有处理序列号的算法都必须以2 ** 32为模。当序列号从2 ** 32-1再次循环到0时,此无符号算法保留了序列号的关系。计算机模运算有一些微妙之处,因此在编程比较这些值时应格外小心。符号“ = <”表示“小于或等于”(模2 ** 32)。


3
每个数字小于或等于每个其他数字,取模2 ** 32 ...
user253751

2
@ user20574这就是为什么不允许TCP窗口大小增加到大于1GB的原因,并且序列号比较需要采取最短的方法(即,差值必须在-2 ^ 31到2 ^ 31之间)。
kasperd 2015年

17

序列号会回绕并变为0吗?

是。所有详细信息都可以在TCP规范RFC 793-传输控制协议中找到


序列号

重要的是要记住,实际的序列号空间是有限的,尽管非常大。该空间的范围是0到2 32-1

由于空间是有限的,因此所有处理序列号的算法都必须以2 32为模。当序列号从2 32-1再次循环到0时,这种无符号算法保留了序列号的关系。

计算机模运算有一些微妙之处,因此在编程比较这些值时应格外小心。符号“ = <”表示“小于或等于”(模2 32)。

RFC 793-传输控制协议


1
我不是要开枪,而是“小于或等于(模N)”?显然,RFC作者错过了“计算机模块算法的精妙之处”。
Ben Voigt

在最大窗口小于2 ^ 31的情况下,如果xy被键入,uint32_t则定义x<=y为mean是可行的(uint32_t)(y-x) < 0x80000000
超级猫

@BenVoigt,您可能会认为他们后来理所当然地使用了RFC tools.ietf.org/html/rfc1982
Carsten S

@Carsten是有用的算法,但不是“算术模N”
Ben Voigt 2015年

1
@BenVoigt,是的,无论如何。顺便说一句,我很清楚Z /(n)组不是有序的,但是我也能够在上下文中解释语句。
卡斯顿10年

7

是的,它确实可以环绕。您可以在WikipediaRFC1323 阅读它,该书显示了如何防止包装的序列号。

让我引用:

TCP时间戳用于称为“保护的序列号保护”或PAWS的算法中(有关详细信息,请参阅RFC 1323)。当接收窗口越过序列号回绕边界时,将使用PAWS。如果数据包可能被重传,它会回答以下问题:“此序号是在前4 GB还是在第二GB?” 时间戳用于打破平局。

和:

PAWS使用与前面描述的RTTM机制相同的TCP时间戳选项,并假定每个接收到的TCP片段(包括数据和ACK片段)都包含一个时间戳SEG.TSval,其值在时间上是单调不变的。基本思想是,如果接收到的段的时间戳SEG.TSval小于最近在此连接上收到的某个时间戳,则该段可以作为旧副本丢弃。

在PAWS和RTTM机制中,“时间戳”都是模块化32位空间中的32位无符号整数。因此,“小于”的定义方式与对TCP序列号的定义方式相同,并且应用了相同的实现技术。如果s和t是时间戳记值,则在0 <(t-s)<2 ** 31时,s <t,以无符号32位算术计算。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.