尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wireshark显示列怎么加?自定义字段与字段表达式实战指南

Wireshark显示列怎么加?自定义字段与字段表达式实战指南 直接说结论Wireshark里那些默认显示列基本就是够用而已。我之前带新人排查一个HTTP慢请求问题他们盯着默认的Source Destination Protocol Length Info看了半天最后还是得点进每个包里翻字段。问题就出在默认这五列根本没有暴露关键信息——想看HTTP状态码默认列不给你想看TCP序号默认列也不给你想看ICMP的identifier照样不给你。这就是为什么“加减显示列”是每个用Wireshark干活的人绕不开的基本功。这篇我讲讲怎么给Wireshark的包列表表格加列、删列、调顺序以及用自定义字段表达式把藏在报文里的核心参数直接顶到表格上让你不用点开每一个数据包就能把情况看个七八成。适合做网络运维、开发调试、协议分析、搞安全取证的朋友参考。1. 为什么你要动“显示列”——从默认列说起1.1 默认显示列“没脾气”日常排查痛点一堆先看一眼 Wireshark 打开抓包文件后的默认界面包列表区域从上到下是一行一行的数据包每一行就是一列列字段组成的记录。默认那几列是No.编号、Time时间、Source源地址、Destination目的地址、Protocol协议、Length长度、Info概要信息。这套默认布局看个大概没问题但你要真做排查痛点马上来分析 HTTP 性能想批量看每个请求的响应状态码默认列没有你得挨个点包展开Hypertext Transfer Protocol树才能看到HTTP/1.1 200 OK或者404 Not Found。抓了 ICMP想看 ping 的序号和id点包展开Internet Control Message Protocol才能看到Identifier和Sequence Number。几十个包这样点下去手就废了。想看 TCP 连接里的 Sequence Number、Acknowledgment Number判断有没有重传、乱序默认列也不给。你要么在 Info 栏里看零碎的 Seq/Ack 信息要么点开每个包。想对比 VLAN ID 分布默认列里连 VLAN 信息都不显示你得在过滤栏手动输入vlan.id过滤但过滤之后仍看不到ID 数值在表格上的分布。我用了这么多年 Wireshark最直观的感受就是显示列就是你的仪表盘。仪表盘上缺了转速表你再懂引擎也没用只能低头翻手机看OBD诊断。1.2 加减显示列的两种理解方式“加减显示列”这句话说起来简单实际操作里面其实包含两种完全不同的诉求加减默认列就是显示No.、Time、Source、Destination这些 Wireshark 已经定义好的标准列。这类操作只是勾选与取消勾选不做任何表达式配置。加减自定义字段列在表格里加一列这列的值不是标准的Source或Protocol而是报文里某个具体字段比如tcp.seq、http.response.code、icmp.seq、vlan.id。这种情况下你需要用 Wireshark 的字段表达式语法来写。这两种操作路径不一样但入口和界面是同一个地方我先讲统一的入口再讲各自的差异。1.3 先分清显示列和显示过滤器是两个东西新手最容易犯的错是把“显示列”和“显示过滤器”混为一谈。显示过滤器Display Filter在上方过滤栏输入比如icmp、http.response.code 200作用是从抓包结果里筛出符合条件的包。它不改变表格列结构。显示列Display Columns是包列表上方的标题栏比如Time、Source、Info。它决定表格每一行展示哪些字段不影响能看到哪些包。打个比方显示过滤器是筛子负责挑出哪些花生显示列是盘子上的格子负责把它们摆成一行一行。加减显示列的目的是让筛出来的花生看得更清楚而不是筛出更多花生。2. 加减显示列的核心操作图形界面就够用2.1 最快加法右键菜单走天下我平时用的最快操作是在包列表里任意一个数据包的某个协议字段比如 TCP 层里的 Sequence Number上右键不点最下面的Apply as Column而是找Apply as Column这一项直接点。具体过程是这样的展开某个 TCP 包双击展开Transmission Control Protocol那棵树。找到你要显示的字段比如Sequence Number。右键该字段在弹出的菜单里选择Apply as Column。表格最右边立刻多出一个新列值就是每个包该字段的数值。这个操作本质上做了两步一是自动生成一列二是自动填好了该字段的表达式名称。所以根本不用你手动去记字段叫什么所见即所得。同样的操作可以连续加好几列比如我抓 HTTP 包时依次对HTTP Request Method、HTTP Response Code、HTTP Host执行Apply as Column三列就一次性进表格了。2.2 精准减法首选项里的“删”与“隐藏”减列的时候有两种思路一个是彻底删掉一个是暂时隐藏。区别在于是否保留列的配置信息。彻底删除菜单栏打开Edit-PreferencesWindows/Linux或Wireshark-PreferencesmacOS。左侧找到Appearance-Columns有的版本是User Interface-Columns。在中间区域能看到一列列表格定义No.、Time、Source、Destination、Protocol、Length、Info以及你新加的自定义列。选中要删的列点击左下角的Delete减号图标按钮列就消失了。暂时隐藏在同一对话框里如果你不想让某列出现在表格上但还想保留它的定义可以把该列的Fields那一列内容前面的勾去掉。关闭偏好设置后表格里这列就不显示了哪天想恢复回来重新勾上就行。我用隐藏而不是删的一个重要场景临时想让表格清爽一点但之后分析可能还要用。隐藏比删除稳妥因为Fields里的表达式字符串是手工填的一旦删掉重来还得再找一次字段名。2.3 调序、改名、对齐让表格说人话在Columns设置界面里列的排列顺序就是实际的左右顺序。选中一列点左下角的Up或Down按钮可以让它左移右移。我处理长表时通常这样安排顺序时间列放第一位然后把核心分析字段放第二、第三最后放 Info。比方分析 HTTP 时我的表格顺序是Time、Info、HTTP Method、HTTP Status、Source、Destination——核心信息排前边辅助信息排后边看着省力。另外每个列都可以改标题名双击Title那一栏的文字直接改就行。你说http.response.code这样一串表达式当列标题谁看了都头疼改成Status Code或者状态码表格立刻就“说人话”了。我习惯尽量用英文短标题中文标题在某些字符界面下显示宽度偏大反而挤占横向空间。对齐方式也有讲究数值列建议右对齐Right地址列建议左对齐Left这样视觉上更好扫描。在Columns设置里默认虽然也能选但我个人很少调整因为意义不大真正影响阅读习惯的是列顺序和列标题。3. 自定义字段列显示列的进阶玩法3.1 为什么默认字段不够用右键Apply as Column解决的是“看到什么字段就用什么字段”的场景。但有时候我要加的一列不是标准字段树里的某个字段而是一个计算表达式比如想显示 TCP 重传标记字段本身是tcp.analysis.retransmission它是个布尔值右键能加到列里但值显示为True或False。想显示时间差Delta time两个包之间间隔的秒数这种字段需要从“相对时间”选项里找。想显示数据包长度的十六进制表示就需要自定义公式。这种情况下用图形界面Apply as Column是搞不定的。你需要手动添加一个自定义列然后在表达式里写 Wireshark 的字段名。3.2 Display Filter 表达式写列一行搞定在Preferences-Appearance-Columns界面里点击左下角的号Add新增一行空白列。在Title里写列显示标题比如ICMP ID。在Type下拉框里选Field旧版本叫Custom。在Fields框里填表达式icmp.identifier。保存后表格里就会出现一列每个 ICMP 包显示对应包里的 ICMP Identifier 值如果不是 ICMP 包这列会显示为空不会报错。这里最关键的一步是第三步。很多人刚开始自己加列只看标题栏填了字Type 忘记改成Field结果表格里只会显示一堆字段名而不是字段值。我之前带新人时他们填了http.response.code这个字段但 Type 还停留在Number然后表格里每一行都显示文字http.response.code他们还以为自己操作错了。实际上Type 必须是FieldFields 里写的是字段表达式Title 里写的是你想要的列名三样东西各司其职。3.3 常用字段表达式速查表我自己常用的字段表达式整理如下建议直接收藏场景字段表达式说明ICMP 序号icmp.seqICMP Sequence Numberping 包计数ICMP 标识符icmp.identifier区分不同 ping 进程ICMP 类型icmp.type0请求回复8请求3不可达TCP 序列号tcp.seq数据流序号TCP 确认号tcp.ack确认序号TCP 窗口大小tcp.window_size_value接收方窗口TCP 重传标记tcp.analysis.retransmission布尔值是否重传HTTP 请求方法http.request.methodGET、POST、PUT 等HTTP 响应码http.response.code200、301、404 等HTTP 请求 URIhttp.request.uri请求的 URL 路径HTTP Hosthttp.host请求的主机头VLAN 编号vlan.idVLAN ID 数值IPv4 TTLip.ttl生存时间IPv4 协议ip.proto上层协议号包长度frame.len整帧长度这几个字段是我排查问题时的“万金油组合”。遇到 HTTP 慢我加http.request.method、http.request.uri、http.response.code三列遇到 TCP 重传我加tcp.seq、tcp.analysis.retransmission遇到 VLAN 异常我加vlan.id。4. 实战案例抓包分析中的显示列配置4.1 案例一ICMP ping 排查把序号、ID、时长放进一屏很多人以为抓 ICMP 就是看看有没有回包其实排查丢包率和延时波动时最好把 ICMP 的关键字段直接显示到列上。我的标准操作网卡开始捕获后在显示过滤器里输入icmp把无关流量过滤掉。打开Preferences-Columns依次添加icmp.seq标题写Seqicmp.identifier标题写IDframe.time_delta_displayed标题写Delta用来显示相邻包的时间差如果发现延迟高再加一列ip.ttl看是否经过不同路径。加完这几列后ping 包序列、标识、间隔时间全部铺在表格上。如果你在排查“某个 IP 间歇性无响应”会发现某些 Seq 缺失或 Delta 突然拉大不用进包体就能定位。这里一个小坑icmp.seq和icmp.identifier是两个独立的字段很多同学分不清。identifier是同一时刻 ping 进程的标识多组 ping 一起发的时候靠它区分seq是同一组内的序列号从0开始递增。如果你同时 ping 两个不同的目的地identifier 不同seq 各自从0开始。列出来对比能立刻发现是不是两个 ping 进程互相干扰。4.2 案例二HTTP 分析状态码、方法、URL 横向对比排查接口调用问题的时候我的表格配置是固定的http.request.method显示每个请求的 GET/POST/PUT。http.request.uri显示请求路径。http.response.code显示响应状态码。http.host显示域名。Source显示客户端 IP。Destination显示服务器 IP。配置好之后只要一屏扫过去就能看出来这种规律某个 IP 连续发 3 次 POST响应码一直是 500另一个 IP 的请求 URI 里带了同样的错误参数状态码却是 200。这些信息如果全部依赖点开包体去翻一条完整请求链路至少要看 5 个包眼睛会花。需要注意http.request.uri和一列http.request.full_uri的差异前者是路径部分比如/api/login后者是完整 URL包含协议、域名、路径、查询参数。如果你在排查带 query string 的接口建议用http.request.full_uri。还有一个小技巧如果只想看某次业务请求的响应状态码取消勾选其他请求类型的http.request.method列的显示或者过滤里写http.response.code这样状态码列只会填充响应包请求包不会混进来。4.3 案例三VLAN 与中文乱码两个高频场景的列配置再讲一个实际工作中很常见但是经常被忽略的VLAN 标签显示。抓交换机镜像口流量的时候默认表格里不会明显标注这个包属于哪个 VLAN。如果下游交换机做了 trunk同一段抓包里混合了多个 VLAN 的流量你必须在过滤栏里输vlan.id 10才能筛出 VLAN 10或者直接把vlan.id加成一列。我推荐直接把vlan.id加成一列配合Source、Destination列就可以在表格上直接看出哪些 VLAN 在和哪些地址通信。有时候问题表现是“某个 VLAN 的终端全部超时”但 Wireshark 里看流量却能收到包这种场景下列出 VLAN 编号马上能定位到是不是交换机的 vlan 划分和终端的 PVID 配置对不上。另一个高频场景是中文乱码。很多应用抓包时HTTP 请求里的中文参数在包列表里显示成....或者乱码字符串。这个问题一般不是 Wireshark 显示列的锅而是抓包时字符编码层次的问题。你可以在列上新增一列http.request.full_uri在 URL 里能看到百分号编码的中文参数从中能推断出原本的字符。如果想要更友好的显示需要借助 Wireshark 的Decode As功能选择 UTF-8 等字符集。但这里有个更隐蔽的问题包列表里的中文乱码其实大多来自字节序和编码格式不匹配。单纯加显示列不能“解密”你需要先确定数据的编码格式是 UTF-8 还是 GBK然后到View-Internals里查看 Wireshark 的字符编码设置。我试过在列里看中文参数填http.request.uri显示结果依然是%E4%B8%AD%E6%96%87这种编码而不是“中文”两个字。所以我的建议是中文乱码不要指望显示列能解决列只是让编码统一展示出来真正转换要借助工具看十六进制。5. 我踩过的坑显示列使用的常见问题与排查技巧5.1 字段名写错是最大的坑有一次我需要增加一个 TLS 版本列直接在 Fields 里输tls.version结果表格里全是空值只有个别包有值。查了半天发现Wireshark 的 TLS 版本字段名是tls.handshake.version只有在握手包里才有这个字段而tls.version是 Wireshark 计算出的逻辑字段不是所有包都有。这类字段名你不去Field Reference里确认光靠记性很容易写错。怎么避免两个办法在下拉框Fields里输入字段名时Wireshark 会自动补全。你输入tls.它会拉出所有tls.前缀的字段鼠标点选即可。打开View-Internals-Supported Protocols在协议列表里找到对应协议展开后能看到所有字段名和说明。也可以用左侧过滤器直接搜比如输入http.response会列出所有包含http.response的字段。我甚至建议你把常用的字段表达式复制到记事本里存档。因为有些表达式长了以后特别容易记混比如tcp.analysis.out-of-order和tcp.analysis.retransmission中间有没有连字符冒号后面是下划线还是点这些细节错一个字符就是空值。5.2 列太多又卡又乱保存配置与恢复默认列加多了表格横向滚动条会变得非常长尤其在默认窗口大小下能显示的有效列不到三分之一。这时候很多人的第一反应是删列但我不建议急着删尤其是分析中途。更好的做法是在Preferences-Columns界面里把当前配置导出一个文件备份。也可以把整个配置 profile 切到一个新名字在这个新 profile 里重新配一套清爽的列旧 profile 里留着完整配置。具体路径Edit-Configuration Profiles点新建一个 profile比如叫analysis_http然后在这个 profile 下配列。切换 profile 时表格布局会一并切换。这样你既能保留原来的大列组合也能按需切换轻量视图。我的实测经验当抓包文件有几十万帧且表格里同时显示了 15 列以上的时候Wireshark 的渲染会明显变卡每次滚动都在重新计算字段值。这时最好的办法不是加列而是先搞清楚目前真正关注的字段只有 4~5 个切换 profile 后只保留它们手感立刻恢复。5.3 时间列的格式细节有些场景下看相对时间比看绝对时间更直观。比如分析会话延时你会关心“这个请求发出后多少毫秒收到了响应”而不是“下午 3 点 15 分 22.3 秒发出去的”。默认的 Time 列显示的是自抓包开始的相对时间格式是秒.微秒。如果你想要毫秒精度以上的时间差我建议再加一列frame.time_delta_displayed它显示当前包与上一显示包之间的时间差。注意它算的是“显示包”之间的差如果你过滤了某些包时间差会基于过滤后相邻的包来算不是原始抓包顺序的相邻包。想算原始顺序的差用frame.time_delta。我在排查 Web 服务响应慢时经常长这样处理过滤出 HTTP 请求和响应包然后在表格里加一列frame.time_delta_displayed这样每一对请求/响应的时间间隔直接出现在同一行视野中不用像看雷达图一样手算时间戳的减法。最后分享两个加分小习惯根据我个人经验显示列配置这件事看起来只是“加加减减”但用好了它能让你的排查效率翻倍。第一个习惯给列起一个你自己一目了然的名字而不是 Wireshark 字段名。比如tcp.analysis.retransmission就起名Retranshttp.response.code就起名HTTP Code。看起来只是一件小事但当你打开一个几千帧的抓包文件表格顶部一排短标题比一长串字段表达式好认得多。第二个习惯把常用列配置固化成 profile。我就专门建了几个 profile网络基础、HTTP 分析、TCP 性能、VLAN 排查。每次拿到新抓包文件先切 profile再开始分析不需要每次从零配置列。这套做法在团队协作的时候也很省事导出 profile 文件发同事对方的 Wireshark 界面和我完全一样沟通成本直线下降。我最初学 Wireshark 的时候也盯着默认列硬看后来发现每一列背后都是“能让你少点五下鼠标”的价值。现在配置显示列已经成为我打开任何一个抓包文件之后的第一件事。你也别嫌麻烦花十分钟把常用列配一次后续能省下来的是无数个十分钟。
返回列表