「客户端」学习网络编程,不了解TCP协议?难怪面试被刷下去,还不来学习!( 八 )
03 TCP 连接断开TCP 四次挥手过程和状态变迁
天下没有不散的宴席 , 对于 TCP 连接也是这样 ,TCP 断开连接是通过四次挥手方式 。
双方都可以主动断开连接 , 断开连接后主机中的「资源」将被释放 。
- 客户端打算关闭连接 , 此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文 , 也即 FIN 报文 , 之后客户端进入 FIN_WAIT_1 状态 。
- 服务端收到该报文后 , 就向客户端发送 ACK 应答报文 , 接着服务端进入 CLOSED_WAIT 状态 。
- 客户端收到服务端的 ACK 应答报文后 , 之后进入 FIN_WAIT_2 状态 。
- 等待服务端处理完数据后 , 也向客户端发送 FIN 报文 , 之后服务端进入 LAST_ACK 状态 。
- 客户端收到服务端的 FIN 报文后 , 回一个 ACK 应答报文 , 之后进入 TIME_WAIT 状态
- 服务器收到了 ACK 应答报文后 , 就进入了 CLOSE 状态 , 至此服务端已经完成连接的关闭 。
- 客户端在经过 2MSL 一段时间后 , 自动进入 CLOSE 状态 , 至此客户端也完成连接的关闭 。
这里一点需要注意是:主动关闭连接的 , 才有 TIME_WAIT 状态 。
为什么挥手需要四次?
再来回顾下四次挥手双方发
FIN
包的过程 , 就能理解为什么需要四次了 。- 关闭连接时 , 客户端向服务端发送 FIN 时 , 仅仅表示客户端不再发送数据了但是还能接收数据 。
- 服务器收到客户端的 FIN 报文时 , 先回一个 ACK 应答报文 , 而服务端可能还有数据需要处理和发送 , 等服务端不再发送数据时 , 才发送 FIN 报文给客户端来表示同意现在关闭连接 。
ACK
和 FIN
一般都会分开发送 , 从而比三次握手导致多了一次 。为什么 TIME_WAIT 等待的时间是 2MSL?
MSL
是 Maximum Segment Lifetime , 报文最大生存时间 , 它是任何报文在网络上存在的最长时间 , 超过这个时间报文将被丢弃 。 因为 TCP 报文基于是 IP 协议的 , 而 IP 头中有一个 TTL
字段 , 是 IP 数据报可以经过的最大路由数 , 每经过一个处理他的路由器此值就减 1 , 当此值为 0 则数据报将被丢弃 , 同时发送 ICMP 报文通知源主机 。MSL 与 TTL 的区别:MSL 的单位是时间 , 而 TTL 是经过路由跳数 。 所以 MSL 应该要大于等于 TTL 消耗为 0 的时间 , 以确保报文已被自然消亡 。
TIME_WAIT 等待 2 倍的 MSL , 比较合理的解释是:网络中可能存在来自发送方的数据包 , 当这些发送方的数据包被接收方处理后又会向对方发送响应 , 所以一来一回需要等待 2 倍的时间 。
比如 , 如果被动关闭方没有收到断开连接的最后的 ACK 报文 , 就会触发超时重发 Fin 报文 , 另一方接收到 FIN 后 , 会重发 ACK 给被动关闭方 ,一来一去正好 2 个 MSL 。
2MSL
的时间是从客户端接收到 FIN 后发送 ACK 开始计时的 。 如果在 TIME-WAIT 时间内 , 因为客户端的 ACK 没有传输到服务端 , 客户端又接收到了服务端重发的 FIN 报文 , 那么 2MSL 时间将重新计时 。在 Linux 系统里
2MSL
默认是 60
秒 , 那么一个 MSL
也就是
推荐阅读
- 工业互联网@程序员的术与道:术——编程基本功之网络编程
- 可可酱不插电,无网络限制,学习工作效率更高,移动A4打印机:760g
- Hi威海客户端南海新区:精准护航让企业“满血复活”
- 南方Plus客户端向全球直播卖货,广州皮具商拟抱团进驻网上广交会
- 南方Plus客户端全国首台校园病毒智能监测机在深圳试用,风险“早”知道
- 简简科技机器学习修炼手册:从倔强青铜到最强王者
- 新华网客户端1800亿元投资发力数字新基建,广州市首批73个数字新基建重大项目签约
- 南方Plus客户端广州给大湾区带来什么新气象?,南方观察|1800亿新基建项目
- 北京日报客户端国家卫健委:互联网医疗不得突破现有法律法规
- 南方Plus客户端这款以色列研发的temi机器人有何亮点?,智能家居时代