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

三次握手:

tcp建立连接需要经过三次握手的过程:

首先客户端向服务器端发送SYN报文,告诉服务器端我要和你建立连接~服务器端收到SYN报文后,向客户端发送SYN+ACK报文,告诉客户端收到你的连接请求了,我们建立连接吧~客户端收到SYN+ACK报文后回复服务器端发送ACK报文,好的我也收到你的连接请求了~三次握手完成建立连接!

然后客户端服务器端就可以愉快的传输数据了!

*简单理解ACK为一个确认报文,回复给另一端确认收到请求,详细理解可参考http://blog.sina.com.cn/s/blog_6ba6e53b01013f16.html

四次挥手:

要想断开TCP连接需要经历四次挥手(可以是客户端主动断开,也可以是服务器端主动断开)一端主动断开后,另一端被迫断开

(假如客户端主动断开)客户端向服务器端发送FIN报文,“喂!我要和你断开连接”,服务器端收到后回复给客户端ACK,“知道啦!”但仅仅是知道啦,并未同意,因为此时服务器端可能还没有将想要发送的数据发送完,此时Socket并未关闭,可继续发送,这个时候客户端就进入FIN_WAIT状态。当服务器端想要发送的发送完后向客户端发送FIN报文,“好了,咱们断开连接吧”,服务器端进入LAST_ACK状态。然后客户端收到后回复服务器端ACK报文,“恩呢”客户端进入TIME_WAIT状态。服务器端收到ACK后关闭连接,然后客户端稍作等待2MSL(最大报文段生存时间)后也关闭(之所以等是因为怕网不靠谱服务器端没有收到ACK不知道客户端同意关闭了,服务器端如果超时没收到会重新发送FIN,2MSL后客户端什么也没收到就知道服务器端收到ACK了)。 自此四次挥手完成,TCP断开连接

***************************************

为什么连接的时候是三次握手,关闭的时候却是四次挥手?
答:因为当服务器端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来建立连接的。但是关闭连接时,当服务器端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。


猜你喜欢

转载自blog.csdn.net/zsy_snake/article/details/80615819