先前在微博發起兩道 TCP 思考題引發熱烈討論。本文深入分析 TCP 連接資源佔用本質,並以 faketcp 實驗驗證理論推論。
單 IP、單埠 TCP 服務程式,理論上可支援多少並發連接?答案 65536 直接刷掉。
被測機 A 跑同樣服務,同交換機有機器 B 可直接收發乙太網框架。讓 A 承擔 10 萬/100 萬並發連接,需要多少 B 的資源?
拋開作業系統層面,僅從 TCP/IP 協議棧角度:
faketcp 客戶端只需完成三次交握:
完成後服務端認為連接已建立。若 faketcp 繞過核心協議棧直接收發 IP 封包,可用不同 IP:PORT 無限建立連接,自身不佔用資源。
faketcp 服務端只需:
同理可無限接受連接而不佔用自身資源。
單獨談「TCP 並發連接數」無意義,因為基本上要多少有多少。更有意義的指標:每秒訊息數、每秒位元組數、活躍並發客戶數。
理論上限計算: IPv4 下,連接由兩端點 {IP, PORT} 定義。伺服器端點固定,客戶端端點自由度為 2^32 (IP) × 2^16 (PORT) = 2^48。扣除保留 IP 段後數量級不變。NAT 不影響此理論上限。
程式碼:GitHub faketcp 專案,可直接 make 編譯。
atomtun0 虛擬網卡 (/dev/net/tun),IP 設為 192.168.0.1/24192.168.0.0/24 網段機器icmpecho.cc,驗證 ping 192.168.0.x 全通rejectall.cc,收到 SYN 回 RSTacceptall.cc,回 SYN+ACK,處理 FIN 斷開discardall.cc,解決「扮演任意 TCP 服務端」connectmany.cc,解決「扮演客戶端向 atom 發起任意多連接」成功驗證:單一 faketcp 程式可建立/接受數萬連接,不消耗作業系統資源(甚至無動態記憶體配置),證明 TCP 連接本質是雙端點狀態協議,而非實體電路連接。