如何从宏观视角理解“三次握手”?
笔者以往解释TCP的“三次握手”经常是从微观视角着手,今天尝试换一个角度,从宏观视角来聊聊。
之所以过去比较喜欢从微观视角进行解释,是因为个人觉得这是个更加理性、务实且有“干货”的视角,而宏观视角很容易陷入感性的泛泛而谈。
比如解释为啥需要“三次握手”,从微观视角我会说是为了同步通信双方彼此字节流的起始字节序号。
图片
至于为啥要同步起始序号,则是因为TCP通信本质是“字节流通信”,而字节流通信的本质则是“字节队列”的传输。
而要确保一个“字节队列”的完整性,最简单有效的办法莫过于确认清楚“队头”字节序号和“队尾”字节序号。
而“三次握手”就是确认这个“队头”的,“四次挥手”则是确认“队尾”的。
图片
个人一直觉得上述这套说辞配合上三次握手和四次挥手的示意图,应该就把问题解释得很清楚了。
但真正站在初学者视角,感觉那种解释还是难免抽象。
所以到头来发现,从一个更加感性和易于理解的宏观视角解释三次握手还是很有必要的,虽然会丧失精确性,但是却为初学者埋下了一个“心锚”,为后续更深入和理性的理解建立了基础。
从宏观视角解释三次握手的工作其实很多人都做过了,但个人觉得自己见过的很多解释还是有些缺乏说服力。
比较常见的解释就是把三次握手的过程套用到两个人的“对话”或者“电话”场景之中。
比如我见过一种比喻是,张三要给李四快递贵重物品。于是他们之间产生类似以下的电话通信(这就类似于三次握手)。
1. 张三对李四说:我准备送快递,你在家吗?
2. 李四对张三说: 我在家,你可以送过来。
3. 张三对李四说:好的,我现在就让快递员出发。
坦率讲,不吹毛求疵的话,这种比喻算是比较好的了,比较准确的映射了三次握手的“三次”通信过程,虽然说从细节上讲还不够精确,但通信方向是对的,次数也是对的。
可这种比喻其实经不起推敲。贵重物品想必大家都有快递过,有的细心的人也许确实会有这么一个提前通知的过程,但是不这么做会有什么问题吗?
其实也不会,快递系统也有自己的验证方式,快递员也会电联预约收件人,以及核验收件人身份。所以这种比喻的问题就是无法从“功能”的角度让读者感受到这个流程的“必要性”。
自己见过的其他的很多比喻也是类似的问题,即它们都是无法体现出“三次握手”在功能上的“必要性”,那种没有的话可靠性就完全无法保证的“必要性”。
所以本文就补充另一种比喻,纯粹是从“必要性”方面的补充,和前面的比喻没有优劣之说,或者说是各有优劣,互为补充。
这就是,你可以把“三次握手”理解为人类地理大发现时代的“开辟新航路”。
自己在学生时代学习世界史时了解到,地理大发现之前奥斯曼帝国垄断了东西方的贸易通道,向过路商贩牟取了巨量财富,西方为了绕开奥斯曼帝国决定“开辟新航路”,从而开起了“大航海时代”。
当时还是初中,没见过什么世面,不知道这世界有多大,于是产生了一些天真的疑惑,比如“开辟新航路”是一件很难的事吗?为什么要专门去做这么一件事,如果想绕过奥斯曼帝国那就绕过好了,为啥要专门搞一个“开辟新航路”的动作?
后来才逐步了解到,在当时的生产力条件下,对于当时西方世界的人而言,要绕过奥斯曼帝国这么巨大的一个国家去到东方世界,可以说比后来的人类登陆月球还要难得多,当中充满了未知与变数。
达伽马为了开辟新航路,从头到尾耗时将近一年,最终终于抵达印度。而且过程中伤亡巨大,出发时4艘船,170名水手,返航时仅剩55名水手两艘船。
所以,“开辟新航路”这件事必须单独先做好,再才能放心搞贸易,否则你准备贸易的商品都会打水漂,然后成为后世探险家寻找的“海底宝藏”。
此时我们再重新回到TCP的“三次握手”上来,整个网络世界其实就可以理解为地理大发现时代的世界,TCP通信则可以理解为东西方的贸易,而“三次握手”就是“开辟新航路”。
网络在很多时候其实都是不稳定的,经常发生延时和丢包,而且也有“网络风暴”,这种不确定性就如地理大发现时代的世界一样。
所以,要在这种不稳定的网络中保证可靠的传输就需要先进行“三次握手”,就如同那个时代东西方贸易前要先开辟航路。否则可能就会像哥伦布一样,以为自己去的是印度,结果到了美洲。
个人觉得这个比喻比“对话”或者“电话”的比喻更能说明“三次握手”在功能上的“必要性”。
当然,它的缺点也很明显,就是不能像另外那些比喻那样精确的映射三次握手中的“三次”通信,比较缺乏细节,所以权当是一种补充吧。