
网络协议是每个程序员入门的必修课,但是完全掌握网络协议知识并进行实际应用却并非易事。在本书中,作者将结合自己从业多年的“泣血”经验,以通俗易懂、更加贴近日常生活的方式,从底层到上层对基础、常用、重要的网络协议进行解析,并将深入分析网络协议在云计算、容器和微服务等领域的应用和实践。本书将帮助入门级程序员深入、直观地理解网络协议基础概念和原理,构建一个完整、精准的网络协议知识框架;也会帮助有一定工作经验的程序员填补知识漏洞、打通知识体系。
为什么要写网络协议 写一本通俗地讲解网络协议的书,一直是我的一个梦想。 在我十多年的职业生涯中,对网络协议爱恨交加,学习过程大致分为以下三个阶段。 第一阶段:难且无从下手。虽然我们在大学都学过网络协议,但是感觉网络协议的知识点非常多、非常复杂。学的时候就浑浑噩噩,真正到了实践中更是糊里糊涂,一旦工作中遇到了网络问题,除了会简单地ping 几下,基本没有什么解决问题的思路。然而当我想拿起书来学习,或者看一些官方文档的时候,各种生僻的专业词汇马上扑面而来。每了解其中的一个词汇,都要看n 篇文章,读n 本书,导致一篇即使很短的有关网络技术的文章也要几个星期才能看完。这严重打击着我的自信心,并且很容易让人在技术的海洋中迷失自我,从而产生“从入门到放 弃”的冲动。 第二阶段:苦且绕不过去。经过多次放弃之后,我发现在我的职业生涯中,网络这一关无论如何也绕不过去。本来觉得写Java 程序时可以依赖别人的库,所以就不用关心这么多底层的技术了,但是到后来才发现,服务数量一多,吞吐量一大,我们关心的不再仅仅是某个Java 应用,而是要提升整个集群的性能,这时网络问题就会出现。而且大规模的微服务架构必定要上云、使用VPC 网络,这时就必定要考虑双活和灾备,必定要做各个层次的负载均衡,这些都需要网络方面的技术。既然绕不过去,那就必须“啃”下它,于是我就进入了暗无天日的网络协议学习的过程。见山开路、遇水搭桥,遇到一个知识点攻克一个,再将其写到博客或者笔记里面。有时候要看很多文章和书才能攻克一个知识点,但我还是每天下班抱着网络技术相关的文章和书看,直到将各个零散的知识点串连了起来。后来在定位网络问题的时候,我开始有了自己的思路,这时才感觉算是暂时趟过了这条河。 第三阶段:有趣且受益匪浅。网络协议和变化万千的前沿技术不同,它的变化比较小,一旦掌握到一定程度,就会一直受益。技术变化很快,这几年OpenStack、Docker、Mesos、Kubernetes、微服务、Serverless、AIOps 等技术层出不穷,让大多数技术人员应接不暇,但是掌握了基础知识以后,我反而发现很多技术看起来“轰轰烈烈”,扒下外衣,其实本质还是操作系统、计算机网络、算法与数据结构、编译原理、计算机组成与系统结构。如果基础打好了,最大的收益就是,在最新的技术出来以后,只要经过短时间的学习,就很容易上手,就能在新技术的滚滚浪潮中保持快速学习的能力。这点让我受益匪浅。 既然网络协议既是基础,又绕不过去,还这么难,但是趟过去之后又不怎么变,收益越来越大,那为什么不写一本书,给大家一点可借鉴的经验,帮助大家尽快通过第一和第二阶段呢? 为什么要趣谈 决定写网络协议,但是怎样写呢?其实网络协议相关的文章已经非常多了,但是我自己学习网络协议的时候,还是遇到了很多的困难。 网络协议知识点太多,学完记不住。大部分读者应该都学过计算机网络课程,学的时候感觉并不难,尤其这门课没有公式,更像是文科的东西。学了一大堆东西,也背了一大堆东西,但是最终应付完考试之后,都“还给了老师”。网上有很多关于网络协议的文章,看的时候感觉别人说得很有道理,自己好像理解了,但是经不住问,一问就会发现,大概的流程明白了,可是很多细节还是不知道。从能看懂到能真正明白,中间还有很长一段路要走。每次都感觉自己好像学会了,但实际应用的时候依旧无从下手。虽然很多细节都摸索得差不多了,但是当自己去应用和调试时,才发现还是没有任何思路。比如,当创建出来的虚拟机不能上网时,还是无从下手,学过的很多东西,似乎都用不上。 我把这种现象总结为:一看觉得懂,一问就打鼓,一用就糊涂。 所以本书使用了“趣谈”这种方式,它可以解决从“入门到放弃”的问题,把晦涩的知识点和一些有趣的故事通过比喻的方式结合起来,这样更容易帮助读者系统、深入地了解网络技术的知识点和大致的工作流程。 当然用来做比喻的例子和真实的知识点以及工作流程会有一定的差别,但是没有关系,我们的大脑应该是一个缓存,而不是一个硬盘,通过通俗易懂的方式记住知识体系和大致流程,真正到解决问题的时候,再去查阅更加准确的资料,就可以了。 这本书的特点 本书有以下几个特点。 第一,会从身边经常见到的事情出发,用讲故事的方式来讲解各种协议,然后慢慢扩大到不熟悉的领域。例如,每个人都会使用查看IP 地址的命令,我们就从这个命令开始,展开讲解一些相关概念。每个人都在大学宿舍组过简单的网络来打游戏,我们就从宿舍网络涉及的最简单的网络概念开始讲,然后说到办公室网络,再说到日常常用的与上网、购物、视频下载等活动相关的网络协议,最后才说到最陌生的数据中心。说到这里的时候,很多概念已经在前面的“宿舍”和“办公室”的例子中都出现过,因此更容易接受和理解。 第二,讲解网络协议时会更加贴近使用场景,将各个层次的关系串连起来,而非孤立地讲解某个概念。常见的计算机网络课程往往会按照网络分层,一层一层地讲,却很少讲层与层之间的关系。例如,我们在学习路由协议的时候,在真实场景中,这么多的算法和二层是什么关系呢?和四层又是什么关系呢?再比如,我们在真实的网络通信中访问一个网站、进行一次支付,那么在TCP 三次握手的时候,IP 层在干什么?MAC 层在干什么?这些内容本书都会逐一讲解。 第三,在讲解完各个层次的协议之后,会讲述如何在当前热门领域(比如云计算、容器和微服务)中使用这些协议。 通过学习本书,读者一方面可以了解这些网络协议的真实应用场景,另一方面也可以通过上手使用云计算、容器、微服务来进一步加深对于网络协议的理解。
第1 章 通信协议概述 ................................................................................................................. 1 1.1 为什么要学习网络协议 ........................................................................................ 1 1.2 网络分层的真实含义 .......................................................................................... 10 1.3 ifconfig:熟悉又陌生的命令行 .......................................................................... 17 1.4 DHCP 与PXE:IP 地址是怎么来的,又是怎么没的 ...................................... 25 第2 章 从二层到三层 ............................................................................................................... 36 2.1 从物理层到MAC 层:如何在宿舍里自己组网玩联机游戏 ........................... 36 2.2 交换机与VLAN:办公室太复杂,我要回学校 .............................................. 43 2.3 ICMP 与ping:投石问路的侦察兵 ................................................................... 56 2.4 世界这么大,我想出网关:欧洲十国游与玄奘西行 ...................................... 64 2.5 路由协议:“西出网关无故人”“敢问路在何方” .......................................... 74 第3 章 最重要的传输层 ........................................................................................................... 86 3.1 UDP:虽然简单但是可以定制化 ...................................................................... 86 3.2 TCP(上):虽然复杂,使用起来却轻松 ......................................................... 93 3.3 TCP(下):西行必定多妖孽,恒心智慧消磨难 ........................................... 103 3.4 socket:Talk is cheap, show me the code ............................................................. 116 第4 章 最常用的应用层 ......................................................................................................... 127 4.1 HTTP:看个新闻原来这么麻烦 ...................................................................... 127 4.2 HTTPS:点外卖的过程原来这么复杂 ............................................................ 141 4.3 流媒体协议:如何在直播里看到帅哥美女 .................................................... 151 4.4 P2P 协议:下载电影,分布式协议速度快 ..................................................... 163 第5 章 陌生的数据中心 ......................................................................................................... 174 5.1 DNS:网络世界的地址簿 ................................................................................ 174 5.2 HTTPDNS:网络世界的地址簿也会指错路 .................................................. 181 5.3 CDN:你去小卖部取过快递吗 ........................................................................ 192 5.4 数据中心:我是开发商,自己拿地盖别墅 .................................................... 199 5.5 VPN:朝中有人好做官 .................................................................................... 210 5.6 移动网络:去巴塞罗那,手机也上不了“脸书” ........................................ 225 第6 章 云计算中的网络 ......................................................................................................... 238 6.1 云中网络:自己拿地成本高,购买公寓更灵活 ............................................ 238 6.2 软件定义网络:共享基础设施的小区物业管理办法 .................................... 251 6.3 云中网络之安全:虽然不是土豪,也需要基本保障 .................................... 266 6.4 云中网络之QoS:室友疯狂下电影,我该怎么办 ........................................... 282 6.5 云中网络之隔离GRE、VXLAN:虽然住一个小区,也要保护隐私 .......... 291 第7 章 容器技术中的网络 ..................................................................................................... 311 7.1 容器网络:来去自由的日子,不买公寓去合租 ............................................ 311 7.2 容器网络之Flannel:每人一亩三分地 ........................................................... 324 7.3 容器网络之Calico:为了高效说出善意的谎言 ............................................. 332 7.4 RPC 概述:远在天边,近在眼前 .................................................................... 346 第8 章 微服务相关协议 ......................................................................................................... 358 8.1 基于XML 的SOAP:不要说NBA,请说美国职业篮球联赛 ..................... 358 8.2 基于JSON 的RESTful 接口协议:我不关心过程,请给我结果 ................. 364 8.3 二进制类RPC 协议:还是叫NBA 吧,总说全称多费劲 ............................ 370 8.4 跨语言类RPC 协议:交流之前,双方先交换一下专业术语表 ................... 379 第9 章 网络协议知识串讲 ..................................................................................................... 390 9.1 知识串讲:用“双11”的故事串起网络协议的碎片知识(上) ................ 390 9.2 知识串讲:用“双11”的故事串起网络协议的碎片知识(中) ................ 398 9.3 知识串讲:用“双11”的故事串起网络协议的碎片知识(下) ................ 406 9.4 搭建一个网络实验环境:授人以鱼不如授人以渔 ........................................ 416