TCP协议之四次挥手
参考文章 这里
四次挥手过程
四次挥手的过程是全双工的,因此每个方向都必须要进行单独的关闭,这样原则是当一方完成数据发送后发送一个FIN信号给对方,对方收到FIN后就知道这个方向不会再有数据发送过来了,但是仍旧可以发送数据。首先关闭的一方执行主动关闭,另一方执行被动关闭。
- 第一次挥手: Client发送一个FIN,用来关闭比Cient->Server方向数据传输。Client进入FIN_WAIT_1状态。
- 第二次挥手: Server收到FIN后,发送一个ACK给client,确认序号+1 ,随后进入close_wait 状态。
- 第三次挥手: Server 发送一个FIN,用来关闭Client到Server的数据传送, Client进入LAST_ACK状态。
- 第四次挥手: Client收到FIN后,Client进入TIME_WAIT 状态,接着发送一个ACK给Server, 确认收到序号+1,Server进图CLOSED状态完成四次挥手
同时挥手
参考同时关闭的情况
为什么是四次挥手。
客户端再LISTEN状态下,收到简历连接的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN后仅仅表示对方不再发送数据但是还能接受数据,所以在这之后还可以发送数据给对方,因此在关闭时候ACK和FIN一般都分开发送。
TIME_WAIT状态
a) 主动关闭的一方在发送完对对方的FIN报文确认后会进入TIME_WAIT状态。 TIME_WAIT,页脚2MSL状态。
b)什么是2MSL,MSL是最大报文生存时间。MSL是任何报文被丢弃前报文段在网络中最长的生存时间。2MSL也就是这个时间的两倍。
c) 为什么要使用2MSL时间。主要有两个原因:2MSL
其一,保证发送的ACK会成功发送到对方,如何保证?最后的ACK一旦丢失还会有重传的机会。
其二,防止老旧的报文出现在新的连接当中。如果原来连接的报文在网络内游荡时后在相同的两个端口之间建立起新的连接,这时候报文容易被误解,这时候等待这个时间是让旧的报文赶快小时,防止捣乱。
推荐阅读:
【1】 http://blog.csdn.net/hacker00011000/article/details/52319111
【2】 http://www.jianshu.com/p/a1ebc61ce141