使用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,这意味着数据包包含一些有效负载数据。