又被鹅厂搞懵了!
大家好,我是小林。
tcp_v4_rcv
函数,在该函数和 TIME_WAIT 状态相关的主要代码如下所示:接收到SKb包后,会调用__inet_lookup_skb()查找对应的sock结构;
如果连接的状态是 TIME_WAIT,会跳转到 do_time_wait 处理;
由 tcp_timewait_state_process() 函数来处理 SKB 包,处理后根据返回值来做相应的处理。
如果返回值是 TCP_TW_SYN,则说明接收到的是一个「合法」的SYN包(也就是说这个 SYN 包可以接受),这时会首先查找内核中是否有对应的监听套接字,如果存在相应的监听套接字,则会释放TIME_WAIT状态的传输控制结构,跳转到 process 处开始处理,开始建立一个新的连接。如果没有找到监听套接字会执行到 TCP_TW_ACK 分支。
如果返回值是TCP_TW_ACK,则会调用 tcp_v4_timewait_ack() 发送ACK,然后跳转到 discard_it,丢掉数据包。
如果返回值是TCP_TW_RST,则会调用 tcp_v4_send_reset() 给对端发送 RST 包,然后丢掉数据包。
如果返回值是TCP_TW_SUCCESS,则会直接丢掉数据包。
评论