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

来源:互联网 发布:php程序设计读后感 编辑:程序博客网 时间:2024/06/07 03:12

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包。

0 0