TCP序列号问题

33

这更像是一个理论问题而不是我实际遇到的问题。

如果我理解正确,在TCP头部中的序列号是数据包中第一个字节在整个流中的索引,对吗?如果是这样,由于序列号是无符号32位整数,那么在传输了超过FFFFFFFF = 4294967295个字节后会发生什么呢?序列号会绕回来吗?还是发送方会发送一个SYN数据包以从0开始重新启动?

3个回答

35
序列号会循环回到0。来源

alt text

TCP序列号和接收窗口的行为很像时钟。每次接收方接收并确认新的数据段时,接收窗口都会移动。一旦它用完了所有的序列号,序列号就会回到0。
另请参阅RFC 1323的第4章。

24

它会“环绕”。RFC 793:

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

阅读更多:http://www.faqs.org/rfcs/rfc793.html#ixzz0lcD37K7J


15

序列号实际上并不是“整个数据包流中第一个字节的索引”,因为序列号故意从随机值开始(这是为了防止一种称为TCP Sequence Prediction Attack的攻击形式)。

不需要SYN,一旦序列号达到限制,它就会简单地回到零。


感谢您的纠正。我不知道序列号从随机值开始。现在我明白Wireshark所说的“相对编号”的含义了。 - Meta
1
初始序列号是否能有效地缓解此类攻击并不清楚。TCP/IP的设计者指定“初始序列号”作为一个由时钟种子生成的值,以防止在网络中仍有数据包传输的情况下,新连接与先前具有相同源/目标的连接发生混淆。请参见http://www.ietf.org/rfc/rfc793.txt中的“初始序列号选择”。 - EricLaw

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