标签:拥塞 连接 获得 准备 IP报头 多个 状态 为什么 技术
备注:在TCP协议中,主动发起请求的一方成为客户端,被动接收请求的一方为服务端,但不管是客户端还是服务端,TCP连接建立完成之后都能发送和接收数据。起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。
第一次握手:客户端向服务端发送一个建立连接的请求报文,此时的报文头部信息中SYN=1,ACK=0,seq=x,请求报文发送之后客户端便进入了SYN-SENT状态。
第二次握手:服务端收到客户端的连接请求的报文后,如果同意连接,则会向客户端发送一个应答报文:SYN=1,ACK=1,seq=y,ack=x+1
服务端在发送完这个报文之后就进入了SYN-RCVD状态。
第三次握手:当客户端收到服务端的连接同意的应答报文后,还要向服务端发送一个确认报文段,表示:服务端发送的连接请求的应答报文已经成功收到。
备注:TCP连接是双向的,所以前两次挥手用于断开一个方向的连接,后两次回收用于断开一个方向的连接。
第一次挥手:
当A认为发送给B的数据已经全部发送完毕,则A主动向B发送释放连接的请求报文,此时,A将进入FIN-WAIT-1状态。
第二次挥手:
当B接收到A发送的请求断开连接的报文之后,会通知相应的程序从A发送到B的数据已经全部完成,并且从A到B的连接将会断开。此时的B将进入 CLOSE-WAIT状态,并且会向A发送同意断开连接的应答报文。
A收到该应答之后,进入FIN-WAIT-2状态,等待B发送连接释放请求。
第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
第三次挥手:
当B向A发送完所有的数据之后,B会向A发送连接释放的请求。此时的B便进入LAST-ACK状态。
第四次挥手:
A收到释放请求后,向B发送确认断开连接的应答报文,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
防止失效的连接请求报文段被服务端接收,从而产生错误。
若建立连接只需两次握手,客户端其实并没有太大的变化,仍然需要在获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。如果在客户端发送连接请求的时候网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便会超时重发请求,此时如果服务端正确接收连接请求并确认应答,双方便开始通信,通信结束后释放连接。
此时如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待接收数据或主动发送数据,但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
6、为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
为了保证第四次挥手之后B能够接收到A的确认应答的报文。 因为A发完确认应答报文后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
标签:拥塞 连接 获得 准备 IP报头 多个 状态 为什么 技术
原文地址:https://www.cnblogs.com/BaoZiY/p/10755422.html