这是一个理论问题,而不是我遇到的实际问题。
如果我理解正确,数据包的TCP头中的序列号是整个数据包中第一个字节的索引,对吗?如果是这种情况,由于序列号是无符号的32位整数,那么超过FFFFFFFF = 4294967295字节后会发生什么?序列号是否会回绕,或者发送方是否会发送SYN数据包以重新启动0?
答案 0 :(得分:30)
序列号循环回0. Source:
TCP序列号和接收 窗户的表现非常像时钟。 接收窗口每次都会移动 接收器接收并确认 一个新的数据段。一旦运行 序列号不按顺序排列 数字循环回到0。
另见RFC 1323第4章。
答案 1 :(得分:19)
它包装。 RFC 793:
必须记住,实际的序列号空间是有限的,尽管非常大。此空间的范围为0到2 ** 32 - 1.由于空间是有限的,所有处理序列号的算术必须以2 ** 32为模进行。这个无符号算术保留了序列号的关系,因为它们再次从2 ** 32 - 1循环到0。计算机模运算有一些细微之处,因此在对这些值的比较进行编程时应该非常小心。符号“=<”表示“小于或等于”(模2 ** 32)。
答案 2 :(得分:13)
序列号实际上并不是“整个流中数据包中第一个字节的索引”,因为序列号故意以随机值开始(这是为了阻止一种称为TCP Sequence Prediction Attack的攻击形式)。
不需要SYN,序列号一旦达到极限就会再次循环回零。