我正在开发一个程序,用于嗅探发送到和从特定地址接收到的TCP数据包。我的目标是对某些已接收到的数据包进行自定义回复。我已经完成了解析工作,已经能生成有效的以太网、IP和大部分TCP数据包。
唯一无法确定的是seq / ack号码是如何确定的。
虽然这与问题可能无关,但该程序使用WinPCap编写的C ++。 我请求任何可以帮助我的提示、文章或其他资源。
我正在开发一个程序,用于嗅探发送到和从特定地址接收到的TCP数据包。我的目标是对某些已接收到的数据包进行自定义回复。我已经完成了解析工作,已经能生成有效的以太网、IP和大部分TCP数据包。
唯一无法确定的是seq / ack号码是如何确定的。
虽然这与问题可能无关,但该程序使用WinPCap编写的C ++。 我请求任何可以帮助我的提示、文章或其他资源。
当建立TCP连接时,每一方都会生成一个随机数作为其初始序列号。这是一个强随机数:如果互联网上的任何人可以猜测序列号,他们就可以轻松地伪造数据包注入到TCP流中,因此会存在安全问题。
此后,对于每个传输的字节,序列号将增加1。ACK字段是从另一方发送回来以确认接收的序列号。
RFC 793是TCP协议规范的原始文档,可以提供很大的帮助。
seq# + length = x
。此时序列号将变成x,发送方将发送数据。类似地,接收者会计算长度x + length = y
,并以y
作为ACK发送,如此循环...这就是序列号/确认号生成的方式...这些值参考了数据包有效载荷的开始相对于连接初始序列号的预期偏移量。
序列号(32位)- 具有双重作用。如果设置了SYN标志,则为初始序列号。实际第一个数据字节的序列号将是此序列号加1。如果未设置SYN标志,则为第一个数据字节的序列号。
确认号(32位)- 如果设置了ACK标志,则此字段的值是接收方期望的下一个字节。
从两端随机生成数字,然后增加发送的八位字节数。