代码之家  ›  专栏  ›  技术社区  ›  xian

TCP:如何生成seq/ack编号?

  •  15
  • xian  · 技术社区  · 15 年前

    我目前正在研究一个程序,它嗅探发送和接收到的TCP包和从一个特定的地址。我试图完成的是用定制的包来回复某些接收到的包。我已经完成了解析。我已经可以生成有效的以太网、IP和——在大多数情况下——TCP包。

    唯一我无法理解的是如何确定seq/ack编号。

    虽然这可能是不相关的问题,该程序是用C++编写的使用WiPCAP。我在询问任何可能对我有帮助的提示、文章或其他资源。

    8 回复  |  直到 15 年前
        1
  •  23
  •   DGentry    15 年前

    当建立TCP连接时,每侧生成一个随机数作为其初始序列号。这是一个强随机数:如果Internet上的任何人都能猜到序列号,就会出现安全问题,因为他们很容易伪造数据包来注入TCP流。

    此后,对于传输的每个字节,序列号将增加1。ACK字段是从另一侧发送回确认接收的序列号。

    RFC793(最初的TCP协议规范)将有很大帮助。

        2
  •  5
  •   Jonathan Leffler vy32    12 年前

    我还有同样的工作要做。 首先,将随机生成初始序列(0-4294967297)。 然后,接收器将计算它接收到的数据的长度,并发送ACK seq# + length = x 寄往寄件人。然后序列将是x,发送方将发送数据。同样地,接收器将计算长度 x + length = y 并将确认发送为 y 等等…它是如何生成seq/ack的…

    如果你想展示它,试着在wireshark中嗅探一个包,然后跟踪TCP流并查看场景…

        3
  •  4
  •   Mark Brackett Achilles Ram Nakirekanti    15 年前

    如果我正确理解你的话-你想装一个 TCP SEQ prediction attack . 如果是这样的话,你会想研究一下你的目标操作系统的细节 Initial Sequence Number 发电机。

    在相当多的 all the major OS's 他们的发电机是可预测的。我没有密切关注这一影响,但我的理解是,大多数供应商都将补丁发布到 randomize their ISN increments .

        4
  •  2
  •   Milan    15 年前

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

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

        5
  •  1
  •   John Ellinwood    15 年前

    RFC 793 第3.3节包括序列号。上次我在那个级别编写代码时,我认为我们只是为持久化的序列号保留了一个向上计数器。

        6
  •  1
  •   tvanfosson    15 年前

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

    Reference

    序列号(32位)有一个双 角色如果设置了syn标志,则此 是初始序列号。这个 实际第一个的序列号 数据字节就是这个序列 号码加1。如果syn标志不是 设置,则这是序列号 第一个数据字节的

    确认 如果ACK标志为 设置此字段的值为 下一个预期字节 应为接收器。

        7
  •  1
  •   Kazimieras Aliulis    15 年前

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

        8
  •  0
  •   sipsorcery    15 年前

    建立连接后序列号将递增。新连接的初始序列号是随机选择的,但许多操作系统都有一些半随机算法。RFC是了解更多信息的最佳场所 TCP RFC .