Freud's Blog

Stay hungry, stay foolish. 少年辛苦终身事,莫向光阴惰寸功。

TCP/IP协议三次握手四次挥手过程

Posted on By Freud Kang

三次握手建立连接

  • 初始阶段:client状态为CLOSED, server状态为LISTEN
  • 1.SYN阶段:client向server发送SYN报文请求建立连接,client进入SYN-SEND状态
  • 2.SYN/ACK阶段:server收到SYN报文,进入SYN-RCVD状态,回复SYN/ACK报文给client,并为这次连接分配资源。
  • 3.ACK阶段:client收到AYN/ACK报文后向server回复SYN报文,并为这次连接分配资源。
  • 至此连接建立。

四次挥手

连接中断可以由server或者client中任一端发起,上图中为client发起,如果是server端发起,则流程中1,2,3,4步骤方向互换即可。

  • 初始阶段:client和server状态皆为ESTABLISHED
  • 1.FIN阶段:client向server发送FIN发起中断请求,client进入FIN-WAIT-1状态,等待接收server的ACK
  • 2.ACK阶段:server端接到FIN报文(即client向server宣告没有数据要继续传输了,但是如果server端还有数据没有向client传输完成,那么不需要此时关闭socket,数据可以继续传输,只需要回复client ACK即可), server向client回复ACK报文,并进入CLOSE-WAIT状态, client在收到ACK之后进入FIN-WAIT-1状态,等待接收server的FIN
  • 3.FIN阶段:server端数据传输完成,向client端发送FIN报文,进入等待client ACK阶段
  • 4.ACK阶段:client在收到server的FIN报文后,向server回复ACK报文,但是client并不确认server是否一定能收到ACK报文,所以等待2MSL之后才会关闭client自己,server在收到ACK报文后会立即关闭
  • client在等待2MSL后依然没有收到server回复,证明server已正常关闭, client自动关闭

TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第三次挥手完成后发送了第四次挥手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次挥手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

MSL(Maximum Segment Lifetime): RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

參考資料

《TCP IP详解卷一》

TCP协议中的三次握手和四次挥手(图解) : https://www.cnblogs.com/thrillerz/p/6464203.html