一次抓包分析过程——Wireshark 新手上车
问题
网友尝试做星球第一个必做实验的时候,什么内核参数都没改,发现请求经常会停滞 100ms,这种要怎么判断是局域网的网络问题还是应用问题呢? 服务是 python3 -m http.server 启动的,看上去没有出现什么重传、窗口也没看到什么问题
因为不能提供环境给我,我尝试对这个抓包进行了分析,因为只有客户端抓包,所以分析结果是没有结论的,但分析过程比较适合入门 Wireshark,适合刚加入星球的、没分析过网络包的同学可以参考,熟手请忽略
分析
整个抓包 28MB,跨度 600 毫秒,看得出带宽很大、RTT 极小(到Wireshark 里看看前几个包的交互 RT 就知道了)
详细分析
看第一次卡 100ms 之前的抓包,在100ms 以前客户端ack 了所有Server 发出来的的tcp包(红框),也就是说每一个发给客户端的包客户端都ack 完毕,证明客户端处理足够快,但是 8089端口不继续发包而是等了100ms再继续发,如下图:
到这里的结论:
不是因为发送buffer、接收buffer太小导致的卡;也不是因为拥塞窗口导致的,就是Server 端没有发包。大概率是Server 进程卡了,或者Server 进程读取物理文件往OS buffer 写这些环节卡了(可以在服务端通过 strace -tt 看看进程在这 100 毫秒有没有往内核怼数据)
所以要继续在 Server 端来分析这个问题
怎么快速定位到红框、红线这里的包?
到 Time Sequence 图上点平台两边的点都可以自动跳转到这里,每个点代表一个网络包,横坐标代表时间
其它分析
将如下 Time Sequence 图使劲放大,从第一个包开始看,可以观察到教科书所说的慢启动
整体看的话,慢启动几乎可以忽略,毕竟这个抓包是下载一个巨大的文件,如果是一个小文件这个慢启动还是影响很大的,如下图,红框部分看起来微不足道
把时间范围放大,继续看,在卡之前红色箭头很长的,代表带宽、buffer有能力一次发送很多网络包,但是后面每次只发一点点网络包(绿色箭头长度)就卡了
重现
我用 python3 当服务端未能重现这个卡100ms 的现象,拉取都很丝滑
非常细节地去分析的话,也是能看到一些小问题的,比如1.9ms的卡顿、比如zero_window
重现的时候,有1.9ms 这样的卡顿,但是不算有规律,因为这么小在整个传输过程中影响不大
我重现的时候正好抓到了 seq 回绕,seq 是个 32位的无符号整数,到了最大值就从0又开始:
此时的 Time Sequence:
建议
可以用实验1里面的一些手段debug 一下Server 为什么卡了,除了 strace -tt 还可以用 ebpf 试试看看 Server 的调度上哪里顿了 100ms
新手如何通过Wireshark 来看抓包?
首先不要纯粹为了学习去看,而是要问你的问题是什么?如果网络传输速度慢,我们就看 Time Sequence(斜率越陡速度越快),去看为什么发送端不发包了
- 如正文里的卡顿平台,在250ms内差不多要卡240ms 不发包,速度自然不行
- 我重现抓包中的zero Windows
- 达到网络BDP 瓶颈了,去看拥塞窗口在最大值的时候会丢包,触发降速
里面可以看、要看的东西太多,所以我也说不上要看什么,而是要问你的问题是什么