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

问题描述 投票:0回答:8

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

我唯一不明白的是 seq / ack 号是如何确定的。

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

c++ networking tcp winpcap
8个回答
29
投票

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

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

RFC 793,原始的 TCP 协议规范,可以提供很大的帮助。


8
投票

我也有同样的工作要做。 首先,初始的 seq# 将随机生成(0-4294967297)。 然后接收方会计算收到的数据长度,并将

seq# + length = x
的ACK发送给发送方。序列将为 x,发送者将发送数据。类似地,接收器将计算长度
x + length = y
并将ACK作为
y
发送,依此类推...这就是seq/ack的生成方式...

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


6
投票

如果我理解正确的话 - 您正在尝试发起TCP SEQ 预测攻击。如果是这种情况,您需要研究目标操作系统的初始序列号生成器的细节。

几乎所有主要操作系统都存在广泛公开的漏洞,其 ISN 生成器是可预测的。我没有密切关注后果,但我的理解是大多数供应商发布了补丁来随机化他们的 ISN 增量


3
投票
TCP RFC

这是我在进行类似实现时发现的一个更实用且“易于理解”的页面,也可能有所帮助

TCP 分析 - 第 2 部分:序列和确认号


1
投票
RFC 793

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


1
投票

参考

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

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


1
投票


0
投票
TCP RFC

© www.soinside.com 2019 - 2024. All rights reserved.