4.TCP的三次握手与四次挥手

4.TCP的三次握手与四次挥手

三次握手
1.客户端将标志位syn=1,随机产生一个值seq=x,并将给数据包发送给服务端,客户端进入SYN-SENT(同步已发送)状态,等待服务端确认
2.服务端收到数据包后由syn=1得知客户端请求建立连接,服务端将标志位syn和ack都置为1,ack=1,随机产生一个值seq=y,并将该数据包发送给客户端用来确认连接请求,服务端进入SYN-RCVD(同步收到)状态,此时操作系统为该TCP连接分配TCP缓存和变量
3.客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给服务端,服务端检查ack是否为y+1,如果正确则连接建立成功

4.TCP的三次握手与四次挥手_第1张图片

四次挥手

1.A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
2.B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
3.A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
4.B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
5.A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。

4.TCP的三次握手与四次挥手_第2张图片

为什么需要2MSL时间?

首先,MSL即Maximum Segment Lifetime,就是最大报文生存时间(即最长报文段寿命),是任何报文在网络上的存在的最长时间,超过这个时间报文将被丢弃。《TCP/IP详解》中是这样描述的:MSL是任何报文段被丢弃前在网络内的最长时间。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒、1分钟、2分钟等。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server(服务)端收到Client(客户)端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

你可能感兴趣的:(4.TCP的三次握手与四次挥手)