三次握手
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
过程如下:
- 第一次握手:客户端给服务端发一个 SYN 报文,传达信息:“你好,我想建立连接”
- 第二次握手:回传SYN+ACK报文,传达信息:“好的,可以建立连接”
- 第三次握手:回传ACK报文,传达信息:“好的,我知道了,那我们链接吧”,然后连接就建立了
上述每一次握手的作用如下:
- 第一次握手:客户端发送网络包,服务端收到了 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
- 第二次握手:服务端发包,客户端收到了 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常
- 第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常
通过三次握手,就能确定双方的接收和发送能力是正常的。之后就可以正常通信了
为什么不是两次握手?
如果是两次握手,发送端可以确定自己发送的信息能对方能收到,也能确定对方发的包自己能收到,但接收端只能确定对方发的包自己能收到,无法确定自己发的包对方能收到。 并且两次握手的话, 客户端有可能因为网络阻塞等原因会发送多个请求报文,延时到达的请求又会与服务器建立连接,这样又建立了新的端口。 浪费掉许多服务器的资源。
四次挥手
tcp终止一个连接,需要经过四次挥手
过程如下:
- 第一次挥手:客户端和服务端打电话,通话即将结束后。
- 第二次挥手:客户端说“我没什么要求了”,服务端回答“我知道了”,但是服务端可能还有话要讲。
- 第三次挥手:客户端不能要求服务端跟着自己的节奏结束通话,于是服务端巴拉巴拉说了一通,最后服务端说“我说完了”
- 第四次挥手:客户端回答“我知道了”,这样通话才算结束
四次挥手原因
服务端在收到客户端断开连接Fin报文后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN报文断开连接,因此需要四次挥手