MacOS下基于libpcap获取TCP包信息:tcphdr结构体适配疑问
Linux struct tcphdr 与 macOS struct tcphdr 字段映射说明
Linux 和 macOS 的 TCP 头部结构体定义逻辑不同:Linux 将数据偏移、保留位和所有 TCP 标志位打包在一个 16 位位域中,macOS 则拆分出单独的偏移字段和标志字节,以下是具体字段对应关系:
字段对应表
| Linux 字段名 | macOS 对应方式 | 说明 |
|---|---|---|
source | th_sport | 源端口 |
dest | th_dport | 目的端口 |
seq | th_seq | 序列号 |
ack_seq | th_ack | 确认序列号 |
res1 | th_x2 | 未使用的保留位 |
doff | th_off | TCP 头部数据偏移(单位:32 位字,转字节数需 ×4) |
fin | th_flags & TH_FIN | FIN 标志位,结果非 0 表示置位 |
syn | th_flags & TH_SYN | SYN 标志位,结果非 0 表示置位 |
rst | th_flags & TH_RST | RST 标志位,结果非 0 表示置位 |
psh | th_flags & TH_PUSH | PSH 标志位,结果非 0 表示置位 |
ack | th_flags & TH_ACK | ACK 标志位,结果非 0 表示置位 |
urg | th_flags & TH_URG | URG 标志位,结果非 0 表示置位 |
ece | th_flags & TH_ECE | ECE 标志位,结果非 0 表示置位 |
cwr | th_flags & TH_CWR | CWR 标志位,结果非 0 表示置位 |
window | th_win | 窗口大小 |
check | th_sum | 校验和 |
urg_ptr | th_urp | 紧急指针 |
代码适配示例
比如原来 Linux 中判断 ACK 标志的代码:
if (linux_tcp->ack) { // 处理ACK逻辑 }
在 macOS 中要改为:
if (macos_tcp->th_flags & TH_ACK) { // 处理ACK逻辑 }
再比如获取 TCP 头部长度:
Linux 中:
int tcp_header_len = linux_tcp->doff * 4;
macOS 中:
int tcp_header_len = macos_tcp->th_off * 4;
内容的提问来源于stack exchange,提问作者Makik
相关产品推荐
相关产品推荐

