TCP协议建立三次握手的过程如下:
第一次握手:客户端向服务器发送SYN段(SYN=1),请求建立新连接
第二次握手:服务器收到SYN段后,向客户端发送的SYNACK段(SYN=1,ACK=1)进行确认,同意建立新连接
第三次握手:客户端收到服务器的SYNACK段后,向服务器发送ACK确认段(ACK=1),并确认连接建立成功;服务器收到ACK确认段后,也确认连接建立成功
原因:
1)为了确保连接建立的双方彼此完全清楚对方状态(如初始序列号和接收窗口大小),从而保证可靠、稳定地建立连接
2)通过三次握手建立连接还可以有效地预防过期、失效的连接请求到达后,导致无效连接的建立
3)两次握手建立连接是不可行的,因为网络存在数据丢失;第二次握手控制段可能丢失,这样主动发起连接的一方由于没有收到第二次握手控制段,则无法建立连接,而接受连接建立的一方则认为连接已经建立,从而出现无效链接
有种情况就是客户端发起了请求,但是过了超时时间又重发的连接请求,而第一个请求并没有丢失,服务端收到syn后,发送了ACK,确认了连接,客户端收到ACK也确认了连接。
这时第二次发送的连接请求阻塞在网络上,但没有丢失,并最终在客户端断开连接后,到达了服务器,此时服务器会理解为新的连接请求,并发送ACK确认连接建立
这一连接并不属于有效连接,属于半连接,但是服务器已经为该连接分配了资源;这类半连接的存在会消耗服务器的资源,降低服务器性能,甚至导致拒绝服务;
4次挥手:
TCP协议断开连接的四次挥手过程:
第一次挥手:客户向服务器发送FIN段(FIN=1),请求释放连接,等待服务器确认
第二次挥手:服务器向客户发送ACK段(ACK=1)
第三次挥手:服务器向客户发送FIN段(FIN=1),请求释放连接,等待客户确认
第四次挥手:客户向服务器发送ACK段,并等待2MSL时间后关闭连接;服务器收到ACK段后马上关闭连接
MSL是最大段生存时间,是任何TCP段被丢弃前在网络内“存活”的最长时间
TCP协议规范规定的MSL是2min,但实际系统在实现TCP时设定的时间有所不同
客户在TIME_WAIT状态之所以要等待2MSL时间才真正释放连接,一方面是为了以防最后一次ACK段丢失,会导致服务器重发FIN,这样在客户端真正释放连接前还可以再次发送ACK段,尽可能确保服务器尽快释放连接;另一方面是为了保证在2MSL期间,该连接的本地端点地址(IP+PORT)不被再次使用,避免可能的较早连接请求到达,被误认为时新连接请求