3. Wireshark UDP 分析:捕获流量、解析头部、识别会话
好了,到了真正动手的环节了。前面我们聊了 UDP 的理论,也搭好了实验环境。现在,我们打开 Wireshark,看看 UDP 在网络上到底长什么样。
我个人习惯,做任何协议分析前,先把 Wireshark 的显示过滤器准备好。别等抓了一大堆乱七八糟的包再去找,那时候头都大了。
3.1 捕获 UDP 流量:从过滤到抓包
打开 Wireshark,选择你正在用的网卡(比如我笔记本上的 Wi-Fi 或者有线网卡),双击开始捕获。这时候屏幕上会疯狂刷屏,对吧?
别慌。我们只需要看 UDP 的流量。在顶部的显示过滤器栏里,输入:
udp
然后按回车。瞬间,世界清净了。Wireshark 只显示 UDP 协议的数据包。
更精准的捕获方法
如果你只想看特定端口的数据,比如 DNS(端口 53)或者 DHCP(端口 67/68),可以这样写:
udp.port == 53
或者同时过滤源和目标端口:
udp.srcport == 1234 && udp.dstport == 5678
udp。这样抓下来的文件小,分析起来快。
嗯,这里要注意。如果你是在生产环境或者高流量服务器上抓包,一定要用捕获过滤器。我曾经有一次没加过滤器,直接在核心交换机上抓了 5 分钟,生成了 2 个 G 的 pcap 文件,打开的时候 Wireshark 直接卡死了。血的教训。
3.2 解剖 UDP 头部:四个字段,一目了然
双击任意一个 UDP 包,在中间的面板里展开 "User Datagram Protocol" 这一行。你会看到什么?
说白了,UDP 头部就四个字段,总共 8 个字节。我带你一个一个看:
| 字段 | 长度(字节) | 作用 | Wireshark 显示示例 |
|---|---|---|---|
| Source Port | 2 | 发送方的端口号(随机高位或固定) | Source Port: 54321 |
| Destination Port | 2 | 接收方的端口号(决定哪个应用收) | Destination Port: 53 |
| Length | 2 | UDP 头部 + 数据的总长度(最小 8) | Length: 32 |
| Checksum | 2 | 校验头部和数据是否损坏(可选) | Checksum: 0xabcd [unverified] |
你想想看,TCP 头部动辄 20 字节起步,还有各种选项。UDP 就这么简洁。这也是为什么它快,但也为什么它不可靠。
关于 Checksum 的坑
Wireshark 经常会在 Checksum 后面显示 [unverified] 或者 [incorrect]。别紧张。很多网卡为了性能,开启了硬件校验和卸载(Checksum Offloading)。数据包在发送时,网卡自己计算并填充校验和,但 Wireshark 抓到的可能是计算前的原始包,所以显示不正确。
3.3 识别 UDP 会话:谁说无连接就不能追踪?
UDP 是无连接的,理论上没有“会话”的概念。但在实际分析中,我们经常需要把一来一回的 UDP 报文归为一组,看它们之间的交互。
Wireshark 提供了一个非常强大的功能——Conversation(会话)。
操作步骤很简单:
- 点击顶部菜单 Statistics(统计)。
- 选择 Conversations(会话)。
- 在弹出的窗口里,点击 UDP 标签页。
你会看到一个表格,里面列出了所有检测到的 UDP “对话”。每一行代表一对 IP 和端口的组合。比如:
| Address A | Port A | Address B | Port B | Packets | Bytes | Duration |
|---|---|---|---|---|---|---|
| 192.168.1.100 | 54321 | 8.8.8.8 | 53 | 2 | 120 | 0.015s |
| 192.168.1.100 | 12345 | 10.0.0.1 | 161 | 150 | 45000 | 30.2s |
看到没?第一行是 DNS 查询,一问一答,2 个包。第二行是 SNMP 监控流量,持续了 30 秒,发了 150 个包。这就是我们识别出来的“会话”。
为什么这很重要?
在分析 UDP 丢包时,你不可能一个一个包去看。通过 Conversations 窗口,你可以快速找到哪些 IP 对之间流量最大、持续时间最长、丢包最严重。然后右键点击某一行,选择 Apply as Filter -> Selected,Wireshark 会自动帮你过滤出这两个端点之间的所有 UDP 流量。
3.4 实战演练:抓一个 DNS 请求看看
光说不练假把式。我们来做个小实验。
- 打开 Wireshark,开始捕获。
- 在命令行或浏览器里,随便访问一个网站,比如
ping baidu.com。 - 停止捕获,在过滤器里输入
udp.port == 53。 - 找到第一个 DNS 请求包,双击展开。
你会看到:
- Source Port: 一个随机的高位端口(比如 54321)。
- Destination Port: 53(DNS 服务器)。
- Length: 比如 32 字节(8 字节头部 + 24 字节 DNS 查询数据)。
- Checksum: 0x... [unverified]。
再看看对应的 DNS 响应包。你会发现源端口和目标端口正好互换。这就是 UDP 的“伪会话”——通过端口对来关联。
我个人习惯,在分析这类交互时,会右键点击请求包,选择 Follow -> UDP Stream。Wireshark 会把这一来一回的 UDP 数据流完整地展示出来,甚至帮你把二进制数据转成 ASCII 文本。对于分析应用层协议(比如 DNS、DHCP、SNMP)非常有用。
3.5 本章知识体系:一张图看懂
为了让你更直观地理解我们刚才讲的内容,我画了一张流程图。它展示了从捕获流量到识别会话的完整路径。
这张图把我们的分析路径串起来了。从捕获开始,到过滤、解剖头部、识别会话,最后深入分析。每一步都有对应的 Wireshark 操作。你以后做 UDP 分析,就按这个流程走,不会乱。
3.6 本章小结
今天我们干了三件事:
- 抓到了 UDP 包,学会了用捕获过滤器和显示过滤器来精准定位。
- 看懂了 UDP 头部,四个字段,8 个字节,简单粗暴。记住了 Checksum 的坑,别被 Offloading 骗了。
- 识别了 UDP 会话,通过 Conversations 窗口快速定位通信双方,再用 Follow Stream 深入查看数据内容。
这些技能,是你后面分析 UDP 丢包的基础。只有知道正常的 UDP 长什么样,才能在它出问题的时候,一眼看出不对劲。