再议三次握手
tcp连接的三次握手和四次挥手,可以说是很多人的惯性认知了,在网上很多人的文章啊博客啊,视屏教程,还有大学老师的授课中也会这样说,tcp的三次握手,这也是面试可以说是必考的题目。然后呢在2019-9-12的夜里突然想到这个问题,这个三次握手到底是怎么回事,怎么会有三次握手呢,我的老师有一句话我记得很清楚,计算机的很多东西都是人类社会的映射,结合实际的生活经验可以理解很多东西,比如数据结构中的队列啊,栈,二叉树,面向对象啊,抽象,继承之类的显然都是,但三次握手是怎么回事,如果以握手来做比为什么是三次,和一个人握三次手这显然是,非常不符合现实逻辑的。那么下面帮大家回顾在一下tcp连接的过程,已经很熟悉的完全可以跳过下面这段
tcp的连接过程
在tcp要建立连接的时候发送方一般是客户端client,接受方一般是服务端server,下面都以这两个为例,
- client第一次向server发送的请求报文包含一个SYN=1,和一个随机数 seq=x,
- 然后server回复给client: SYN=1 和发送的随机数加一 : seq=x+1,
- 最后client再回复给server:ACK=1,
那么大致是这个过程,这个过程中的几个关键字这里说一下
SYN(Synchronize Sequence Numbers)
同步序列编号,ACK(Acknowledge character)
确认字符seq
Sequence number(顺序号码)
真的是三次握手吗
可以看到前两次是同步信号synchronize,最后一次才是真正的确认acknowledge, 那么显然了tcp连接其实只握了一次手。
那么前两个过程究竟是做了什么呢。其实用握手去映射tcp连接的过程,很难去解释,因为tcp的连接过程很难有现实中的映射,首先他是个协议,协议是什么,是人为的规定,就是一个很朴素的想法:要建立连接要事先同步一下,强行解释的话,那么我们看一下在和一个人握手的过程中究竟发生里什么,
- 首先你要和一个人握手,那么你肯定知道这个人,而这个人还和你在同一个房子里,(目标ip,都在以太网中)
- 你望向你要握手的对象,然后那个人也看到了你,两个人目光交汇(同步过程,你望向他,)
- 然后你直直的走向啦个男人,伸出你的手和他握上了(最后的Ack确认)
看看是不是很牵强,所以还是不要随便去拿一些概念去做比,即不准确亦难以描述清楚事实,最重要的是易于误导,和扭曲现实,至少我身边的人包括我在内,初听到这个三次握手都是深以为然,完全没有想到三次握手这件事是多么的诡异。
上面都是我的想法,而且我在书里找到里佐证,在谢希仁-计算机网络-第五版216页下面的一行小字,也就是注解2关于三次握手(three way handshake)的
广为流传的译名 “三次”(three-way)并不准确。这里的"三次"是指:A发送一个报文给B, B发回确认,然后A再加以确认,来回共三次。 实际上这三个报文合起来构成连接建立的“一次握手”
所以确实是握手但不是三次