Linux 網路程式設計中,Socket 是進程間通訊的核心抽象。初學者常對「監聽套接字」與「連接套接字」的關係、listen() 佇列長度的含義產生誤解。本文釐清三個關鍵問題。
Socket 是網路編程的術語,代表通訊端點。一對 Socket(客戶端 + 伺服端)構成全雙工通訊管道。
伺服器建立 監聽套接字 綁定 IP:Port 並進入 listen() 狀態。當客戶端發起連接,accept() 會建立一個新的連接套接字 專門處理該客戶端的收發資料。監聽套接字只負責「接待新客」,不參與資料傳輸。
監聽套接字 (listen fd) ← 只接受連接請求
↓ accept()
連接套接字 (conn fd #1) ← 客戶端 A 收發資料
連接套接字 (conn fd #2) ← 客戶端 B 收發資料
...
listen() 第二參數)限制「尚未被 accept() 取走」的連接請求數。ulimit -n),可調整至更大(如 65535)。listen(fd, 5) 中的 5 表示已完成三次交握、等待 accept() 取走的連接佇列最大長度(舊內核含半連接佇列)。若佇列滿,新連接請求會被丟棄(客戶端收到 RST 或超時)。
實際運作:伺服器一邊 accept() 取走連接、一邊處理業務,處理完的連接從佇列移除。只要連接到達速率不持續超過處理速率,5 也能應付 1000 個短連接。
ulimit、somaxconn、tcp_max_syn_backlog 以支撐高併發。