☰
Wireshark显示列配置详解:自定义列让抓包分析效率翻倍
2026/10/3 4:25:35 网站建设 项目流程

用Wireshark抓包这么久,我敢说很多人从来没认真看过数据包列表顶部那一行列标题。默认的No.、Time、Source、Destination、Protocol、Length、Info,大多数时候够用,可真到排查问题时你会发现——默认列就像酒店送的一次性拖鞋,能穿,但绝不跟脚。比如我想同时看TCP窗口大小、HTTP请求路径、DNS查询名、TLS证书域名,默认列一个都帮不上忙,你只能一个个点开数据包详情,效率低到怀疑人生。

所谓“Wireshark加减显示列”,就是把这套列表区域完全按自己的分析习惯重排:增加分析所需的字段列、删掉干扰视线的废列、调整列的先后顺序、甚至是把某个协议字段作为独立列固定展示。这套操作学起来不难,但里面有几个关键细节——列字段表达式怎么写、列类型怎么选、配置怎么保存——很多人搞错,导致列配好了却显示空白,或者换个抓包文件又回到默认状态。这篇文章就把这块一次讲透。

1. 先搞清楚显示列的本质和布局逻辑

1.1 数据包列表区到底由什么组成

Wireshark主界面从上到下分几块:菜单栏和工具栏、显示过滤器栏、数据包列表区、数据包详情区、数据包字节区。我们说的“显示列”,指的是数据包列表区那个表格,一行对应一个数据包,一列对应一个字段。

这个表格并不是Wireshark内部写死的一块静态表格,它是通过“列配置”动态渲染出来的。每一列背后其实绑定了一个字段表达式(Field Expression)。比如默认的Time列,绑定的是frame.time_delta或者frame.time_relative;Source列绑定的是ip.src;Length列绑定的是frame.len。表格只是把抓到的每个包的字段值,按列配置提取出来展示而已。

理解了这一点,就能理解为什么“加减显示列”本质上不是界面美化,而是改变数据展示模型。你加一列,等于告诉Wireshark“请把每个包的这个字段也提取出来,单独占一列给我看”;你删一列,等于告诉它“这个字段我不需要看,请隐藏”。

1.2 默认列配置的隐藏思路

Wireshark默认列为什么是这七列?因为对通用场景来说,这七列信息量密度最高:

  • No.:包序号,对应frame.number,用来定位和交流。
  • Time:相对时间或绝对时间,对应时间字段,用于看延迟和时序。
  • Source / Destination:通信两端地址,对应IP或MAC字段。
  • Protocol:协议类型,由Wireshark根据包内容识别。
  • Length:包长度,对应frame.len,看报文大小和分片情况很直观。
  • Info:综合信息列,里面塞满了协议层的摘要。

注意,这几列里Source和Destination默认显示的是IP地址。如果你抓的是纯二层交换机流量或者Wi-Fi空口包,你会看到Protocol列显示ARP/LLDP等,Source/Destination列显示的却是MAC地址。这是因为Wireshark在列配置里设置了“地址类型解析”:如果数据帧是IPv4/IPv6封装的,就显示IP;否则退回显示MAC。这个自动切换逻辑对大多数人很方便,但调试二层协议时,反而会觉得列信息不够精准,这时就需要自定义列了。

另外一个容易忽略的点:默认Info列的内容是Wireshark的“协议摘要”,它的内容是协议解析器生成的,不是单纯某个字段。比如TCP包的Info通常显示[SYN] Seq=0 Win=64240 Len=0 MSS=1460,HTTP请求包显示GET /index.html HTTP/1.1。这个摘要文本本身也可以作为一列显示,这就是后面要说的特殊列字段_ws.col.Info。

2. 加减显示列的基础操作:四种方式一次掌握

2.1 打开列配置面板的方法

列配置的主入口是Edit -> Preferences -> Appearance -> Columns。这个路径不同版本略有差异,但大方向一致。在这个面板里,左侧列表是你当前所有列的集合,右侧可以编辑每一列的标题、类型和字段表达式。

更快的入口是直接在数据包列表的列标题上右键。右键菜单里有一堆快速操作:Column Preferences直接打开列配置面板;Add Column快速加一列;Remove Column删除当前列;Sort Column A-Z / Z-A按该列排序;Align Left / Center / Right调整对齐方式。

还有两个很隐蔽但极好用的操作:

  • 双击列标题可以直接进入“编辑标题”模式,改列名不用进配置面板。
  • 按住列标题拖动可以调整列顺序,拖到想要的位置松手就行。

如果你是在数据包详情区看到某个字段,想让它变成一列展示,最快的方法是右键那个字段 -> Apply as Column。这一步会自动把这个字段绑定成一个新列并追加到列表末尾,然后你再拖到合适位置。这个操作是日常最常用的,因为写字段表达式手抖容易错,直接从详情区选字段就不会出错。

2.2 新增列的实操步骤与参数选择

我们以“给HTTP请求增加一列显示Host头”为例,走一遍完整流程:

  1. 打开Edit -> Preferences -> Appearance -> Columns。
  2. 点击左下角+号新增一行列配置。
  3. 在Title输入HTTP Host。
  4. 在Type下拉框选择Custom。
  5. 在Field name输入http.host。
  6. 点击OK保存。

回到主界面,你可能发现新列已经出现,但之前抓的包如果HTTP Host字段不存在,列里就是空白的。这是因为字段表达式只对包含该字段的包有值,不包含时Wireshark会留空。如果想对没有该字段的包显示占位符,可以在Field name里写一些特殊表达式,后面讲。

如果输入的不是合法字段名,Wireshark会给出校验提示。一个更稳妥的做法是先抓包或打开一个抓包文件,然后到数据包详情区右键字段 -> Apply as Column。这种操作会自动填入正确的字段表达式,绝不会写错。如果你非要手输,建议配合自动补全:在Field name输入框里输入前几个字符,Wireshark会弹出候选字段列表,比如输入http.,会列出http.host、http.request.method、http.request.uri等字段名。

2.3 删除列与调整列顺序的细节

删除列有两种方式:

  • 在列配置面板选中那列,点-号删除。
  • 在数据包列表区右键该列标题,选Remove Column。

我个人更推荐后一种,因为所见即所得,不会误删。但要注意一点:Delete键在配置面板里不能用来删列,别问我怎么知道的。

调整列顺序的物理操作就是拖拽列标题。但是如果列特别多,拖起来很累,这时可以直接在列配置面板里选中某列,然后点击右侧的上移/下移按钮(有的版本是图标形式),一行一行挪。对于有几十列的重度配置,这个方案比拖拽可靠得多。

对齐方式也值得一说。默认是左对齐,看完整的绝对时间或十六进制数字列时,右对齐会让阅读体验明显改善。在列标题右键里就能直接改,不用进配置面板。列宽是可以拖拽调整的,但Wireshark有一个机制:如果内容超出列宽,会显示省略号;如果要完整看到字段内容,双击列标题边缘可以让列宽自动适应内容。不过自动适应只对当前文件生效,切换文件后可能又变回去,需要在列配置面板里手动设置宽度。

3. 进阶核心:字段表达式和实用列配方

3.1 列类型和字段表达式的底层关系

列配置面板里的Type下拉框,默认有这些常用类型:

  • Number:用于序号、长度等数值字段,默认右对齐。
  • Relative time:相对于抓包开始时间显示,对应frame.time_relative。
  • Absolute time:显示绝对时间,对应frame.time。
  • Source address (IPv4)/Destination address:专门显示地址类字段。
  • Custom:自定义类型,配合Field name使用。

不同类型会影响字段值的格式化和排序方式。比如一个TCP端口字段,如果用Number类型和用Custom类型配合字段表达式tcp.srcport,显示效果是一样的;但是如果你用Unsigned integer类型配tcp.srcport,Wireshark会把它当成数值而不是端口字段渲染,某些版本下颜色和右键菜单会有差异。

真正的高频用法是:类型选Custom,字段名写协议.字段。这种表达式的语法和显示过滤器表达式几乎一样。比如:

  • ip.src:源IP
  • ip.dst:目的IP
  • tcp.port:TCP端口(同时包含源端口和目的端口,不太常用,通常分开写)
  • tcp.srcport:TCP源端口
  • tcp.dstport:TCP目的端口
  • tcp.window_size_value:TCP窗口大小
  • tcp.analysis.ack_rtt:TCP确认延迟RTT
  • tcp.flags.syn:TCP SYN标志位(显示0或1)
  • http.host:HTTP Host头
  • http.request.uri:HTTP请求URI
  • http.response.code:HTTP响应状态码
  • dns.qry.name:DNS查询名称
  • dns.resp.name:DNS响应名称
  • tls.handshake.extensions_server_name:TLS SNI域名
  • icmp.type:ICMP类型
  • frame.len:帧长度
  • frame.number:帧序号

3.2 高频排查场景的列配置配方

我整理了三套在不同工作中反复用到的“列配方”,可以直接照抄。

第一套:TCP重传排查

如果你的任务是分析TCP重传率高、乱序多的问题,默认列基本是瞎的。我会配置这些列:

TitleTypeField name
No.Numberframe.number
TimeRelative time默认
SourceSource address默认
DestinationDestination address默认
SeqCustomtcp.seq_raw
AckCustomtcp.ack_raw
WinCustomtcp.window_size_value
RTTCustomtcp.analysis.ack_rtt
InfoCustom_ws.col.Info

这套列里最关键的是tcp.analysis.ack_rtt。TCP分析器会为每个ACK包计算这段延迟,你能在列里直接看到往返时延,对比是否有明显的延迟抖动。加上tcp.seq_raw和tcp.ack_raw用原始序号显示,配合Info列,一眼就能看出来重传、快速重传、乱序的状态。

第二套:HTTP接口联调

排查Web接口慢、报错时,最烦的是一个个点开HTTP包看请求行。配置这套列:

TitleTypeField name
MethodCustomhttp.request.method
HostCustomhttp.host
URICustomhttp.request.uri
StatusCustomhttp.response.code
Content-TypeCustomhttp.content_type
Server IPCustomip.dst

如果不仅要看HTTP,还要看底层TCP行为,可以再加一列tcp.analysis.ack_rtt和http.time(HTTP请求响应时间)。http.time是Wireshark计算出的HTTP事务耗时,对于判断服务端响应慢还是网络传输慢很有参考价值。

第三套:DNS慢查询分析

DNS问题排查中,最想快速看到的是每个查询的域名和响应时间。这套列可以直接用:

TitleTypeField name
Query NameCustomdns.qry.name
Response NameCustomdns.resp.name
DNS TimeCustomdns.time
Query TypeCustomdns.qry.type
Response CodeCustomdns.resp.code

dns.time字段是DNS事务耗时,单位是秒。如果整列的数字都很大,那就说明DNS服务器有问题;如果只是个别域名慢,可能是域名解析路径的问题。配合显示过滤器dns只看DNS流量,这套列会让你效率翻倍。

3.3 特殊字段:用列模拟“定制摘要”

前面提到_ws.col.Info这类特殊字段,其实Wireshark还提供了一些以_ws.col.开头的“伪字段”。它们不是真实抓包字段,而是Wireshark内部为方便用户而暴露的列信息:

  • _ws.col.Info:显示默认Info列摘要内容。
  • _ws.col.Protocol:显示协议名称列内容。
  • _ws.col.Source:跟默认源地址一致。
  • _ws.col.Destination:默认目的地址一致。
  • _ws.col.Time:默认时间列内容。
  • _ws.col.AbsoluteTime:绝对时间列内容。

这有什么用?比如你想在自定义列里组合展示信息,又不想写复杂的过滤器,直接用_ws.col.Info把默认摘要提取出来放在某一列,再配合其他自定义列,实现“摘要+指定字段”的布局。

另外,Custom类型在字段表达式里还支持字段拼接,比如你想只看“源IP到目的IP”,可以写:

ip.src + " -> " + ip.dst

Wireshark会逐包拼接字符串。这在某些场景下比两列并排更直观,尤其适合导出报告时保持信息紧凑。不过要注意:拼接表达式里所有引号必须是英文半角,如果包中某个字段不存在,结果会是空白或拼接出错。用这个功能记得先验证几个包。

4. 实战:不同工作场景下的列调整思路

4.1 从抓包到分析:一次真实问题的列配置过程

说一个我最近排查的真实案例。线上有个服务间歇性超时,固定间隔出现。抓包后我最初用的还是默认列,结果发现一个现象:某些数据包之间时间差很大,但不知道是哪个环节卡的。于是我做了一步很关键的配置——在数据包列表列头右键Column Preferences,把默认的Time列的字段表达式换成frame.time_delta,然后看Time列的变化。这其实就是“减法”:不增加列,只是改一列的计算方式。

但只看时间差还不够,我又加了一列TCP重传标志tcp.analysis.flags,再加一列RTT。配置完成后,列表里一列是时间差、一列是重传标志、一列是RTT。很快发现现象:每隔大约100个包就会出现一个RTT突然飙到200ms的重传包,后面紧跟一串重传。这一下就把排查方向从“应用层处理慢”扳到了“网络路径丢包”。

从这个案例能看出一个通用的思路:加列不是堆砌字段,而是围绕你的问题假设,把“假设验证所需的变量”放到眼前。你怀疑哪个环节慢,就配一列看哪个环节的关键字段;你怀疑哪个协议交互异常,就配列看它的状态字段。列配置的过程,其实就是把分析思路可视化、表格化的过程。

4.2 分析大文件时如何做“列减法”

大抓包文件(比如上百万包的pcapng)加载后,默认列渲染没问题,但如果加了很多自定义列——尤其是那些需要逐包解析正则或拼接的列——会明显拖慢滚动和过滤速度。因为每一行都要重新计算每个列字段的值。

我个人的经验是:分析大文件时做“列减法”。只保留序号、时间、IP对、协议、长度、Info这六列,其他所有自定义列全部删掉,等缩小分析范围后,再临时加上需要的列。这样做有两个好处:一是界面干净不花眼,二是内存和CPU开销小很多,滚动流畅。

另外,如果你习惯用Apply as Column胡乱加了一堆列(我就见过有人加了二三十列的),记得定期到Preferences -> Appearance -> Columns里集中整理。列太多时有个很常见的副作用:列宽被摊得非常窄,每个字段只露出前几个字符,极大影响阅读。这种时候别硬拖列宽,不如直接删掉不用的列。

4.3 无线/Wi-Fi场景下的列配置

分析Wi-Fi空口包时,很多人会踩坑。默认的Source/Destination列在无线帧里显示的是MAC地址,但是802.11头部里还有发射端、接收端、BSSID等概念,如果用IP层的思维去看会很别扭。

建议在分析无线包时增加这几列:

TitleTypeField name
BSSIDCustomwlan.bssid
SACustomwlan.sa
DACustomwlan.da
TACustomwlan.ta
RACustomwlan.ra
RSSICustomradiotap.dbm_antsignal

RSSI信号强度用radiotap.dbm_antsignal,前提是你的抓包设备支持radiotap头(很多USB网卡在监听模式下支持)。如果把RSSI作为一列,配合时间列,能很直观地看出信号衰减的规律。这种场景下默认列基本没什么用,你会体会到“加减显示列”在专业分析里有多重要。

5. 常见问题与排查技巧实录

5.1 为什么我加的自定义列是空白

这是被问得最多的一个问题。空白列的原因,90%的情况是字段表达式拼错了,比如把http.request.uri写成http.uri,把dns.qry.name写成dns.query.name。Wireshark的字段表达式必须和协议解析器注册的字段名完全一致,不存在“模糊匹配”。

检查方法很简单:在显示过滤器栏输入你写的表达式,看看能不能过滤到包。如果过滤器能正常工作但列是空的,那可能是这个字段只在部分包里存在。比如http.response.code只在HTTP响应包里存在,如果你抓的全是请求包,这一列当然全空白。

还有一种并发场景容易被忽略:同时打开多个抓包文件时,列配置的字段可能是为某个文件定制的,切换到另一个文件后,列还在但全部空白。这不是bug,而是因为新文件里没有该字段。遇到这种情况,直接回到详情区右键正确字段重新Apply as Column即可。

5.2 列顺序老是恢复到默认是怎么回事

如果你辛苦调好的列顺序,重启Wireshark或者切换文件后变回默认,通常是因为你没有保存配置,或者说你编辑的不是当前使用的配置档案(Profile)。

Wireshark的配置是按Profile隔离的,默认是Default配置文件。你改列配置时,修改的是当前Profile下的配置。如果开着自动保存(默认开启),关闭Wireshark时会写入配置文件,下次打开还是这份配置。但如果你的Wireshark装在便携模式,或者配置文件目录权限有问题,写入失败,恢复默认就是必然的结果。

解决办法是:

  1. 确认当前使用的Profile:Windows下在Wireshark右下角状态栏能看到当前Profile名,或者Manage Profiles查看。
  2. 手动备份%APPDATA%\Wireshark\profiles\<Profile名>\下的preferences文件,重装系统或换机器时直接拷贝。
  3. 如果列配置里的一堆列是“临时分析用的”,又不想影响日常工作Profile,建议新建一个Profile,比如TCP-analyze,在里面把列配置调好。不同场景切换Profile,列的加减互不干扰,这是高阶玩法。

5.3 列字段写错时Wireshark会报错吗

不会。即使字段表达式错误,Wireshark也不会在列配置面板里弹红色错误提示,它只会静默地把该列显示为空白。这就导致很多人错了半天找不到原因。

比较稳妥的验证方法是:在显示过滤器栏输入该表达式看能否高亮包,比如输入tcp.window_size_value,如果能正常过滤,说明字段名存在。如果过滤器提示tcp.window_size_value is not a valid field,那就换一个字段名。

另一个容易混淆的点是:有些字段名看起来像大写,实际上按小写填,比如http字段名里没有大写。Wireshark字段名全是小写加点的形式。还有一类字段需要启用“协议解析器”才能显示,比如tcp.analysis.ack_rtt,如果抓包文件里没有任何TCP包,这个字段在详情区里根本找不到,列自然空白。

5.4 解码方式影响列值:不为人知的坑

这是个高级坑。Wireshark默认会按标准端口猜协议,比如80端口按HTTP解析,443端口按TLS解析。但如果你抓到的流量不是标准端口,默认情况下协议解析器不会启用,字段表达式提取不到值,对应列就空白。

比如某应用在7000端口跑HTTP,你加http.request.uri列,默认会全空白。解决办法是:右键某个包 ->Decode As,把7000端口指定为HTTP。一旦解码方式改变,Wireshark重新解析该流的每个包,自定义列立刻就有值了。

这个坑特别隐蔽,因为列配置本身没问题,字段表达式也正确,数据包里也确实有HTTP字段,但列就是没有值。遇到这种情况,先别怀疑列配置,检查一下流量解码方式。

5.5 列数据导出技巧

分析完一个排障过程,通常要把表格导出交给其他人。列表区右键 ->Copy -> Copy All Visible Items可以按当前列的排列把数据复制成TSV(制表符分隔)文本,方便粘到Excel。导出CSV在File -> Export Packet Dissections -> As CSV里。

这里有两个实用经验:

  • 导出前先把列配置调成最终交付形态,因为导出内容跟着当前列配置走,你要的字段没在列里,导出文件里自然也没有。
  • 如果对方没有Wireshark,只想看表格,用As CSV导出,中文内容编码容易乱,建议在Excel里用UTF-8导入或着用Tab分隔。

收尾:几个值得养成的好习惯

在Wireshark上玩了这么久,我个人的习惯是给常用场景各建一个专用Profile,每个Profile的列配置都做到“开箱即用”。排查问题时,先套用对应Profile,再根据当前文件微调列,完事后不污染日常工作环境。配置文件定期备份,换电脑时一条命令恢复,省掉重配的功夫。

另外有个小技巧,可能很多人没用过:列标题本身可以改颜色。在Preferences -> Appearance -> Columns里选中某列后,Edit里能看到Preferred Column Width和Alignment,但更酷的是你可以用显示过滤器表达式作为列字段,比如写tcp.len > 0,这样该列会显示为过滤结果(true/false),这在筛选特定条件下的包时很有效。

最后想说一点:“加减显示列”表面上是界面操作技巧,但实际上是你对协议理解程度的一种投射。你会加什么列,捅破天也逃不出你对字段的认知范围。多花点时间在协议字段上——打开数据包详情区,看到哪个字段觉得“这要是成一列就好了”,就立刻右键Apply as Column。这样日积月累,你手头会自然形成一整套贴着真实工作需求打磨出来的列模板,那才是Wireshark真正趁手的样子。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询