TCP 三次握手详解
首先非常明确的是两次握手是最基本的。
第一次握手,客户端发了个连接请求消息到服务端,服务端收到信息后知道
自己与客户端是可以连接成功的,但此时客户端并不知道服务端是否已经接收到
了它的请求,所以服务端接收到消息后得应答,客户端得到服务端的反馈后,才
确定自己与服务端是可以连接上的,这就是第二次握手。
客户端只有确定了自己能与服务端连接上才能开始发数据。所以两次握手肯
定是最基本的。
看到这里,你或许会问,那么为什么需要第三次握手呢?我们来看一下,假
设一下如果没有第三次握手,而是两次握手后我们就认为连接成功了,那么会发
生什么?第三次握手是为了防止已经失效的连接请求报文段突然又传到服务端,
因而产生错误。
例如发起请求遇到类似这样的情况:客户端发出去的第一个连接请求由于某
些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达服务端,
这是一个早已失效的报文,但是此时服务端仍然认为这是客户端的建立连接请求
第一次握手,于是服务端回应了客户端,第二次握手。
TCP 三次握手如果只有两次握手,那么到这里,连接就建立了,但是此时客
户端并没有任何数据要发送,而服务端还在傻傻的等候佳音,造成很大的资源浪
费。所以需要第三次握手,只有客户端再次回应一下,就可以避免这种情况。
如果让我来理解的话,就好比:
某天晚上,你在校园里碰到了你的舍友,但因为天色太暗,你不能 100%确
定是你的舍友,所以需要喊名的方式来确定对方是否认识自己。
你首先向舍友喊名(syn),舍友听到你的喊名后,向你招手(ack)。你看到
舍友向你招手后确认了舍友看到了自己(进入 established 状态)。
但舍友在招手后,在黑夜中看你看的不是很清楚,所以也有点不确定,于是
想确认一下。于是乎舍友也向你喊名(syn),你听到舍友喊名后知道对方是在寻
求自己的确认,于是你也向舍友招手(ack),舍友看到你的招手后确认了你就是
在向自己喊名(进入 established 状态)。
最后两人加快脚步,走到一块,一起回了宿舍。
回顾,这个过程中总共有四个动作,
1、你喊名 2、舍友招手 3、舍友喊名 4、你招手
其中舍友连续进行了两个动作,先是招手(回复对方),然后再喊名(寻求
确 认 ), 实 际 上 我 们 可 以 将 这 两 个 动 作 合 成 一 个 动 作 , 喊 名 的 同 时 招 手
(syn+ack)。于是四个动作就简化成了三个动作。
1、你喊名 2、舍友招手并喊名 3、你招手
这就是 TCP 三次握手的本质,中间的一次动作是两个动作的合并。通过这个
例子,你对 TCP 三次握手有没有进一步的理解呢?