又被鵝廠搞懵了!
大家好,我是小林。



tcp_v4_rcv 函數(shù),在該函數(shù)和 TIME_WAIT 狀態(tài)相關的主要代碼如下所示:
接收到SKb包后,會調(diào)用__inet_lookup_skb()查找對應的sock結(jié)構(gòu);
如果連接的狀態(tài)是 TIME_WAIT,會跳轉(zhuǎn)到 do_time_wait 處理;
由 tcp_timewait_state_process() 函數(shù)來處理 SKB 包,處理后根據(jù)返回值來做相應的處理。
如果返回值是 TCP_TW_SYN,則說明接收到的是一個「合法」的SYN包(也就是說這個 SYN 包可以接受),這時會首先查找內(nèi)核中是否有對應的監(jiān)聽套接字,如果存在相應的監(jiān)聽套接字,則會釋放TIME_WAIT狀態(tài)的傳輸控制結(jié)構(gòu),跳轉(zhuǎn)到 process 處開始處理,開始建立一個新的連接。如果沒有找到監(jiān)聽套接字會執(zhí)行到 TCP_TW_ACK 分支。
如果返回值是TCP_TW_ACK,則會調(diào)用 tcp_v4_timewait_ack() 發(fā)送ACK,然后跳轉(zhuǎn)到 discard_it,丟掉數(shù)據(jù)包。
如果返回值是TCP_TW_RST,則會調(diào)用 tcp_v4_send_reset() 給對端發(fā)送 RST 包,然后丟掉數(shù)據(jù)包。
如果返回值是TCP_TW_SUCCESS,則會直接丟掉數(shù)據(jù)包。
評論
圖片
表情
