TCP 头字段详解
🔗 TCP 头 20 字节逐字段,r0capture 写 pcap 时构造。
头格式
struct.pack('>HHLLBBHHH', ...)(大端,20 字节):
| 偏移 | 字段 | 字节 | r0capture 值 |
|---|---|---|---|
| 0 | src port | 2 | message.src_port |
| 2 | dst port | 2 | message.dst_port |
| 4 | seq | 4 | 递增假序号 |
| 8 | ack | 4 | 0 |
| 12 | data offset(4)+reserved(3)+flags(9) | 2 | 0x5018 |
| 14 | window | 2 | 65535 |
| 16 | checksum | 2 | 0 |
| 18 | urgent pointer | 2 | 0 |
data offset + flags
0x5018:
- 高 4 位
5= TCP 头长 5×4=20 字节 - flags
0x18=PSH(0x08) + ACK(0x10)
flags 含义
| flag | 值 | r0capture 用 |
|---|---|---|
| FIN | 0x01 | 否 |
| SYN | 0x02 | 否 |
| RST | 0x04 | 否 |
| PSH | 0x08 | 是 |
| ACK | 0x10 | 是 |
| URG | 0x20 | 否 |
r0capture 每包都标 PSH+ACK,因为只造"携带数据的已建立连接"包,不模拟握手。
seq
r0capture 维护递增计数器,每包按载荷长度累加,模拟数据流序号。不是真实 TCP seq(真实 seq 是随机初始值+字节偏移)。
window
填 65535(最大窗口),Wireshark 不会因窗口小而警告。
checksum
填 0,不校验。Wireshark 显示 bad checksum 警告,不影响明文。
port
src_port/dst_port 是真实的(从 socket 取),这是 pcap 能正确显示连接归属的关键。