抓包入门:配置抓包过滤器、捕获第一个HTTP包、理解数据包结构

说实话,很多初学者一上来就点开Wireshark,看到满屏花花绿绿的包直接懵了。我当年也是这样,第一次抓包时盯着屏幕看了十分钟,完全不知道从哪下手。后来带团队时发现,90%的新人卡就卡在这一步——不是不会装软件,而是不会有目的地抓。

这一章,咱们就解决三个核心问题:怎么只抓你想要的包、怎么抓到第一个HTTP包、抓到之后怎么看懂它。

1. 抓包过滤器:别让垃圾数据淹了你

Wireshark有两种过滤器,很多人搞混。我习惯这么记:抓包过滤器是「进门安检」,不符合条件的包根本进不来;显示过滤器是「事后筛选」,数据已经抓下来了,只是暂时藏起来。

核心原则:抓包过滤器用BPF语法,显示过滤器用Wireshark自己的语法。别混用,否则你会怀疑人生。

1.1 抓包过滤器(Capture Filter)配置

配置位置:Capture → Options → Capture Filter。或者直接在输入框里写。

常用的BPF表达式,我列个表,你直接复制用:

场景 BPF表达式 说明
只抓HTTP tcp port 80 HTTP默认端口80
只抓HTTPS tcp port 443 加密流量,只能看到握手
只抓某个IP host 192.168.1.1 双向流量都抓
排除某个IP not host 10.0.0.5 过滤掉噪声
只抓DNS udp port 53 域名解析查询
组合条件 tcp port 80 and host 192.168.1.1 与逻辑

我的小技巧:在命令行里用tcpdump先试过滤器,确认语法正确再贴到Wireshark里。tcpdump报错信息比Wireshark友好得多。

1.2 显示过滤器(Display Filter)配置

这个更灵活,直接在Wireshark顶部的Filter栏输入就行。语法和BPF完全不同,别搞混。

几个我天天用的:

  • http —— 只看HTTP协议包
  • http.request.method == "GET" —— 只看GET请求
  • ip.addr == 192.168.1.1 —— 只看某个IP
  • tcp.port == 443 —— 只看443端口
  • !arp —— 排除ARP广播(这玩意儿最吵)

我曾经踩过的坑:在抓包过滤器里写了http,结果Wireshark报错。后来才反应过来——抓包过滤器不认识http这个关键字,得写tcp port 80。显示过滤器才认http。

2. 捕获第一个HTTP包

好,理论说完了,咱们动手。我带你走一遍完整流程。

2.1 准备工作

  1. 打开Wireshark,选择正确的网卡(有线选以太网,无线选Wi-Fi)
  2. 在Capture Filter里输入:tcp port 80
  3. 点击Start开始抓包
  4. 打开浏览器,访问一个HTTP网站(比如 http://example.com)
  5. 等页面加载完,回到Wireshark点Stop

嗯,这时候你应该能看到一些包了。如果全是乱七八糟的协议,说明过滤器没生效,检查一下是不是写错了位置。

2.2 找到HTTP请求

在显示过滤器里输入 http,Wireshark会自动过滤出HTTP相关的包。你会看到类似这样的结构:

No.  Time        Source          Destination     Protocol  Info
1    0.000000    192.168.1.100   93.184.216.34   TCP       80 → 80 [SYN] Seq=0
2    0.045000    93.184.216.34   192.168.1.100   TCP       80 → 80 [SYN, ACK] Seq=0 Ack=1
3    0.045100    192.168.1.100   93.184.216.34   TCP       80 → 80 [ACK] Seq=1 Ack=1
4    0.045200    192.168.1.100   93.184.216.34   HTTP      GET / HTTP/1.1
5    0.089000    93.184.216.34   192.168.1.100   TCP       80 → 80 [ACK] Seq=1 Ack=100
6    0.089500    93.184.216.34   192.168.1.100   HTTP      HTTP/1.1 200 OK

看到了吗?前三个包是TCP三次握手,第四个才是真正的HTTP GET请求,第六个是服务器的200响应。

关键点:HTTP是应用层协议,它依赖TCP的可靠传输。所以每次HTTP请求前,必然先有三次握手。这是面试常考题,也是排查问题的起点。

3. 理解数据包结构

双击任意一个HTTP包,Wireshark会展开详细面板。我习惯把面板分成三块看:

  • Packet List(包列表):上面那部分,看概览
  • Packet Details(包详情):中间那部分,看协议层级
  • Packet Bytes(包字节):下面那部分,看原始二进制

咱们重点看中间这块。展开后,你会看到类似这样的层级结构:

Frame 4: 100 bytes on wire (800 bits)
├── Ethernet II, Src: xx:xx:xx:xx:xx:xx, Dst: xx:xx:xx:xx:xx:xx
├── Internet Protocol Version 4, Src: 192.168.1.100, Dst: 93.184.216.34
├── Transmission Control Protocol, Src Port: 54321, Dst Port: 80
└── Hypertext Transfer Protocol
    ├── GET / HTTP/1.1\r\n
    ├── Host: example.com\r\n
    ├── User-Agent: Mozilla/5.0\r\n
    └── [Full request URI: http://example.com/]

这个结构其实就是TCP/IP协议栈的封装过程。数据从应用层往下走,每层加一个头部:

层级 协议 头部内容 长度(典型值)
应用层 HTTP 请求行、头部、正文 可变
传输层 TCP 源端口、目的端口、序列号、确认号 20字节
网络层 IP 源IP、目的IP、TTL、协议类型 20字节
链路层 Ethernet 源MAC、目的MAC、类型 14字节

你想想看,一个HTTP请求从浏览器发出,先被TCP包上端口信息,再被IP包上地址信息,最后被以太网包上MAC地址。到了服务器端,再一层层拆开。这就是封装与解封装,TCP/IP协议栈最核心的机制。

我的习惯:看包的时候,先看IP层确认源和目标对不对,再看TCP层确认端口和序列号,最后看应用层内容。按这个顺序,排查问题最快。

4. 本章知识体系

下面这张图,把咱们这章的核心逻辑串起来了。从配置过滤器开始,到抓到HTTP包,再到理解包结构,每一步都有对应关系。

抓包入门知识体系图 抓包入门核心流程 抓包过滤器 BPF语法,进门安检 显示过滤器 Wireshark语法,事后筛选 捕获HTTP包 tcp port 80 数据包结构(四层封装) 应用层:HTTP请求/响应 传输层:TCP头部(端口、序列号) 网络层:IP头部(源IP、目的IP) 理解要点 封装与解封装 · 三次握手 · 协议层级对应

5. 避坑指南

最后,分享几个我这些年踩过的坑,你遇到了能少走弯路:

  • 抓不到HTTP包? 先确认你访问的是HTTP网站,不是HTTPS。HTTPS的流量是加密的,Wireshark看不到明文内容。
  • 包太多卡死? 抓包前一定先配好过滤器。我曾经在没过滤的情况下抓了5分钟,生成了2GB的文件,电脑直接死机。
  • 过滤器语法报错? 检查括号是否匹配,端口号前面有没有空格。BPF语法对空格敏感。
  • 看不到应用层数据? 检查Wireshark的协议解析是否开启。有时候需要手动启用HTTP解析。

重要提醒:不要在公司网络里随意抓包,尤其是抓别人的流量。抓包工具能看到明文密码、Cookie等敏感信息。我见过有人因为抓包被HR约谈的。只抓自己的流量,或者在自己的实验环境里操作。