TCP三次握手四次挥手
TCP三次握手的过程
其中:
SYN:同步报文
ACK:确认报文
语境:
A:B我们一起玩吧
B:好啊,走吧
A:走起
然后A、B就一起愉快地玩耍了
1.为什么是三次握手?如果是两次握手呢?
答:三次握手的目的是防止无效报文突然生效导致客户端、服务端两边状态不一致而报错。
如果是两次握手:首先客户端向服务端发送SYN请求报文,但是由于网络或者其他的原因导致该报文阻塞,经过一定的等待时间客户端没有接收到服务端的回复,会重新发送请求报文,这次请求正常,服务端接收到请求报文后,回复一个SYN+ACK,两端进入连接状态。但是此时网络突然变得流畅,原本阻塞的报文发送过来了,服务端以为是客户端又发起了一次连接请求,而客户端却只发送过一次连接请求,从而造成两边状态不一致。
如果是三次握手,必须要客户端发送最后一次ACK确认报文才会建立连接,不会造成两边连接状态不一致,从而实现在不可靠的信道上建立可靠的连接
TCP四次挥手
其中:
FIN:结束报文,发送结束报文的一方需确认自己需要发送的数据已经全部发送完
在最后客户端发送完ACK确认报文后进入超时等待状态,服务端接收到ACK报文后立即关闭
2.为什么连接是三次握手而断开连接是四次挥手?
在三次握手的过程中,服务端接收到SYN报文后,一次性回复了SYN+ACK报文;而四次挥手的过程中,服务端在接收到客户端的FIN结束报文后分两次分别回复ACK报文和FIN报文,这就是挥手比握手多一次的问题所在。那为什么挥手过程中,服务端在接收到客户端的FIN结束报文后不是一次性回复FIN+ACK?
主要是由于服务端在发送FIN结束报文前需要确认自己需要发送的数据是否已经全部发送,如果没有,就可以继续放送数据给客户端,所以服务端先回复了一个ACK报文,在确认自己需要发送的数据全部发送完后再回复FIN结束报文
3.客户端发送完ACK确认报文后为什么不直接关闭,而是进入超时等待状态?
主要是防止ACK报文没有发送成功,服务端一直处于LAST-ACK的阻塞状态。客户端发送ACK报文后进入超时等待状态,如果ACK报文丢失,经过一定时间服务端一直没有接收到ACK报文会重新发送FIN报文,此时处于超时等待状态的客户端仍可以发送ACK报文给服务端。四次挥手实现了在不可靠的信道上进行可靠的连接断开,所谓可靠的连接断开是指双方都各自发送完自己需要发送的数据才断开连接