listen函數與TCP連接建立過程的關係
TCP服務端程序創建過程:建立監聽socket,通過bind綁定到服務地址和端口後,調用listen開始監聽服務端口。這時在操作系統內核會建立SYN隊列(未完成握手隊列)和ACCEPT隊列(已完成握手隊列),隊列長度由listen函數backlog參數指定。客戶端調用connect向服務端發起建立TCP連接,服務端處理步驟如下:
1) 客戶端發SYN包到服務端,內核把這一信息放入SYN隊列,同時回一個SYN+ACK包給客戶端,如圖1.1~1.3所示。
2) 客戶端發起服務端的SYN應答ACK包,內核會把連接信息從SYN隊列取出來插入到ACCEPT隊列,如圖2.1~2.3所示。
3) 服務端調用accept接受連接,其實就是從內核ACCEPT隊列中取出已經建立成功的連接,拷貝到用戶空間,並創建一個
新的socket