首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux Socket 核心概念:監聽套接字、連接佇列與並發處理

     編輯:程式設計綜合問答

Linux 網路程式設計中,Socket 是進程間通訊的核心抽象。初學者常對「監聽套接字」與「連接套接字」的關係、listen() 佇列長度的含義產生誤解。本文釐清三個關鍵問題。

1. 什麼是套接字?

Socket 是網路編程的術語,代表通訊端點。一對 Socket(客戶端 + 伺服端)構成全雙工通訊管道。

2. 為什麼不同客戶端共用一個監聽套接字?

伺服器建立 監聽套接字 綁定 IP:Port 並進入 listen() 狀態。當客戶端發起連接,accept() 會建立一個新的連接套接字 專門處理該客戶端的收發資料。監聽套接字只負責「接待新客」,不參與資料傳輸。

監聽套接字 (listen fd)  ← 只接受連接請求
    ↓ accept()
連接套接字 (conn fd #1) ← 客戶端 A 收發資料
連接套接字 (conn fd #2) ← 客戶端 B 收發資料
...

3. 系統能接受多少連接?

  • 監聽佇列長度(listen() 第二參數)限制「尚未被 accept() 取走」的連接請求數。
  • 系統級限制:預設單進程檔案描述符上限 1024 (ulimit -n),可調整至更大(如 65535)。
  • 100 個並發連接屬小規模,現代 Linux 輕鬆支援萬級並發(配合 epoll/kqueue)。

4. listen() 第二參數真實含義

listen(fd, 5) 中的 5 表示已完成三次交握、等待 accept() 取走的連接佇列最大長度(舊內核含半連接佇列)。若佇列滿,新連接請求會被丟棄(客戶端收到 RST 或超時)。

實際運作:伺服器一邊 accept() 取走連接、一邊處理業務,處理完的連接從佇列移除。只要連接到達速率不持續超過處理速率,5 也能應付 1000 個短連接。

關鍵總結

  • 一個監聽 Socket,N 個連接 Socket。
  • 佇列長度 ≠ 最大並發連接數。
  • 調整 ulimit、somaxconn、tcp_max_syn_backlog 以支撐高併發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved