【发布时间】:2011-02-09 23:49:11
【问题描述】:
这更像是一个理论问题,而不是我遇到的实际问题。
如果我理解正确的话,数据包的 TCP 标头中的序列号是整个流中数据包中第一个字节的索引,对吗?如果是这样的话,既然序列号是一个无符号的 32 位整数,那么在传输超过 FFFFFFFF = 4294967295 个字节之后会发生什么?序列号会回绕,还是发送方会发送一个 SYN 数据包在 0 处重新开始?
【问题讨论】:
标签: tcp
这更像是一个理论问题,而不是我遇到的实际问题。
如果我理解正确的话,数据包的 TCP 标头中的序列号是整个流中数据包中第一个字节的索引,对吗?如果是这样的话,既然序列号是一个无符号的 32 位整数,那么在传输超过 FFFFFFFF = 4294967295 个字节之后会发生什么?序列号会回绕,还是发送方会发送一个 SYN 数据包在 0 处重新开始?
【问题讨论】:
标签: tcp
它包装。 RFC 793:
必须记住,实际的序列号空间是有限的,尽管非常大。这个空间的范围从 0 到 2**32 - 1。由于空间是有限的,所有处理序列号的算术都必须以 2**32 为模执行。这种无符号算术保留了序列号的关系,因为它们再次从 2**32 - 1 循环到 0。计算机模算术有一些微妙之处,因此在编程这些值的比较时应该非常小心。符号“=
【讨论】:
序列号实际上并不是“整个流中数据包中第一个字节的索引”,因为序列号故意从一个随机值开始(这是为了阻止一种称为TCP Sequence Prediction Attack 的攻击形式)。
不需要SYN,一旦达到限制,序列号就会再次循环回零。
【讨论】: