TCP三次握手和四次挥手浅谈
TCP连接为什么需要三次握手
先上结论,因为TCP是可靠传输协议,即他要尽最大努力确保每一次发送都能被接受到,所以建立连接时需要确认四件事情,即客户端的发送和接收能力,服务器端的发送和接收能力。为了确认这四项能力,二次不够,四次多余。
客户端确认事项: | 服务器的发送能力 | 服务器的接收能力 |
服务器确认事项: | 客户端的发送能力 | 客户端的接收能力 |
首先,我们假设是两次连接。
如上图,①服务器收到SYN J分节后,服务器就可以确认客户端的发送能力没有问题。
②服务器于是返回了一个ACK J+1分节和SYN K分节。
③客户端收到分节ACK J+1,于是客户端根据自己发送的是J,并且收到了J+1,而不是任何其他不连续的数据,从而确认了服务器发送数据是因为接收到了客户端的同步分节J的原因。于是可以得到:服务器的接收能力没有问题。当然,能够收到服务器的信号,自然证明了服务器的发送能力也没有问题。
④然而此时,因为服务器主动发送的请求SYN K(相当于上图第二条线),客户端并没有做出回应。服务器并不能确认客户端的接收能力是否有问题,所以需要三次连接,即最后一次发送的含义:客户端告诉服务器我确实能够接受到你的发送,我的接收能力是没有问题的。最终结果如下图
接下来说一说TCP终止为什么需要四次挥手,同时也说明为什么TCP连接不需要四次握手。
我们看上图,发现服务器→客户端的那一次发送有两个分节。换句话说,像下面这样可不可以。
结果是:可以,但没有必要。如文章开头所说的四项事项都确定之后才能够进行传输。ACK J+1 和 SYN K同时传输完全没有问题,若像上图这样做会多两段什么都不能干的时间,这在要求速度的网络传输中完全没有必要。
大家不妨想一想,为什么在连接建立过程中发起方的信号都叫SYN(同步),回复方的信号都叫ACK(承认)。而关闭连接时的主动发起信号叫FIN(终止),而不叫SYN(同步)呢。
接下来看TCP关闭的流程图
相信看过TCP连接的过程之后,大家这时会有一个问题,为什么2 和 3 不能像TCP连接那样同时发送,而要分开发送。 当客户端断开连接时(大部分情况都是客户端主动断开),服务器需要回条信息来承认这一断开,然而此时服务器也许还在为客户端的上一个请求回传数据,服务器此时并没有到要关闭的时候。
例子如下图,当下载完成后,服务器才会发起关闭。
总之,因为服务器的数据回传和客户端的关闭请求并不同步,所以服务器不能同时发送承认客户端关闭的分节和请求自身关闭的分节,所以需要四次握手来关闭连接。 而TCP连接的建立需要服务器和客户端的同步确认,所以三次连接就足够了。