詳解Linux伺服器Tcp最大連線數

2021-08-13 14:45:08 字數 2690 閱讀 7405

網路程式設計

在tcp應用中,server事先在某個固定埠監聽,client主動發起連線,經過三路握手後建立tcp連線。那麼對單機,其最大併發tcp連線數是多少?

如何標識乙個tcp連線

在確定最大連線數之前,先來看看系統如何標識乙個tcp連線。系統用乙個4四元組來唯一標識乙個tcp連線:。

client最大tcp連線數

client每次發起tcp連線請求時,除非繫結埠,通常會讓系統選取乙個空閒的本地埠(local port),該埠是獨佔的,不能和其他tcp連線共享。tcp埠的資料型別是unsigned short,因此本地埠個數最大只有65536,埠0有特殊含義,不能使用,這樣可用埠最多只有65535,所以在全部作為client端的情況下,最大tcp連線數為65535,這些連線可以連到不同的server ip。

server最大tcp連線數

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

上面給出的是理論上的單機最大連線數,在實際環境中,受到機器資源、作業系統等的限制,特別是sever端,其最大併發tcp連線數遠不能達到理論上限。在unix/linux下限制連線數的主要因素是記憶體和允許的檔案描述符個數(每個tcp連線都要占用一定記憶體,每個socket就是乙個檔案描述符),另外1024以下的埠通常為保留埠。在預設2.6核心配置下,經過試驗,每個socket占用內存在15~20k之間。

影響乙個socket占用記憶體的引數包括:

rmem_max

wmem_max

tcp_rmem

tcp_wmem

tcp_mem

grep skbuff /proc/slabinfo

對server端,通過增加記憶體、修改最大檔案描述符個數等引數,單機最大併發tcp連線數超過10萬 是沒問題的,國外 urban airship 公司在產品環境中已做到 50 萬併發 。在實際應用中,對大規模網路應用,還需要考慮c10k 問題。

下面再詳解一下檔案控制代碼限制和埠限制兩大常識

常識一:檔案控制代碼限制

在linux下編寫網路伺服器程式的朋友肯定都知道每乙個tcp連線都要佔乙個檔案描述符,一旦這個檔案描述符使用完了,新的連線到來返回給我們的錯誤是「socket/file:can't open so many files」。

這時你需要明白作業系統對可以開啟的最大檔案數的限制。

程序限制

執行 ulimit -n 輸出 1024,說明對於乙個程序而言最多只能開啟1024個檔案,所以你要採用此預設配置最多也就可以併發上千個tcp連線。

臨時修改:ulimit -n 1000000,但是這種臨時修改只對當前登入使用者目前的使用環境有效,系統重啟或使用者退出後就會失效。

重啟後失效的修改(不過我在centos 6.5下測試,重啟後未發現失效):編輯 /etc/security/limits.conf 檔案, 修改後內容為

* soft nofile 1000000

* hard nofile 1000000

ulimit -shn 1000000

全域性限制

執行 cat /proc/sys/fs/file-nr 輸出 9344 0 592026,分別為:1.已經分配的檔案控制代碼數,2.已經分配但沒有使用的檔案控制代碼數,3.最大檔案控制代碼數。但在kernel 2.6版本中第二項的值總為0,這並不是乙個錯誤,它實際上意味著已經分配的檔案描述符無一浪費的都已經被使用了 。

我們可以把這個數值改大些,用 root 許可權修改 /etc/sysctl.conf 檔案:

fs.file-max = 1000000

net.ipv4.ip_conntrack_max = 1000000

net.ipv4.netfilter.ip_conntrack_max = 1000000

常識二:埠號範圍限制?

作業系統上埠號1024以下是系統保留的,從1024-65535是使用者使用的。由於每個tcp連線都要佔乙個埠號,所以我們最多可以有60000多個併發連線。我想有這種錯誤思路朋友不在少數吧?(其中我過去就一直這麼認為)

我們來分析一下吧

如何標識乙個tcp連線:系統用乙個4四元組來唯一標識乙個tcp連線:。好吧,我們拿出《unix網路程式設計:卷一》第四章中對accept的講解來看看概念性的東西,第二個引數cliaddr代表了客戶端的ip位址和埠號。而我們作為服務端實際只使用了bind時這乙個埠,說明埠號65535並不是併發量的限制。

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

詳解Linux伺服器最大tcp連線數

網路程式設計 在tcp應用中,server事先在某個固定埠監聽,client主動發起連線,經過三路握手後建立tcp連線。那麼對單機,其最大併發tcp連線數是多少?如何標識乙個tcp連線 在確定最大連線數之前,先來看看系統如何標識乙個tcp連線。系統用乙個4四元組來唯一標識乙個tcp連線 client...

Linux下搭建tcp伺服器

include see notes include include include include include include include include socket bind listen accept send recv define server port 8888 define b...

如何修改windows伺服器最大的tcp連線數

在做效能測試測試時候,如果被測試的系統頁面很簡單,並且效能很好,這樣會導致壓力機得tcp鏈結數不夠而導致如下錯誤 hkey local machine system currentcontrolset services tcpip parameters tcptimedwaitdelay to 30...