【问题标题】:TCP sequence number questionTCP序列号问题
【发布时间】:2011-02-09 23:49:11
【问题描述】:

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

如果我理解正确的话,数据包的 TCP 标头中的序列号是整个流中数据包中第一个字节的索引,对吗?如果是这样的话,既然序列号是一个无符号的 32 位整数,那么在传输超过 FFFFFFFF = 4294967295 个字节之后会发生什么?序列号会回绕,还是发送方会发送一个 SYN 数据包在 0 处重新开始?

【问题讨论】:

    标签: tcp


    【解决方案1】:

    序列号循环回0。Source:

    TCP序列号和接收 windows 的行为非常像时钟。 接收窗口每次移动 接收方接收并确认 一个新的数据段。一旦运行 出序列号,序列 number 循环回 0。

    另见RFC 1323的第4章。

    【讨论】:

      【解决方案2】:

      它包装。 RFC 793:

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

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

      【讨论】:

        【解决方案3】:

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

        不需要SYN,一旦达到限制,序列号就会再次循环回零。

        【讨论】:

        • 感谢指正。不知道序列号以随机值开始。我现在明白 Wireshark 说“相对数字”是什么意思了。
        • 尚不清楚初始序列号是否能有效缓解此类攻击。 TCP/IP 的设计者将“初始序列号”指定为由时钟播种的值,以防止在创建新连接时可能出现混淆在网络中。请参阅ietf.org/rfc/rfc793.txt中的“初始序列号选择”
        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2013-03-20
        • 2017-08-21
        相关资源
        最近更新 更多