请简述一下三次握手四次挥手?
-
客户端发送带有SYN标志,以及随机生成的seq报文到服务器
-
服务器收到报文后返回一个带有SYN标志以及一个答复ack给客户端
-
客户端再次发送带有ack标志的报文给服务器
三次握手结束,此时客户端与服务器可以开始通话
因为tcp连接是双向的,因此必须保持双向之间都能收到并且确认就像如下
A说:b我想给你通话,你收到了么
B说:我收到了,你准备好了么
A说:准备好了咱们准备通话吧
四次挥手过程:
上面已经说过tcp连接是双向的,因此每个方向都必须单独的关闭, -
客户端发起带有FIN标志的报文给服务器请求关闭通信
-
服务器收到之后回复ack确认客户端的关闭请求
-
服务器向客户端发送带有FIN标志的报文请求关闭通信
-
客户端向刘服务器发送ack确认服务器的关闭请求!
2MSL
在四次挥手最后一次的规程中主动发起FIN标志的一方要等待的这段时间我们 称之为2MSL(即最大报文生存时间)
他可以让四次挥手关闭流程更加可靠
防止丢包对后续的连接产生影响
为什么主动发起FIN的一方在TIME_WAIT状态要等待2MSL?- 为了保证主动发起FIN标志一方最后发送的额ACK报文能后到达服务器.因为这个报文可能丢失.造成使处于LAST_ACK状态的额服务器接受不到这个报文.当超时的时候服务器会重新发送FIN以及ack报文给客户端.此时在2msl时间的客户端就会接收到这个报文然后重新发送ack确认,重启计时器,最好的状态是客户端和服务器都能进入close状态.如果客户端不等待2msl而是发送完最后 一个ack之后立马关闭.那么就无法接收到服务器重传的fin,ack报文.服务器也就接收不到ack确认,无法进入close状态
- 、防止已失效的连接请求报文段出现在下次连接中。客户端在发送完最后一个ACK确认报文段
后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样
就可以使下一个新的连接中不会出现这种旧的连接请求报文段