[网络协议] Tcp协议中的临界状态半打开、半关闭、TIME_WAIT、CLOSE_WAIT
前言:
tcp协议栈是个面向连接的协议栈,其面向连接不是说真的有一个什么连接在,而是收发双方在协议栈层面各自会维持一个数据结构,这个数据结构保存了当前通讯的状态、数据和其他重要信息。可以理解为tcp的状态机诠释了什么是 “有链接”。
状态机:
半打开:
半打开状态出现在 三次握手阶段,主动建立链接方 和 被动建立链接方都会进入这个状态。
三次握手由 2个 SYN 和 2个 ACK组成,发送出SYN 还没 收到对端的 ACK的状态就是半打开状态,所以主动/被动都可能进入半打开状态。
有关超时:
发送SYN后,一定时间内没有收到ACK,则会再次发送SYN,之后会按照倍数间隔的模式继续发送6次,63秒后超时
半打开状态是 SNY 洪流攻击的切入点。
半关闭:
半关闭状态出现在 四次挥手阶段,主动关闭链接方 和 被动关闭链接方 都会进入这个状态。
三次握手由 2个 FIN 和 2个 ACK组成,发送出FIN 还没 收到对端的 ACK的状态就是半关闭状态,所以主动/被动都可能进入半打开状态。
有关超时:不涉及超时机制
注:TIME_WAIT 不是半关闭状态,此时已经走完四次挥手了; CLOSE_WAIT也不是半关闭状态,因为此时作为被动关闭方,其已经收到对端的FIN,只是应用程序没有主动关闭socket(读socket发现读到文件结束符,然后调用close函数)。
四次挥手流程图:
图片来源:https://www.cnblogs.com/lshs/p/6038472.html
TIME_WAIT:
TIME_WAIT状态仅发生在 主动关闭链接的一侧,进入此状态说明四次挥手流程已经结束。主动关闭侧需要保持此状态2MSL时长,一般在2分钟左右。
维持此状态的目的在于确保所有对端的数据都被接受或者被网络丢弃,起到保护作用。
CLOSE_WAIT:
CLOSE_WAIT状态仅发生在 被动关闭链接 的一侧,进入此状态说明收到对端的FIN,此时本端进入CLOSE_WAIT状态,需要应用程序调用close函数来触发对FIN的ACK,并清理资源后发送自己的FIN。
注:进入此状态,如果不调用close,则四次挥手永远只能停留在第一步,这也会导致主动关闭侧处于FIN_WAIT_1状态