Skip to content

TCP 序列号 ​

🔢 TCP 用序列号保证字节流顺序。r0capture 造 pcap 包时需自己编一套自洽的 seq/ack。

真实 TCP 的序列号 ​

TCP 是面向字节流的可靠协议,每个字节都有序号:

seq = 本方已发送字节的起始序号
ack = 期望收到对方下一个字节的序号

发送方发数据时填 seq,接收方回 ack=seq+len 表示「已收到,期待下一个」。

r0capture 的模拟 ​

r0capture 抓的是 SSL 明文,造的是「假 TCP 包」,没有真实 TCP 的 seq/ack。但 Wireshark 需要 seq/ack 才能把同一会话的包正确排成流、识别为同一条 TCP stream。所以 r0capture 自己编一套自洽的:

python
if ssl_session_id not in ssl_sessions:
    ssl_sessions[ssl_session_id] = (random.randint(0, 0xFFFFFFFF),
                                    random.randint(0, 0xFFFFFFFF))
client_sent, server_sent = ssl_sessions[ssl_session_id]

if function == "SSL_read":
    seq, ack = (server_sent, client_sent)   # 服务端发
else:
    seq, ack = (client_sent, server_sent)   # 客户端发

# 写包后累加
if function == "SSL_read":
    server_sent += len(data)
else:
    client_sent += len(data)
ssl_sessions[ssl_session_id] = (client_sent, server_sent)

为什么随机起始 ​

真实 TCP 起始 seq 也是随机生成的(防预测攻击)。r0capture 模仿这一点,random.randint(0, 0xFFFFFFFF) 给每条会话一个随机起始 seq,避免不同会话 seq 撞车。

关联会话 ​

ssl_session_id 是字典 key,同一会话的所有包共用一对 client_sent/server_sent,所以同会话的包在 pcap 里能正确排序成一条流。

相关文档 ​

基于 VitePress 构建 · 教学用途