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

囡囡語錄


tcp的最大連接數當然可以超過65535

65535有兩個意思:一是Linux系統用戶最大打開文件限制

查看Linux系統對同時打開文件數的硬限制:

# sysctl -a|grep file-max

fs.file-max = 65535

這表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)65535個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不會超過這個數值。

通常這個系統級硬限制是Linux系統在啟動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制。

二是服務器網絡端口最大的端口號。

在單機Linux中,一個端口能夠接受tcp鏈接數量的理論上限是65535 * 65535

對於百萬,千萬的併發,可以採用多進程之間的負載均衡,如果單臺負載機不夠的話 就用多機負載方案


十三相會


你好,IT行業的碼農前來答題。

題主有一個概念上的誤解,錯誤的把TCP端口號的上限65535理解成了TCP連接數的上限,進而認為Linux無法實現超過65,535個的併發任務,實際上端口號數量和TCP連接數確實有關聯,但並非一一對應的關係。

65,535從哪來的,幹啥的?

要解釋好這個問題,就要先說清楚65,535的含義。在Linux系統中,如果兩個機器要通信,那麼相互之間需要建立TCP連接,為了讓雙方互相認識,Linux系統用一個四元組來唯一標識一個TCP連接: {local ip, local port, remote ip, remote port},即本機IP、本機端口、遠程IP、遠程端口,IP和端口就相當於小區地址和門牌號,只有拿到這些信息,通信的雙方才能互相認知。在Linux系統中,表示端口號(port)的變量佔16位,這就決定了端口號最多有2的16次方個,即65,536個,另外端口0有特殊含義不給使用,這樣每個服務器最多就有65,535個端口可用。因此,65,535代表Linux系統支持的TCP端口號數量,在TCP建立連接時會使用。

TCP怎麼建立連接,與端口號是什麼關係?

Linux服務器在交互時,一般有兩種身份:客戶端或者服務器端。典型的交互場景是:

(1)服務器端主動創建監聽的socket,並綁定對外服務端口port,然後開始監聽

(2)客戶端想跟服務器端通信時,就開始連接服務器的端口port

(3)服務端接受客戶端的請求,然後再生成新的socket

(4)服務器和客戶端在新的socket裡進行通信

可以看到,端口port主要用在服務器和客戶端的“握手認識”過程,一旦互相認識了,就會生成的的socket進行通信,這時候port就不再需要了,可以給別的socket通信去使用,所以很明顯TCP連接的數量可以大於TCP端口號的數量65,535。

考慮一下兩個極端場景,即某臺Linux服務器只作為客戶端或者服務器端

(1)Linux服務器只作為客戶端

這時候每發起一個TCP請求,系統就會指定一個空間的本地端口給你用,而且是獨佔式的,不會被別的TCP連接搶走,這樣最多可以建立65535個連接,每個連接都與不同的服務器進行交互。這種場景,就是題主所描述的樣子,但是由於條件過於苛刻,屬於小概率事件,所以更多的還是理論上的可能,現實的環境中幾乎不會出現。

(2)Linux服務器只作為服務端

這種場景下,服務端就會固定的監聽本地端口port,等著客戶端來向它發起請求。為了計算簡單,我們假設服務器端的IP跟端口是多對一的,這樣TCP四元組裡面就有remote ip和remote port是可變的,因此最大支持創建TCP個數為2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等於2的48次方。

現實中單臺Linux服務器支持的TCP連接數量

通過前面的分析我們知道,在現實場景中,由於存在端口port複用的情況,服務器可同時支持的TCP連接數跟65,535沒有一一對應關係,事實上,真正影響TCP連接數量的,是服務器的內存以及允許單一進程同時打開文件的數量,因為每創建一個TCP連接都要創建一個socket句柄,每個socket句柄都佔用一部分系統內存,當系統內存被佔用殆盡,允許的TCP併發連接數也就到了上限。一般來講,通過增加服務器內存、修改最大文件描述符個數等,可以做到單臺服務器支持10萬+的TCP併發。

當然,在真實的商用場景下,單臺服務器都會編入分佈式集群,通過負載均衡算法動態的調度不同用戶的請求給最空閒的服務器,如果服務器平均內存使用超過80%的警戒線,那麼就會及時採用限流或者擴展集群的方式來保證服務,絕對不會出現服務器的內存被耗盡的情況,那樣就算事故了。


總之,65,535只是Linux系統中可使用端口port數量的上限,端口port數量與TCP連接數量並非完全一一對應的關係,服務器支持的TCP併發連接數量主要跟服務器的內存以及允許單個進程同時打開的文件數量有關係,通過端口複用及調整服務器參數等手段,單臺服務器支持的TCP併發連接數是可以高於65,535的。


科技民兵


你的理解有誤。65535這個最大值指的是你作為客戶端去連別人,而你作為服務器,別人來連你,理論上是沒有限制的。注意,僅僅理論上。

65535是怎麼來的?是TCP協議規定的端口字段的最大範圍,2個字節,16比特,每一比特有0和2種狀態,按照排列組合,2的16次方,一共就是65536,端口0預留不用,就是65535。

客戶端每發起一次TCP連接,要消耗一個端口,並獨佔該端口,最大隻能同時發起65535個TCP連接,實際上65535這個最大值只是TCP協議的規定,操作系統還有限制呢,發起主動連接前1024個端口號(0-1023)都不給用,真實最大隻有64512個。

說完客戶端再說服務端。服務端一般都監聽某一個端口,比如80的web端口,比如22的ssh端口,比如3306的mysql端口,都是在被動等待別人來連,所以沒有限制。

你如果真要算最大值也能算。TCP連接的唯一性靠四元組,源目的IP,源目的端口,假設服務端只有一個IP,開了一個端口,相當於把兩個固定了,另兩個的範圍一個是0.0.0.0-255.255.255.255,一個是0-65535,一乘就是最大連接數。其實按照比特數最好算,2的32次方乘上個2的16次方,作為服務端最大連接數就是2的48次方。有意義嗎?沒有意義!

前面為什麼又說是理論上無限制呢,因為最大的限制不在TCP連接數上,而在硬件上,主要是CPU和內存,一個連接佔幾k內存。一個市面上現在普通的物理服務器,最大也就十幾萬併發連接吧。

題主所述服務器如何應對百萬千萬的併發,現在沒什麼好辦法,其實就是堆服務器,一臺十萬,十臺百萬,百臺千萬……我們給這一堆服務器一個高大上的名字,“集群”。


SuperBean


你這個提問中有一些邏輯的錯誤,我來一一給你解釋一下。

第一個錯誤的地方是,TCP連接數量和Linux沒有關係。不管是Windows還是Linux,只要使用TCP/IP,那麼單個IP地址的TCP連接數,就不會超過65535個,甚至在一般情況下,我們認為不會超過4萬個。


這個原因是因為,TCP/IP中,一個TCP連接,就要耗費源IP地址一個TCP端口,而TCP的端口數量也就是65535個,因為協議規定了TCP端口的長度也就是16位(二進制),所以換成十進制也就是1~65535.

這也就意味著,如果你的電腦要訪問一個網站,那麼你的電腦只能和這個網站建立65535個連接,一個連接消耗一個TCP端口。當然這是理想的情況,實際的情況是,有很多端口被一些知名的協議佔據了,或者做了預留,例如80端口就屬於HTTP的,所以一般認為能使用的端口就是4萬個左右。


第二個錯誤是,TCP的端口數量和服務器沒有關係。因為這裡所說的4萬個TCP的端口,是指源端口,也就是你訪問網站時使用的個人電腦使用的端口,而對於目的端口,也就是網站的端口,使用的TCP端口也就是相同的23端口。這個意思也就意味著,4萬個連接都連的是這個網站的23端口,換一個用戶又可以用4萬個連接連接服務器的23端口。

所以我們可以粗略估算一下,如果是100萬個併發連接,在1個用戶4萬個訪問的情況下,也就是25個併發的用戶。當然,實際使用時,你的PC機不會有4萬個連接訪問相同的網站,假設我們按照一個PC機4個連接訪問網站計算,100萬個併發也就是25萬個用戶訪問。


最後回答一下你的問題,服務器如何撐住百萬千萬個TCP連接呢?這個和服務器的資源有關。實際上單個服務器支持的TCP連接數的確是有限的,單個服務器所支持的TCP連接不可能到達理論值,服務連接一多,CPU撐不住內存也頂不住,所以每個服務器都有規格限制,硬件性能越強,服務器支持的TCP連接數越大。


但是一個網站可以有多個服務器啊,可以有集群服務器啊,服務器的規模越大,支持的訪問能力就越強,所以這個也不是問題。

比如阿里巴巴是如何撐過雙11的?阿里雲在北上廣深等很多地方都有服務器,而且每個地方的服務器都是彈性集群,這些服務器實時同步保障淘寶上的數據一致。所以雙11訪問淘寶時,有的訪問的是北京的服務器,有的訪問的是上海的服務器,這樣通過分佈式服務分佈式的存儲,網站可以應對的併發自然就很大了。


IT老菜鳥


首先,問題中描述的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萬,甚至上百萬是沒問題的。


Java實戰技術


服務端好多人說了,略過不表,但真多人對客戶端TCP上限理解有誤。


其實,客戶端TCP連接數量,可簡單突破端口65535的限制。


方法:為客戶端網卡配個IP,每個IP都有65535(扣掉知名端口),盡情地去日服務器吧。


2評論


TCP/IP 協議規定了端口數佔兩個字節,所以 65535 是端口數的上限,但是和連接數不是一個意思。

一個 TCP 連接(會話)用四元組來標識:

客戶端IP : 源端口 -> 服務器 IP : 目的端口

TCP 連接大概有這麼幾種場景:

1,服務端需要監聽特定的端口(socket listen),比如 WEB 需要監聽 80 和 8080 端口,監聽的端口是獨佔的,也就是說同一 IP 的端口綁定數量上限是 65535;

2,客戶端連接服務器,系統會自動分配本地空閒端口,本地端口也是獨佔的,所以傳出連接數(Outgoing)上限是 65535;

3,當服務端收到傳入的連接請求(socket accept)並建立連接,對於服務端而言,傳入連接並不會產生新的端口占用,連接數量不受端口限制,而是操作系統和系統資源限制。


熙爸愛釣魚


就像樓上說的,tcpip連接使用源ip+源端口+目的ip+目的端口來決定一個連接的,除去一下通用端口,這幾種組合都已經可以達到百萬個連接


crossu


TCP的端口為short類型,16bit的長度,表示Linux系統可以使用的本地端口號只有65535個。

但是,TCP連接是(本機IP,本機Port,對端IP,對端Port)的四元組,因此,連接數量不受65535影響。

特殊情況,如果您把Linux只作為客戶端,就不能超過65535個連接了。


零基礎學習程序設計


有個技術叫分佈式集群,也可以叫集群。一定規模的網絡,在前端部署在不同的地理位置,每個地理位置的服務器都是集群,通過智能dns或者全局負載均衡,把用戶的請求指定到離用戶最近的邊緣服務器,比如陝西電信用戶,將被解析到西安電信機房的前端服務器集群,同理其它地域的用戶也被解析到其方便訪問的前端。核心應用部分,也可以做成很大規模的集群,通過光纜互聯,不同地域的網絡可以組成內部局域網,以支持更多的用戶、更高的可用性。

一句話,有錢,有業務驅動,這些都不是問題。


分享到:


相關文章: