單機最大並發tcp連接數是65535?原來我們都錯了!


轉自:

https://www.sohu.com/a/221661481_216613

 

做性能測試的同學,在問到到單台服務器最大連接數時,很多人多會回答是65535,因為最多有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萬,甚至上百萬是沒問題的

相關linux參數調整

sysctl -w fs.file-max=10485760 #系統允許的文件描述符數量10m

sysctl -w net.ipv4.tcp_rmem=1024 #每個tcp連接的讀取緩沖區1k,一個連接1k

sysctl -w net.ipv4.tcp_wmem=1024 #每個tcp連接的寫入緩沖區1k#修改默認的本地端口范圍

sysctl -w net.ipv4.ip_local_port_range='1024 65535'

sysctl -w net.ipv4.tcp_tw_recycle=1 #快速回收time_wait的連接

sysctl -w net.ipv4.tcp_tw_reuse=1

sysctl -w net.ipv4.tcp_timestamps=1#用戶單進程的最大文件數,用戶登錄時生效

echo '* soft nofile 1048576' >> /etc/security/limits.conf

echo '* hard nofile 1048576' >> /etc/security/limits.conf

ulimit -n 1048576 #用戶單進程的最大文件數 當前會話生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM