TCP:如何生成seq / ack数字?

时间:2009-03-28 14:54:47

标签: c++ networking tcp winpcap

我目前正在开发一个程序,该程序会嗅探从特定地址发送和接收的TCP数据包。我想要完成的是回复定制的数据包到某些收到的数据包。我已经完成了解析。我已经可以生成有效的以太网,IP和 - 大部分 - TCP数据包。

我唯一无法弄清楚的是如何确定seq / ack数字。

虽然这可能与问题无关,但程序是使用WinPCap用C ++编写的。我要求任何可能对我有帮助的提示,文章或其他资源。

8 个答案:

答案 0 :(得分:23)

建立TCP连接时,每一方都会生成一个随机数作为其初始序列号。这是一个强随机数:如果互联网上的任何人都可以猜测序列号,就会出现安全问题,因为他们可以轻松伪造数据包以注入TCP流。

此后,对于发送的每个字节,序列号将递增1. ACK字段是来自另一侧的序列号,发送回确认接收。

RFC 793(最初的TCP协议规范)会有很大的帮助。

答案 1 :(得分:5)

我有同样的工作要做。 首先,初始seq#将随机生成(0-4294967297)。 然后,接收方将计算它收到的数据的长度,并将seq# + length = x的ACK发送给发送方。然后序列将为x,发送方将发送数据。类似地,接收器将计算长度x + length = y并将ACK发送为y,依此类推......它是如何生成seq / ack的......

如果您想要显示它几乎尝试在Wireshark中嗅探数据包并按照TCP流查看方案......

答案 2 :(得分:4)

如果我理解正确 - 您正在尝试装载TCP SEQ prediction attack。如果是这种情况,您将需要研究目标操作系统的Initial Sequence Number生成器的具体细节。

在他们的ISN生成器可预测的几乎all the major OS's中,已经广泛宣传了漏洞。我没有密切关注这个问题,但我的理解是,大多数供应商都发布了补丁randomize their ISN increments

答案 3 :(得分:2)

似乎其余的答案几乎解释了在哪里可以找到有关ACK的详细和官方信息,即TCP RFC

这是一个更实用,“易于理解”的页面,我在做类似的实现时发现,这也可以帮助TCP Analysis - Section 2: Sequence & Acknowledgement Numbers

答案 4 :(得分:1)

RFC 793第3.3节涵盖了序列号。上次我在那个级别编写代码时,我认为我们只保留了一个持续存在的序列号的单项计数器。

答案 5 :(得分:1)

这些值引用了数据包有效负载起始点相对于连接初始序列号的预期偏移量。

Reference

  

序列号(32位) - 具有双重性   role如果设置了SYN标志,那么这个   是初始序列号。该   实际的第一个序列号   数据字节将是这个序列   数字加1.如果SYN标志不是   设置,然后这是序列号   第一个数据字节

     

确认   number(32位) - 如果ACK标志是   然后设置该字段的值是   下一个预期的字节   接收者期待。

答案 6 :(得分:1)

从两侧随机生成数字,然后按八位字节(字节)发送数量增加。

答案 7 :(得分:0)

建立连接后序列号递增。理想情况下,新连接上的初始序列号是随机选择的,但很多操作系统都有一些半随机算法。 RFC是找到更多TCP RFC的最佳位置。