TCP 数据包头的序列号是否会循环?

TCP 数据包头的序列号是否会循环?

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

答案1

它绕到 0。根据RFC 793

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

答案2

序列号是否会回绕并变为 0?

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


序列号

必须记住的是,实际的序列号空间虽然很大,但也是有限的。该空间范围从 0 到 2 32 - 1。

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

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

来源RFC 793 - 传输控制协议

答案3

是的,它确实会环绕。你可以阅读它在维基百科上RFC1323,展示了如何防止序列号被包装。

让我引用一下:

TCP 时间戳用于一种称为“保护序列号回绕”或 PAWS 的算法(有关详细信息,请参阅 RFC 1323)。当接收窗口跨越序列号回绕边界时,将使用 PAWS。在数据包可能被重新传输的情况下,它会回答以下问题:“这个序列号是在前 4 GB 中还是在第二个 4 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 位算法计算。

相关内容