又被鹅厂搞懵了!
大家好,我是小林。
![](https://filescdn.proginn.com/d7350526ec1225ef5eddf497e89462eb/fb632493c8d2e19b1f35cc1e4cb5419a.webp)
![](https://filescdn.proginn.com/12c7ac948f477d78b9fb385bf9aed7b8/4407c23f609492e308715c95a7748a8f.webp)
![](https://filescdn.proginn.com/fb2c9f4cce6e7294d94fbc246ed7b63e/9cffea44372fbea47dc4f8c92af78056.webp)
tcp_v4_rcv
函数,在该函数和 TIME_WAIT 状态相关的主要代码如下所示:![](https://filescdn.proginn.com/a8d6d990b9abd21027c58867452f43ce/b7871494523a4a396838275bbcdd72f9.webp)
接收到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,则会直接丢掉数据包。
评论