您的位置:首页 > 理论基础 > 计算机网络

TCP协议的三次握手和四次挥手

2017-05-08 13:54 288 查看

TCP三次握手

如下图所示为TCP协议三次握手的过程:



1.第一次握手

客户端发送SYN(SYN=j)包给服务器,然后进入SYN_SEND状态,等待服务器的确认;

2.第二次握手

服务端收到客户端发送过来的SYN包,然后发送确认收到客户端SYN的包(ACK=j+1),然后还要发送自己的的SYN包(SYN=k),接着服务端进入SYN_RECV状态;

3.第三次握手

客户端收到服务端的SYN+ACK包,然后向服务端发送确认包(ACK=k+1),服务端收到确认包之后,客户端和服务端进入到ESTABLISHED状态,完成第三次握手,可以进行数据传输。

为了方便理解,可以看以下图片



TCP四次挥手

如下图所示为TCP协议断开连接,四次挥手的过程:



1.第一次挥手

客户端发送FIN包给服务器,然后进入FIN_WAIT_1状态。

意思是:客户端已经没有数据发送给服务器了,但是如果服务器还有数据没有发送完成,可以继续发,不用着急关闭socket。

2.第二次挥手

服务端收到FIN包,然后发送ACK包给客户端,服务端进入CLOSE_WAIT状态。客户端收到ACK包,进入FIN_WAIT_2状态。

意思是:服务端已经收到了FIN包,但是还没有准备好,请客户端继续等待消息。

3.第三次挥手

服务端发送FIN包,然后进入到LAST_ACK状态。

意思是:服务端已经准备好关闭连接了。

4.第四次挥手

客户端收到FIN包之后,就知道可以关闭连接了,然后发送ACK包给服务端,客户端进入TIME_WAIT状态。经过2MSL(最大报文生存时间)依然没有收到回复,则证明服务端已经关闭,那么客户端也可以关闭连接了,进入CLOSED状态。服务端收到ACK包之后,关闭连接,进入CLOSED状态。

四次挥手可以参看以下图片理解



问题

1.为什么TCP连接只有三次握手,断开却有四次挥手?

答:因为在连接的时候,服务器收到客户端的请求之后,可以直接发送SYN+ACK包,其中SYN包是用于同步,ACK包是用于应答。

但是在关闭TCP连接时候,服务器收到FIN包之后,服务器不会立即关闭连接,只能先发送ACK包,告诉客户端,服务器已经收到了FIN包。只有当服务器所有的包都已经发送完成之后,才能够发送FIN包给客户端,而不能够一起发送,因此必须得四次挥手。

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

答:因为网络是不稳定的,为了避免服务端未收到ACK包而一直处于LAST_ACK状态,客户端需要等待2MSL时间,在这段期间,如果收到FIN包,则说明ACK包已经丢失,服务端未收取到ACK,而引发的超时重传,此时应当重新发送ACK包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp