详细介绍一下 TCP 的四次挥手机制,为什么要有 TIME_WAIT 状态,为什么需要四次握手?服务器出现了大量 CLOSE_WAIT 状态如何解决?
当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。
然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。
为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。
大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。
-
当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。
然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。
为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。
大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。
1个月前 -
匿名用户 评论
当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。
然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。
为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。
大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。
1年前