不知道为什么,我的微博有时候会很卡,比如刷新时会一直Loading(见图1)。这不只是我的个人感受,很多网友都抱怨过。而装在同一个手机上的微信,连的也是同一个Wi-Fi,却没有这个症状。虽然这个问题出现的并不频繁,但假如我是微博的开发人员,肯定要把原因找出来。

1.png

1

当我的手机抓包环境搭好时,第一个想解决的问题就是这个。我随意发了一条微博,虽然没有碰到卡顿,但还是把包抓下来了。开头几个网络包如图2所示。

2.png

2

我又发了一条测试私信,可惜也没有卡顿。开头几个网络包如图3所示。

3.png

3

虽然两次都没有重现问题,但是从网络包可见,微博的工作方式严重依赖DNS。它在调用任何功能之前都要先向DNS服务器查询,得到提供该功能的服务器IP,然后再建立TCP连接。最神奇的是它不会缓存查询结果,所以需要频繁地重复查询DNS。我才抓了两分钟包,竟然就看到了上百个查询,这会不会就是微博卡顿的原因呢?我又抓了一个发微信的包作对比,如图4所示。

4.png

4

果然,微信客户端直接就和一个IP地址建立了连接。不管这个IP是写在配置文件中的,还是之前就存在手机的缓存里的,这至少说明了微信不像微博那样依赖DNS

为了进一步验证这个猜测,我故意把手机上的DNS服务器配成一个不存在的地址。不出所料,微信还是能照常工作,但微博就再也刷不出来了。之前我手机上配的DNS服务器位于美国,可能有时候跨国连接不稳定,所以导致了微博的卡顿现象。考虑到这一点,我尝试配了一个国内的DNS(见图5),果然从此再也没卡过了,刷起来异常流畅。

5.jpg

5

当你看到这篇文章的时候,也许这个问题已经被新浪解决了,因为我已经向微博的技术人员反馈过(或者他们早已经知道)。相信解决起来也不复杂,只要像微信一样缓存IP就可以了。据我所知,苹果的App Store和小米电视也遭遇过DNS导致的性能问题,所以相信还有很多设备或者程序可以利用Wireshark来优化,只要把使用过程的包都抓下来,说不定就能发现值得改进的地方。

最后再补充一个小发现。我发的微博内容是“capture test, will delete it soon.”,分享范围设成“仅自己可见”。没想到在Wireshark上直接就看到了明文(见图6底部),发私信就没有这个问题。因此我们连公共WiFi发微博的时候,还是要小心一点。不要以为设成“分组可见”或者“仅自己可见”就够私密了,其实在Wireshark上都能看到。

6.png

6

 

作者信息:

林沛满

林沛满是一位有近十年存储经验的技术专家,擅长文件存储的性能分析、归档和备份。同时也专注于网络协议分析,比如CIFS/NFS/HTTP/TCP/UDP等,是《Wireshark网络分析就这么简单》、《Wireshark网络分析的艺术》等书的作者。

 

注:本《大咖讲网络》系列文章取自《Wireshark网络分析的艺术》一书。