详细介绍一下 TCP 的四次挥手机制,为什么要有 TIME_WAIT 状态,为什么需要四次握手?服务器出现了大量 CLOSE_WAIT 状态如何解决?

当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。

然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。

为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。

大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。

回复

共2条回复 我来回复
  • 迷失技术de小猪
    迷失技术de小猪
    稍等伙伴们,思考简介中~
    评论

    当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。

    然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。

    为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。

    大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。

    1个月前 0条评论
  • 匿名用户
    匿名用户 评论

    当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段, 该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。

    然后服务器也会客户端发送一个 FIN 标志位为 1 的终止报文段,随后客户端回 送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。 其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客 户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。

    为什么要有 TIME_WAIT 状态?因为客户端最后向服务器发送的确认 ACK 是有 可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关 闭了就收不到了。还有一点是避免新旧连接混杂。

    大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。

    1年前 0条评论
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载