tcp 四次挥手状态

a给b发fin,a进入fin_wait_1。
b收到fin之后,内核发送ack(a收到后进入fin_wait_2),之后b状态就变成了close_wait
之后b给a发送fin,这时候b进入last_ack
a收到b发送的fin之后,发送ack,此时a变成time_wait
b收到ack后状态变成closed

close_wait的作用是对方已经不能给我发送数据,因为它已经fin了。
我仍然可以给对方发送数据,我还没有close。
close_wai的意义就是保证应用层能处理剩余逻辑。TCP 是内核协议栈管理的,但是否关闭要应用层决定。应用程序可能还要把缓存里的数据写完、做一些清理,再调用 close()。体现了“半关闭(half-close)”的机制。TCP 支持单向关闭:一方先关闭写,另一方还能继续写。CLOSE-WAIT 就是这种机制的体现。
如果应用层没有调用 close(),连接会一直停留在 CLOSE-WAIT 状态。
这通常说明 程序有 bug(没有正确关闭 socket)。
常见表现:
netstat -anp | grep CLOSE_WAIT 显示很多连接。
系统 fd 数量飙升,最终导致 “too many open files” 错误。

time_wait的含义是主动关闭方收到 FIN 并确认后,还要等待 2MSL 时间,确保对方收到了ACK。这里等待 2 倍报文最大生存时间 (MSL),避免旧连接的报文影响新连接。

评论

(= ̄ω ̄=)··· 暂无内容!

回复

邮箱