linux的TCP連接數量最大不能超過65535個嗎,那服務器是如何應對百萬千萬的并發的?

首先,問題中描述的65535個連接指的是客戶端連接數的限制。

在tcp應用中,server事先在某個固定端口監聽,client主動發起連接,經過三路握手后建立tcp連接。那么對單機,其最大并發tcp連接數是多少呢?

如何標識一個TCP連接

在確定最大連接數之前,先來看看系統如何標識一個tcp連接。系統用一個4四元組來唯一標識一個TCP連接:{localip, localport,remoteip,remoteport}。

client最大tcp連接數

client每次發起tcp連接請求時,除非綁定端口,通常會讓系統選取一個空閑的本地端口(local port),該端口是獨占的,不能和其他tcp連接共享。tcp端口的數據類型是unsigned short,因此本地端口個數最大只有65536,端口0有特殊含義,不能使用,這樣可用端口最多只有65535,所以在全部作為client端的情況下,一個client最大tcp連接數為65535,這些連接可以連到不同的serverip。

server最大tcp連接數

server通常固定在某個本地端口上監聽,等待client的連接請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽端口也是獨占的,因此server端tcp連接4元組中只有remoteip(也就是clientip)和remote port(客戶端port)是可變的,因此最大tcp連接為客戶端ip數×客戶端port數,對IPV4,不考慮ip地址分類等因素,最大tcp連接數約為2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連接數約為2的48次方。

實際的tcp連接數

上面給出的是理論上的單機最大連接數,在實際環境中,受到機器資源、操作系統等的限制,特別是sever端,其最大并發tcp連接數遠不能達到理論上限。在unix/linux下限制連接數的主要因素是內存和允許的文件描述符個數(每個tcp連接都要占用一定內存,每個socket就是一個文件描述符),另外1024以下的端口通常為保留端口。

所以,對server端,通過增加內存、修改最大文件描述符個數等參數,單機最大并發TCP連接數超過10萬,甚至上百萬是沒問題的。

10 条回复 A文章作者 M管理員
  1. 這個答案純干貨,簡練好理解,太牛了

  2. 48次方是基于remoteip和port可變的,那為什么server的localip和port不能有多個呢?一個server不能host多個服務嘛?如果可以,不是應該峰值就是96次方嘛?\n這里很困惑求解答……

  3. 純干貨,那些說什么負載均衡的純屬沒有理解提問者的困惑點

  4. Tcp連接四元組:localip,localport,remoteip,remoteport. \n單節點最大發起鏈接數理論65535,實際約4萬。單節點最大接受連接數(不考慮地址復用)32位請求 ip乘以16位請求端口,即理論48位,實際受限于本地資源,例如最大打開文件數、內存大小等,因每個連接都要占用資源。

  5. 服務端一個port能接收多個連接,客戶端一個port只能發起一個連接?

  6. 系統用一個4四元組來唯一標識一個TCP連接:{localip, localport,remoteip,remoteport}\n一個client最大tcp連接數為65535,這些連接可以連到不同的serverip\n那么為什么客戶端不能復用端口呢\n按道理四元組應該可以全球唯一確定一個鏈接呀?\n求大佬指點

  7. 配置文件上的參數不是調到一千萬就支持一千萬,軟體調校的參數最終要以實際硬件支持為準。[笑哭]

  8. 這個解釋通俗易懂,有理有據,最主要的就是把四元組寫出來了,之后的分析就能讓人看明白。

  9. 其實講簡單點,每個大型的APP或者網站前面是負載均衡器,后面都有幾十上百萬個服務器給提供服務,負載均衡器把用戶的請求發給后面的服務器處理。現階段不可能有一臺服務器去處理千百萬的并發。

  10. 分享一下,點個贊唄!