计算机网络 - 四次挥手相关问题
通过一些问题来讨论 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 状态
诚恳欢迎大家提出意见
......(待续未完