使用tcpdump命令抓取含有有效网络负载的包
man pcap-filter
To select all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for exam‐
ple, SYN and FIN packets and ACK-only packets. (IPv6 is left as an exercise for the reader.)
tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
解释
tcp port 80
:匹配目标 TCP 端口为 80 的数据包(即 HTTP 流量)。ip[2:2]
:获取 IP 头部的总长度字段(2 字节)。ip[0]&0xf
:获取 IP 头部的版本和头部长度字段,并取低 4 位(即头部长度字段)。((ip[0]&0xf)<<2)
:将头部长度字段左移 2 位,转换为字节数。tcp[12]&0xf0
:获取 TCP 头部的数据偏移字段,并取高 4 位。((tcp[12]&0xf0)>>2)
:将数据偏移字段右移 2 位,转换为字节数。(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
:计算 IP 头部长度减去 IP 头部本身长度,再减去 TCP 头部长度,并检查结果是否不等于 0。
目的
这个表达式的目的是匹配那些 IP 头部、TCP 头部和有效负载(payload)之间长度不一致的数据包。具体来说,它检查的是:
- IP 头部的总长度减去 IP 头部本身长度,再减去 TCP 头部长度,是否不等于 0。
- 如果结果不等于 0,这意味着数据包包含一些有效负载数据。