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
我的小技巧: 我经常在抓包前先设置一个捕获过滤器(Capture Filter),而不是显示过滤器。捕获过滤器在网卡驱动层面就把包丢了,性能更好。比如我只抓 UDP 包: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 抓到的可能是计算前的原始包,所以显示不正确。

我曾经踩过的坑: 有一次排查视频卡顿问题,看到 Wireshark 里全是 UDP Checksum 错误的包,我以为是网络传输出了问题。折腾了半天,最后发现是本地网卡的 Checksum Offloading 导致的。在 Wireshark 里关掉 "UDP checksum validation" 的偏好设置,世界就正常了。所以,看到 Checksum 错误,先别急着怀疑网络。

3.3 识别 UDP 会话:谁说无连接就不能追踪?

UDP 是无连接的,理论上没有“会话”的概念。但在实际分析中,我们经常需要把一来一回的 UDP 报文归为一组,看它们之间的交互。

Wireshark 提供了一个非常强大的功能——Conversation(会话)。

操作步骤很简单:

  1. 点击顶部菜单 Statistics(统计)。
  2. 选择 Conversations(会话)。
  3. 在弹出的窗口里,点击 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 流量。

核心思路: 先通过 Conversations 找到“嫌疑犯”,再通过过滤器深入分析具体报文。这是所有网络分析高手的工作流。

3.4 实战演练:抓一个 DNS 请求看看

光说不练假把式。我们来做个小实验。

  1. 打开 Wireshark,开始捕获。
  2. 在命令行或浏览器里,随便访问一个网站,比如 ping baidu.com。
  3. 停止捕获,在过滤器里输入 udp.port == 53。
  4. 找到第一个 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 本章知识体系:一张图看懂

为了让你更直观地理解我们刚才讲的内容,我画了一张流程图。它展示了从捕获流量到识别会话的完整路径。

UDP 分析流程与 Wireshark 操作 1. 捕获 UDP 流量 2. 显示过滤器: udp 3. 解剖 UDP 头部 (4 字段) 4. 识别会话 (Conversations) 5. 深入分析 (Follow Stream) 捕获过滤器 udp udp port 53 减少抓包文件大小 显示过滤器 udp.srcport == 53 udp.dstport == 67 灵活筛选已有数据 头部字段速查 Source Port (2B) Dest Port (2B) Length (2B) Checksum (2B)

这张图把我们的分析路径串起来了。从捕获开始,到过滤、解剖头部、识别会话,最后深入分析。每一步都有对应的 Wireshark 操作。你以后做 UDP 分析,就按这个流程走,不会乱。

3.6 本章小结

今天我们干了三件事:

  • 抓到了 UDP 包,学会了用捕获过滤器和显示过滤器来精准定位。
  • 看懂了 UDP 头部,四个字段,8 个字节,简单粗暴。记住了 Checksum 的坑,别被 Offloading 骗了。
  • 识别了 UDP 会话,通过 Conversations 窗口快速定位通信双方,再用 Follow Stream 深入查看数据内容。

这些技能,是你后面分析 UDP 丢包的基础。只有知道正常的 UDP 长什么样,才能在它出问题的时候,一眼看出不对劲。