【问题标题】:TCP: How are the seq / ack numbers generated?TCP:seq / ack 数字是如何生成的?
【发布时间】:2010-10-16 03:01:36
【问题描述】:

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

我唯一想不通的是 seq / ack 数是如何确定的。

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

【问题讨论】:

  • 标准相关信息的最佳位置通常是原始 RFC(Request for cmets),在本例中为 RFC 2018。总的来说Wikipedia也是个不错的地方看看。否则,您几乎可以保证得到结果here

标签: c++ networking tcp winpcap


【解决方案1】:

建立连接后,序号递增。理想情况下,新连接上的初始序列号是随机选择的,但许多操作系统都有一些半随机算法。 RFC 是了解更多信息的最佳地点TCP RFC

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      Reference

      序列号(32 位)- 有一个对偶 角色 如果设置了 SYN 标志,那么这个 是初始序列号。这 实际第一个序列号 然后数据字节将是这个序列 数字加 1。如果 SYN 标志不是 设置,那么这是序号 第一个数据字节的长度

      致谢 数字(32 位)——如果 ACK 标志是 设置然后这个字段的值是 下一个预期的字节 接收者正在等待。

      【讨论】:

        【解决方案4】:

        数字是从双方随机生成的,然后增加发送的八位字节(字节)数。

        【讨论】:

          【解决方案5】:

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

          此后,每传输一个字节,序列号就会增加 1。ACK 字段是来自另一端的序列号,发送回确认接收。

          RFC 793,原来的TCP协议规范,可以帮上大忙。

          【讨论】:

          • 不是 ack 字段 不是 来自另一边的 seq#,而是 seq# + 接收到的长度(如下 zainee khan 的回答)
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              如果您想实际展示它,请尝试在 Wireshark 中嗅探数据包并跟踪 TCP 流并查看场景...

              【讨论】:

              • 提高答案的清晰度。
              • 你也可以像这样从终端捕获数据包:sudo tcpdump -i eth0
              猜你喜欢
              • 2012-07-02
              • 2017-09-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-22
              • 1970-01-01
              • 2017-02-13
              相关资源
              最近更新 更多