30

我试图了解 TCP 标头的序列号是如何生成的。

在某些地方,我读到它是“数据包中第一个字节的索引”(此处链接),在其他一些站点上,它是一个随机生成的 32 位数字,然后递增。

我真的不知道哪个是哪个,所以这里有一些问题:

  • 初始序列号是如何产生的?(如果有,请提供 RFC 编号)
  • 它是如何递增的?
  • 秘钥是怎么产生的?

我阅读了一些 RFC,例如RFC 6528RFC 793RFC 1948,但我似乎无法理解实际实现的是哪一个。

我读到了“std”状态,但仍然......

先感谢您!

4

3 回答 3

40

TCP 连接的每个端点为其发送的数据包建立一个起始序列号,并在它作为建立连接的一部分发送的 SYN 数据包中发送此编号。

在选择起始序列号时,任何一端都不需要遵循特定的程序。操作系统可以自由使用它喜欢的任何机制,但通常最好选择一个随机数,因为这样更安全。

从该起点开始,任一端发送的每个数据包都包含两个序列号 - 一个用于指定数据包在流中的位置,另一个用于表示接收到的字节数的 ACK 序列号。这两个数字都由起始序列号偏移。

当然,请在Wikipedia中阅读所有相关信息- 在该页面中查找“序列号”以获取所有血腥细节。

于 2012-05-04T17:01:18.273 回答
2

在 4.4BSD(和大多数伯克利派生的实现)中,当系统初始化时,初始发送序列号被初始化为 1。这种做法违反了主机要求 RFC。(代码中的注释承认这是错误的。)然后该变量每半秒增加 64,000,并且大约每 9.5 小时循环回到 0。(这对应于每 8 微秒而不是每 4 微秒递增的计数器。)此外,每次建立连接时,此变量都会递增 64,000。

于 2017-04-26T03:53:16.587 回答
0

它是一个介于 0 和 4,294,967,295 之间的随机数。但是在wireshark工具中,你可以看到syn为0(因为它使用相对显示)但是你可以通过编辑->首选项使其显示原始序列号。并在 TCP 协议首选项下取消检查相对序列号和窗口缩放。下一个序列号将根据收到的 ACK 号 (a) 递增(变为 a + 1)。ACK 根据收到的有效载荷 len (l) 增加(变为 l + 1)。请注意,在 SYN/FIN 标志处于活动状态期间不会发送数据/有效负载(在 SYN 和 FIN 期间确实使 ACK 仅增加 1)。

于 2018-11-11T20:01:49.890 回答