浅析TCP三次握手四次挥手
TCP(Transmission Control Protocal)传输控制协议,存在于TCP/IP 的第二层传输层当中,TCP是一个可靠的,面向连接的,全双工的数据传输服务。
三次握手
TCP在进行连接的时候会进行三次握手来确认建立连接是否成功。
①首先客户端向服务端发送一个SYN,同时客户端还会附带一个计时器,当服务器在规定时间内没有返回ACK确认时,就需要重新发送这个数据包,这正体现了TCP的可靠性。此时客户端处于SYN_SENT状态
②当服务端收到SYN标志时,会给客户端返回一个自己的SYN标志,同时,返回一个ACK确认标志,表示收到了客户端传来的SYN,此时服务器处于SYN_RECV状态。
③客户端收到服务端发来的SYN和ACK时,会发送一个ACK到服务器,以表示收到了服务器发来的SYN和ACK,此时的客户端处于ESTABLISHAED状态,待服务器收到ack后,变为ESTABLISHED状态,连接建立。
很简单吧?下面简单的解释一下SYN标志和ACK标志,我们需要对它们有些了解
SYN(同步标志)
提示连接的服务端检查序列的编号
FIN(结束标志)
用于结束一个TCP会话,但端口仍然处于开放状态,以接受后面的数据包
用知乎上某答主的话通俗的讲,三次握手就是:
第一次握手:你瞅啥
第二次握手:瞅你咋地
第三次握手:咱俩聊聊吧
TCP连接建立
四次挥手
下面再来看看TCP的四次挥手,在TCP连接将要断开的时候,会进行四次挥手,在四次挥手完毕后断开TCP连接。
①主动断开连接的一方发送一个FIN标志到被动关闭的一方,此时主动方的状态为FIN_WAIT_1
②被动方收到主动方发来的SYN标志时,马上发送一个ACK标志到主动方,以表示确认收到,此时的被动方处于CLOSE_WAIT状态
③随后被动方发送一个FIN标志到主动方,被动方状态变为LAST_ACK状态
④主动方收到后,发送一个ACK标志到被动方,以表示收到,此时的主动方处于TIME_WAIT状态,此时,连接会在2MSL之后关闭
需要注意的是2MSL是2倍的最大报文生存时间,为什么需要等待两倍的最大报文生存时间才关闭连接呢?
当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口