
用 Wireshark 这类工具排查网络问题,有一个前提很容易被忽略:
它不是"在看网络",而是在某个位置复制一份数据。
这个区别很重要——位置决定了你能看到什么,而容量决定了你看到的是不是全部。
忽略这两点,得到的结论可能是错的——而且错得很自然:你会以为"什么都没发生",而事实上是"没有被记录下来"。
数据是流经某个位置时被复制下来的。所以第一个要问的问题是:你要看的流量,会经过我抓的这个位置吗?
几种常见的落空情况:
同一台机器上两个进程之间的通信。
它可能根本不经过物理网卡,而是在本机内部走完。在网卡上抓,自然什么都看不到。
虚拟化环境。
虚拟网卡与物理网卡之间可能隔着一层转发。抓在错误的一侧,就只能看到一侧的样子——有时候是"只有去、没有回",有时候是"加了一层封装"。
无线网络。
无线网卡的工作方式决定了它能"听到"的内容范围。有些模式下只能收到属于自己的帧,而不是整个无线信道上的所有内容。
所以排查网络问题前,先自问一句:这个流量会经过我抓的位置吗? 这个问题不回答,后面的分析都建立在错误的前提上。
这是最容易吃亏的一点,也是很多人第一次用这类工具时踩的坑。
抓取时过滤:
在数据进入缓冲区之前就筛掉。没被收下的,之后永远找不回来。
显示时过滤:
全部收下来之后再筛。数据还在,只是当前不显示——改一下条件就能看到。
两者的差别可以概括成一句话:
显示过滤是"先记账再查账",抓取过滤是"少记了就不存在"。
这会导致一种很典型误判:抓取条件写窄了,看着"没有任何相关流量",于是判断"请求根本没发出去"——而实际上它发出去了,只是当场没被记录。
实务上的做法是反直觉的:
这一点更少被意识到:数据从网卡到内核缓冲区、再到应用层,这条链路是有容量限制的。
流量大的时候,如果处理不过来,就会丢。
关键是:丢的是"抓包结果",而不是"网络"。 网络可能完全正常,只是你没记下来。
表现就是那个很容易误判的现象:抓下来的结果看起来"流量中断了"。
判断方法:看工具是否报告了丢包统计。如果有丢包,那么"没看到某个包"这个结论就是不可靠的。
能减轻丢包的几个动作:
这里有个取舍值得记住:为了"看得更全"而放松过滤,会增加丢包风险;而为了"不丢包"而收紧过滤,会漏掉内容。两者需要根据流量规模权衡,而不是简单选一个。
现代通信大部分是加密的。抓包能看到的是外层信息:地址、端口、以及协议层面的标记。
内容看不到。
所以"抓到了"和"看懂了"是两件事。 在加密流量面前,能做的分析通常退回到行为特征:
这些信息依然有诊断价值——连接建立失败、超时重传、请求响应模式,都还看得出来。但不要指望能看到具体传了什么。
第一,先确认抓取点。
流量会不会经过这里——这个问题的答案决定了一切。
第二,抓取阶段尽量少过滤。
宁可多抓再筛。抓取过滤是"不可逆"的,显示过滤是可逆的。
第三,看一眼有没有丢包。
有丢包就说明这份记录不完整,"某件事没发生"这类结论要打折扣。
第四,说清"我能看到哪一层"。
在加密流量上做分析,结论要到"行为"这一层为止,不要越界推断内容。
第一,把"没看到"分成两种可能。
"没经过"与"没记下"是两回事。 前者说明抓取点选错了,后者说明容量不足。不区分这两者,会得出完全相反的结论。
第二,抓包环境要一起记录。
位置、过滤条件、缓冲区设置、是否丢包——这些不记下来,事后无法解释这份记录。别人(或者几个月后的你)拿到一份抓包文件,不知道它是在哪儿、用什么条件抓的,就无法判断它的可信度。
第三,不要把一次抓包当成"证据"。
它是一次观测,而观测有边界。把它当成线索,而不是结论。
关于 Wireshark 这类抓包工具,记住四条:
这里的迁移经验是关于"观测"本身的:任何观测工具都在某个位置、以某种容量限制复制数据。 于是"没看到"永远有两种解释——没经过,或者没记下。在使用任何观测手段(抓包、日志、性能采样、监控)之前先分清这两种,"结论"才不会建立在"记录不完整"之上。
https://www.ijinshan.com/software/Wireshark818.html?channel=4094
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。