我试图了解如何生成TCP标头的序列号。
在某些地方,我读到它是“数据包中第一个字节的索引”(link here),在某些其他网站上,它是一个随机的32位生成数,然后递增。
我真的不知道哪个是哪个,所以这里有一些问题:
我读过一些像RFC 6528,RFC 793和RFC 1948这样的rfc,但我似乎无法理解实际实现了哪一个。 我读到了关于“标准”的状态,但仍然...... ...
提前谢谢!
答案 0 :(得分:35)
TCP连接的每个端点为其发送的数据包建立起始序列号,并在作为建立连接的一部分发送的SYN数据包中发送此数字。
任何一方都没有要求在选择起始序列号时遵循特定程序。操作系统可以自由使用它喜欢的任何机制,但通常最好选择随机数,因为这样更安全。
从该起点开始,任一端发送的每个数据包都包含两个序列号 - 一个用于指定数据包在流中的位置,一个ACK序列号表示接收的字节数。两个数字都由起始序列号抵消。
在Wikipedia中阅读所有相关信息 - 在该页面中查找“序列号”以获取所有血腥细节。
答案 1 :(得分:2)
在4.4BSD(以及大多数Berkeley派生的实现)中,当系统初始化时,初始发送序列号被初始化为1.这种做法违反了主机要求RFC。 (代码中的注释确认这是错误的。)此变量每半秒增加64,000,并且每9.5小时循环回0。 (这对应于每8微秒递增一次的计数器,而不是每4微秒递增一次。)此外,每次建立连接时,此变量都会增加64,000。
答案 2 :(得分:1)
这是一个介于0和4,294,967,295之间的随机数。但是在wireshark工具中,您可以看到syn为0(因为它使用相对显示),但是您可以通过执行Edit-> Preferences使其显示原始序列号。并取消选中TCP协议首选项下的相对序列号和窗口缩放。下一个序列号将根据接收到的ACK编号(a)递增(变为+ 1)。 ACK根据接收到的有效载荷len(l)增大(变为l +1)。请注意,在SYN / FIN标志有效期间不会发送任何数据/有效负载(在SYN和FIN期间仅使ACK递增1)。