TCP四次挥手中,主动关闭方最后为什么要等待2MSL之后才能关闭连接?
2017-02-08 20:16
225 查看
和TCP三次同步握手不一样的是,TCP关闭连接用四次挥手来实现,即A—–>B Fin,B—->A ACK, B—–>A Fin,A—-B ACK
A—-B Fin, B—->A ACK,A属于主动关闭方,收到B的ACK之后,A到B的方向连接关闭,即half shutdown,这时不能再发送数据了.
这种状态下B还是可以单向发送数据的,B的数据发送完毕,也可以做关闭动作了,
B——>A Fin,A——> B ACK
B收到ACK,关闭连接,但是A无法知道ACK是否已经到达B,于是开始等待?等待什么呢,假如ACK没有到达B,B会为FIN这个消息超时重传,那如果A等待时间足够,又收到FIN消息,说明ACK没有到达B,于是再发送ACK,知道在足够的时间内没有收到FIN,说明ACK成功到达,这个等待时间至少是:B的timeout+FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL.
MSL:报文段最大生存时间MSL.它是任何报文段被丢弃前网络内的最长时间。
TTL:IP对IP 数据报生存时间限制,255秒,所以MSL一般=TTL = 255 秒
A发出ACK,等待ACK到达对方的超时时间MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到FIN。
A—-B Fin, B—->A ACK,A属于主动关闭方,收到B的ACK之后,A到B的方向连接关闭,即half shutdown,这时不能再发送数据了.
这种状态下B还是可以单向发送数据的,B的数据发送完毕,也可以做关闭动作了,
B——>A Fin,A——> B ACK
B收到ACK,关闭连接,但是A无法知道ACK是否已经到达B,于是开始等待?等待什么呢,假如ACK没有到达B,B会为FIN这个消息超时重传,那如果A等待时间足够,又收到FIN消息,说明ACK没有到达B,于是再发送ACK,知道在足够的时间内没有收到FIN,说明ACK成功到达,这个等待时间至少是:B的timeout+FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL.
MSL:报文段最大生存时间MSL.它是任何报文段被丢弃前网络内的最长时间。
TTL:IP对IP 数据报生存时间限制,255秒,所以MSL一般=TTL = 255 秒
A发出ACK,等待ACK到达对方的超时时间MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到FIN。
相关文章推荐
- TCP第四次挥手为什么要等待2MSL
- 主动关闭TCP连接的一方为什么要有TIME_WAIT状态
- TCP四次挥手关闭连接的图解与实践总结
- TCP为什么要3次握手和4次挥手时等待2MSL
- 服务器端主动关闭连接, 产生的TIME_WAIT状态为什么会占用服务端大量端口?
- TCP四次挥手客户端关闭链接为什么要等待2倍MSL
- 转:TCP为什么要3次握手和4次挥手时等待2MSL、 TCP如何保证消息顺序以及可靠性到达
- TCP释放连接时为什么time_wait状态必须等待2MSL时间(阅读笔记)?
- TCP为什么要3次握手和4次挥手时等待2MSL
- 用了Rime输入法之后,发现IE要关闭保护模式才能输入
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么我们常说很多时候一定要亲身经历了之后才能明白? [转]
- TCP三次握手(建立连接)/四次挥手(关闭连接)
- TCP关闭连接过程(三次握手四次挥手)
- 从数据库连接池中获取连接调用close后,为什么不是关闭物理连接?
- TCP关闭连接(四次挥手)
- TCP三次握手打开连接/四次挥手关闭连接
- Memcached一些特性和限制 。在一些严重的情形下(通常应该不会遇到),服务器将在发送这行错误后关闭连接。这是服务器主动关闭连接的唯一情况。
- 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?
- 为什么要关闭数据库连接,可以不关闭吗?