如上圖所示,這裡有兩個隊列:syns queue(半連接隊列)和accept queue(全連接隊列)。三次握手中,服務端接收到客戶端的SYN報文後,把相關信息放到半連接隊列中,同時回復SYN+ACK給客戶端。 第三步的時候服務端收到客戶端的ACK,如果這時全連接隊列沒滿,那麼從半連接隊列拿出相關信息放入到全連接隊列中,否則按 tcp_abort_on_overflow
的值來執行相關操作,直接拋棄或者過一段時間在重試。
應用程序接收TCP報文和程序所在伺服器系統接收網路里發來的TCP報文是兩個獨立流程。二者都會操控socket實例,但是會通過鎖競爭來決定某一時刻由誰來操控,由此產生很多不同的場景。例如,應用程序正在接收報文時,操作系統通過網卡又接收到報文,這時該如何處理?若應用程序沒有調用read或者recv讀取報文時,操作系統收到報文又會如何處理?