当前位置: 首页 > news >正文

计算机网络 - 四次挥手相关问题

通过一些问题来讨论 TCP 的四次挥手断开连接

  • 说一下四次挥手的过程?
  • 为什么需要四次呢?
  • time-wait干嘛的,close-wait干嘛的,在哪一个阶段?
  • 状态CLOSE_WAIT在什么时候转换成下一个状态呢?
  • 为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
  • 服务端主动发起关闭还是客户端主动发起关闭TCP?

1. 说一下四次挥手的过程?

首先要说明,通信双发都可以主动断开连接,下面以客户端主动断开连接为例(后面几个问题照样):

第一次挥手,客户端发送 FIN 报文给服务端,表示不再发送数据了,但还能接收数据,报文中会指定一个序列号,客户端处于 FIN-WAIT-1 状态

第二次挥手,服务端在接收到客户端的 FIN 包后,会把客户端的序列号值 +1 作为 ACK 并发送,表示收到,此时服务端处于 CLOSE-WAIT状态。但服务端可能还有数据要发送,所以不会立即关闭发送通道

之后客户端接收到服务端发送的 ACK,进入 FIN-WAIT-2状态

第三次挥手,服务端将剩余数据发送完成后,会发送一份携带 FIN 的报文给客户端,且指定一个序列号,告诉客户端自己也不再发送数据了,服务端处于 LAST-ACK 阶段

第四次握手,客户端收到 FIN 后,就会将服务端的序列号值 +1 作为 ACK 报文回应,表示收到。客户端此时还处于 TIME-WAIT 阶段,要等待 2MSl 才会进入关闭状态,至此客户端完成连接的关闭。

服务端在收到客户端发来的 ACK报文后,就会进入关闭状态,不再接收和发送数据,至此服务端完成连接d

2. 为什么需要四次呢?

主要原因在于 TCP 是全双工通信,双方需要独立关闭各自的发送和接收通道

为什么不能和连接一样进行三次握手?

因为在客户端断开发送通道后,服务端可能还需要发送数据,不能立即关闭,所以 ACK 和 FIN 必须分开发送

3. time-wait干嘛的,close-wait干嘛的,在哪一个阶段?

需要 TIME-WAIT 状态简单说就两个原因:一个是优雅的关闭 TCP 连接,也就是尽量保证被动关闭的一端能够收到它自己发出去 FIN 报文的 ACK 确认报文。另一个是处理延迟的重复报文,避免连续两个使用相同四元组的连接,前一个的报文干扰后一个连接。以上两个目的都是由主动断开的一方在 TIME-WAIT 状态等待 2MSL 时间来保证的

第一个目的比较好理解,理论上 1MSL 的时间就足够确定被动关闭端已经接收到了 ACK 值。第二个目的的话,先等第一个 MSL 确保主动关闭端发出的最后一个 ACK 值从网络消失,再等第二个 MSL 是为了防止对端在收到这个 ACK 前的一刹那时间可能触发重传机制,等这个重传的 FIN 报文消失的时间也需要 1MSL,总共就是 2MSL

CLOSE-WAIT 状态需要的原因就是 TCP 为什么需要四次握手而不是三次握手的原因,主要就是在一二次握手后,服务端可能还有遗留的数据需要处理,也就是需要确保数据的完整性。在处理完之后会主动向客户端发送 FIN 报文,进入 LAST-ACK 状态

4. 状态CLOSE_WAIT在什么时候转换成下一个状态呢?

在服务端向客户端发送 FIN 包的时候,就会进入到 LAST-ACK状态

5. 为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?

MSL 是最长分段寿命,TIME-WAIT 状态等待 2MSL的原因有许多

因为客户端在发送完 ACK 报文后,不能确定是否到达了服务端,所以要等待 2MSL 的时间确保 ACK 可以到达服务端。如果在这个时间内 ACK 没有到达的话,则接收方会重新发送 FIN 报文

其次还能确保当前连接的所有报文都已经过期

6. 服务端主动发起关闭还是客户端主动发起关闭TCP?

都可以,主动关闭的一段会有 TIME-WAIT 状态,被动关闭的一段有 CLOSE-WAIT 状态


诚恳欢迎大家提出意见

......(待续未完


http://www.mrgr.cn/news/98480.html

相关文章:

  • github配置ssh,全程CV
  • 2025年第十六届蓝桥杯省赛JavaB组真题回顾
  • 1×1卷积与GoogleNet
  • SMART PLC 脉冲轴展示屏项目调试记录(UDP通信+脉冲轴控制)
  • 03 UV
  • vue学习笔记06
  • 微服务1--服务架构
  • How to run ERSEM
  • 详解LeetCode中用字符串实现整数相加,字符串转整数及其溢出处理详解
  • Domain Adaptation领域自适应--李宏毅机器学习笔记
  • rk3588 驱动开发(一)字符设备开发
  • Python 垃圾回收机制全解析:内存释放与优化
  • Windows 图形显示驱动开发-WDDM 1.2功能—无显示器系统支持
  • WINUI——Background小结
  • 【Pandas】pandas DataFrame iterrows
  • NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?
  • chain_type=“stuff 是什么 ? 其他方式有什么?
  • STM32F407实现内部FLASH的读写功能
  • 天元证券|8家汽车零部件上市公司一季度业绩预喜
  • MySQL索引和事务