Wireshark网络分析的艺术
上QQ阅读APP看书,第一时间看更新

本书组织结构

就像时尚女郎每天都在看包包一样,我也每天都在看包。看到有趣又有价值的,就会记录下来,久而久之就形成了这本书。因此它有别于包罗万象的网络教材,而更像一个技术博客的合集。

全书根据素材来源可分为四个部分。

第一部分的选材来自老读者的咨询,相信很有代表性,说不定其他读者也会遇到。

• 《Linux为什么卡住了》分析了登录Linux时卡顿10秒钟的现象。虽然我是Linux领域的菜鸟,但是仍然可以用Wireshark发现原因并解决它。

• 《像福尔摩斯一样思考》讲述的是如何根据网络包中的蛛丝马迹,找到被人为掩盖的线索。自己从网络包推理出来的东西,往往比对方提供的文档更可靠。

• 《一篇关于VMware的文章》介绍了一位读者在VMware知识库发现的文章。我们纯粹依靠协议分析,找到了这篇文章的真正内涵,最后再用Wireshark看包加以确认。

• 《来点有深度的》是在上一篇的基础上,通过发散思维,向读者“灌输”了一些相关的TCP知识。个人觉得TCP协议理解到这个深度就足够应付大多数性能问题了。

• 《三次握手的小知识》是应某论坛网友的要求而写的TCP握手科普,分享了一些用Wireshark来处理握手问题的小经验,顺便演示了“SYN flood”攻击的网络包。

• 《被误解的TCP》澄清了被读者广泛误解的两个TCP概念,比较了Linux、Windows和安卓手机的不同Ack频率。

• 《最经典的网络问题》是我近年遇到过的最经典的案例了。虽然很多年前就听说过Nagle算法遇到延迟确认会出问题,但是在现实中还是第一次遇到,赶紧记录下来。

• 《为什么丢了单子?》讲述了一位销售朋友的遭遇,说明用Wireshark有助于发现产品的不足,并且找到改进之处。如果能用Wireshark分析自家产品与竞争对手产品的网络包,一定能找到不少差别,从而改进销售策略。

• 《受损的帧》分析了因为硬件等原因导致帧损坏,从而在Wireshark上体现出的奇怪症状。事情往往没有表面上看到的那么简单。

• 《虚惊一场》是因为一位眼尖的读者发现了我书中的一处“错误”(或者可以说是TCP的一个bug),后来研究了很久才发现是虚惊一场,不过排查过程还是很值得分享的。这位读者还从“作者简介”的照片中,看到我手上的《TCP/IP详解 卷1:协议》是影印版,然后特意从美国帮我寄来了一本原版书。再次表示感谢!

• 《NTLM协议分析》是这部分唯一的基础协议介绍,据说NTLM在中国用得还很多,所以才特意写了一篇。

• 《Wireshark的提示》收集了读者感兴趣的很多Wireshark提示信息。文中不但介绍了每一个提示信息的意义,还分析了其产生的原因,希望让读者能够知其所以然。

第二部分是我自己在工作中遇到的网络问题。这部分讲得最细、最深,问题本身也最复杂。在阅读这一部分时,可能要多花点时间。

• 《书上错了吗?》解释了为什么对于同一个TCP连接,在两端抓到的网络包顺序是不同的。明白了这一点才能理解后面两篇的内容。

• 《计算“在途字节数”》介绍了如何从网络包中计算“已经发送但未被确认”的数据量。不用害怕数学,简单的加减法就够用了。

• 《估算网络拥塞点》在前两篇的基础上,提供了一个估算网络拥塞点的方法。掌握了这个技能,此后再优化TCP性能时就胸有成竹了。

• 《顺便说说LSO》讲的是现在越来越普遍的Large Segment Offload。在估算拥塞点的时候很可能会被LSO所干扰,因此我特意为它写了一篇。

• 《熟读RFC》分析了一个颇为棘手的性能问题,即使擅长Wireshark也很难解决,向大家展示了熟悉RFC的重要性。

• 《一个你本该能解决的问题》用Wireshark分析了一个UDP导致的性能问题,从本质上分析UDP和TCP的差别。这一篇我在微博上发过,还引发了一场不小的讨论。

• 《几个关于分片的问题》其实是上一篇的后续。很多读者看到UDP包被分片之后出现了性能问题,所以对分片很感兴趣,问了不少问题。

• 《MTU导致的悲剧》分享了几个MTU配置出问题而导致的事故。这类问题其实很多见的,尤其是对于实施和运维人员来说。

• 《迎刃而解》是来自一个运维部门的技术问题,相当隐蔽而且诡异,最终在Wireshark的辅助下迎刃而解。

• 《昙花一现的协议》回忆了一个我曾经支持过的协议。今天才学习它可能没有实际意义,但是其理念和创意还是值得借鉴的。当你对一个协议了解到一定程度时,肯定也会有改造它的想法。

• 《另一种流控》介绍的是Pause Frame(暂停帧)流控。有别于TCP的“端到端”流控,它是“点到点”的,在有些场合很好用。

• 《过犹不及》分享了一个多线程传输的案例,说明不是增加连接数就一定能提高性能,有时候甚至有负面效果。

• 《治疗强迫症》演示了如何用Wireshark研究文本编辑软件的工作方式。也许这类软件不是你的兴趣所在,但是可以举一反三,用相同的方式研究其他软件。

• 《技术与工龄》算是半篇技术文章。除了介绍Window Scale这个技术点,还希望每个人都能正视工龄,善待新人。

• 《一个面试建议》只是分享面试经验,完全无关技术。文章写得很不严肃,目的是让读者休息一下,乐一乐。

• 《如何科学地推卸责任》不是想把你“教坏”,而是分享了如何在技术上划分责任。如果你是乙方工程师,肯定会需要的。

第三部分的选材是日常生活中的抓包,包括手机App。在未来一两年,可能会有越来越多的人去抓手机上的包,因为用得多了,问题也会跟着增加。

• 《假宽带真相》本是央视某一期节目的名字,说测速软件“有明显的设计缺陷”。我用Wireshark进行了验证,结果如何呢?读了全文就知道了。

• 《手机抓包》讲解的是如何在家里搭建适合抓手机包的WiFi环境。如果你经常需要抓手机上的包来研究,相信我,是该改造一下家里的网络了。

• 《微博为什么会卡》分析了微博在WiFi环境下经常卡顿的问题,最后找出来的原因竟然是DNS。本文对很多App的优化有借鉴作用。

• 《寻找HttpDNS》讲述了一个“失败”的探索过程,因为到最后都没有找到想要的包。不过失败本身也有价值,因为我们知道了真相不过如此。

• 《谁动了我的网络》详细地讲解了被劫持的网络包有什么特征,以及如何在Wireshark中找到它们。下一次你怀疑自家网络被劫持时,就可以抓一个包自己分析了。

• 《一个协议的进化》介绍的是当前HTTP 1.1在性能上的落后之处,以及可能改进的空间。可惜现在HTTP 2的包还不容易抓到,否则我们还可以增加一些内容。

• 《假装产品经理》分析了在微博发图片的网络包,我们可以从中看到它的压缩比例、上传行为、CDN服务商等。不用派卧底去新浪,就可以侦察到不少“机密”。

• 《自学的窍门》也无关技术,只是分享了本人的学习经验,希望对新人有些参考价值。

第四部分的内容很少,却花费了我不少时间,因为写的是两个项目/产品。

• 《打造自己的分析工具》介绍了我自己打造的一个性能分析网站,让大家体验一下量身定制的工具有多好用。本文也分享了开发过程的一些经验。

• 《一个创业点子》讲的是我曾经想做的一个网络加速器。里面知识点还是挺多的,也适合用Wireshark来研究。