{eval=Array;=+count(Array);}

成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

問答專欄Q & A COLUMN

linux的TCP連接數(shù)量最大不能超過65535個(gè)嗎,那服務(wù)器是如何應(yīng)對(duì)百萬千萬的并發(fā)的?

edagarliedagarli 回答0 收藏1
收藏問題

10條回答

Blackjun

Blackjun

回答于2022-06-28 09:53

這明顯是進(jìn)入了思維的誤區(qū),65535是指可用的端口總數(shù),并不代表服務(wù)器同時(shí)只能接受65535個(gè)并發(fā)連接。

舉個(gè)例子:

我們做了一個(gè)網(wǎng)站,綁定的是TCP的80端口,結(jié)果是所有訪問這個(gè)網(wǎng)站的用戶都是通過服務(wù)器的80端口訪問,而不是其他端口??梢姸丝谑强梢詮?fù)用的。即使Linux服務(wù)器只在80端口偵聽服務(wù), 也允許有10萬、100萬個(gè)用戶連接服務(wù)器。Linux系統(tǒng)不會(huì)限制連接數(shù)至于服務(wù)器能不能承受住這么多的連接,取決于服務(wù)器的硬件配置、軟件架構(gòu)及優(yōu)化。

01

我們知道兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提是:能夠唯一的標(biāo)示一個(gè)進(jìn)程。在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個(gè)進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大。

這時(shí)候就需要另辟它徑了,IP地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,這樣可以利用IP地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。

能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了。socket(套接字)是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。socket源自Unix,是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。

02

唯一能夠確定一個(gè)連接有4個(gè)東西:

1. 服務(wù)器的IP

2. 服務(wù)器的Port

3. 客戶端的IP

4. 客戶端的Port

服務(wù)器的IP和Port可以保持不變,只要客戶端的IP和Port彼此不同就可以確定一個(gè)連接數(shù)。一個(gè)socket是可以建立多個(gè)連接的,一個(gè)TCP連接的標(biāo)記為一個(gè)四元組(source_ip, source_port, destination_ip, destination_port),即(源IP,源端口,目的IP,目的端口)四個(gè)元素的組合。只要四個(gè)元素的組合中有一個(gè)元素不一樣,那就可以區(qū)別不同的連接。

舉個(gè)例子:

->你的主機(jī)IP地址是1.1.1.1, 在8080端口監(jiān)聽

->當(dāng)一個(gè)來自 2.2.2.2 發(fā)來一條連接請(qǐng)求,端口為5555。這條連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 5555)

->這時(shí)2.2.2.2又發(fā)來第二條連接請(qǐng)求,端口為6666。新連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 6666)

那么,你主機(jī)的8080端口建立了兩條連接;

->(2.2.2.2)發(fā)來的第三條連接請(qǐng)求,端口為5555(或6666)。第三條連接的請(qǐng)求就無法建立,因?yàn)闆]有辦法區(qū)分于上面兩條連接。

同理,可以在同一個(gè)端口號(hào)和IP地址上綁定一個(gè)TCP socket和一個(gè)UDP socket

因?yàn)槎丝谔?hào)雖然一樣,但由于協(xié)議不一樣,所以端口是完全獨(dú)立的。

TCP/UDP一般采用五元組來定位一個(gè)連接:

source_ip, source_port, destination_ip, destination_port, protocol_type

即(源IP,源端口,目的IP,目的端口,協(xié)議號(hào))

綜上所述,服務(wù)器的并發(fā)數(shù)并不是由TCP的65535個(gè)端口決定的。服務(wù)器同時(shí)能夠承受的并發(fā)數(shù)是由帶寬、硬件、程序設(shè)計(jì)等多方面因素決定的。

所以也就能理解淘寶、ucloud、我們、百度、新浪、嗶嗶嗶嗶等為什么能夠承受住每秒種幾億次的并發(fā)訪問,是因?yàn)樗麄儾捎玫氖欠?wù)器集群。服務(wù)器集群分布在全國(guó)各地的大型機(jī)房,當(dāng)訪問量小的時(shí)候會(huì)關(guān)閉一些服務(wù)器,當(dāng)訪問量大的時(shí)候回不斷的開啟新的服務(wù)器。


以上個(gè)人淺見,歡迎批評(píng)指正。

認(rèn)同我的看法,請(qǐng)點(diǎn)個(gè)贊再走,感謝!

喜歡我的,請(qǐng)關(guān)注我,再次感謝!

評(píng)論0 贊同0
  •  加載中...
garfileo

garfileo

回答于2022-06-28 09:53

首先,問題中描述的65535個(gè)連接指的是客戶端連接數(shù)的限制。

在tcp應(yīng)用中,server事先在某個(gè)固定端口監(jiān)聽,client主動(dòng)發(fā)起連接,經(jīng)過三路握手后建立tcp連接。那么對(duì)單機(jī),其最大并發(fā)tcp連接數(shù)是多少呢?

如何標(biāo)識(shí)一個(gè)TCP連接

在確定最大連接數(shù)之前,先來看看系統(tǒng)如何標(biāo)識(shí)一個(gè)tcp連接。系統(tǒng)用一個(gè)4四元組來唯一標(biāo)識(shí)一個(gè)TCP連接:{localip, localport,remoteip,remoteport}。

client最大tcp連接數(shù)

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

server最大tcp連接數(shù)

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

實(shí)際的tcp連接數(shù)

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

所以,對(duì)server端,通過增加內(nèi)存、修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)TCP連接數(shù)超過10萬,甚至上百萬是沒問題的。

評(píng)論0 贊同0
  •  加載中...
zr_hebo

zr_hebo

回答于2022-06-28 09:53

你這個(gè)提問中有一些邏輯的錯(cuò)誤,我來一一給你解釋一下。

第一個(gè)錯(cuò)誤的地方是,TCP連接數(shù)量和Linux沒有關(guān)系。不管是Windows還是Linux,只要使用TCP/IP,那么單個(gè)IP地址連接相同互聯(lián)網(wǎng)服務(wù)的TCP連接數(shù),就不會(huì)超過65535個(gè),甚至在一般情況下,我們認(rèn)為不會(huì)超過4萬個(gè)(注意,這里指相同互聯(lián)網(wǎng)服務(wù),即相同目的地址和端口)。

這個(gè)原因是因?yàn)?,TCP/IP中,一個(gè)TCP連接,就要耗費(fèi)源IP地址一個(gè)TCP端口,而TCP的端口數(shù)量也就是65535個(gè),因?yàn)閰f(xié)議規(guī)定了TCP端口的長(zhǎng)度也就是16位(二進(jìn)制),所以換成十進(jìn)制也就是1~65535.

這也就意味著,如果你的電腦要訪問一個(gè)網(wǎng)站,那么你的電腦只能和這個(gè)網(wǎng)站建立65535個(gè)連接,一個(gè)連接消耗一個(gè)TCP端口。當(dāng)然這是理想的情況,實(shí)際的情況是,有很多端口被一些知名的協(xié)議占據(jù)了,或者做了預(yù)留,例如80端口就屬于HTTP的,所以一般認(rèn)為能使用的端口就是4萬個(gè)左右。

第二個(gè)錯(cuò)誤是,TCP的端口數(shù)量和服務(wù)器沒有關(guān)系。因?yàn)檫@里所說的4萬個(gè)TCP的端口,是指源端口,也就是你訪問網(wǎng)站時(shí)使用的個(gè)人電腦使用的端口,而對(duì)于目的端口,也就是網(wǎng)站的端口,使用的TCP端口也就是相同的23端口。這個(gè)意思也就意味著,4萬個(gè)連接都連的是這個(gè)網(wǎng)站的23端口,換一個(gè)用戶又可以用4萬個(gè)連接連接服務(wù)器的23端口。

所以我們可以粗略估算一下,如果是100萬個(gè)并發(fā)連接,在1個(gè)用戶4萬個(gè)訪問的情況下,也就是25個(gè)并發(fā)的用戶。當(dāng)然,實(shí)際使用時(shí),你的PC機(jī)不會(huì)有4萬個(gè)連接訪問相同的網(wǎng)站,假設(shè)我們按照一個(gè)PC機(jī)4個(gè)連接訪問網(wǎng)站計(jì)算,100萬個(gè)并發(fā)也就是25萬個(gè)用戶訪問。

最后回答一下你的問題,服務(wù)器如何撐住百萬千萬個(gè)TCP連接呢?這個(gè)和服務(wù)器的資源有關(guān)。實(shí)際上單個(gè)服務(wù)器支持的TCP連接數(shù)的確是有限的,單個(gè)服務(wù)器所支持的TCP連接不可能到達(dá)理論值,服務(wù)連接一多,CPU撐不住內(nèi)存也頂不住,所以每個(gè)服務(wù)器都有規(guī)格限制,硬件性能越強(qiáng),服務(wù)器支持的TCP連接數(shù)越大。

但是一個(gè)網(wǎng)站可以有多個(gè)服務(wù)器啊,可以有集群服務(wù)器啊,服務(wù)器的規(guī)模越大,支持的訪問能力就越強(qiáng),所以這個(gè)也不是問題。

比如ucloud巴巴是如何撐過雙11的?ucloud云在北上廣深等很多地方都有服務(wù)器,而且每個(gè)地方的服務(wù)器都是彈性集群,這些服務(wù)器實(shí)時(shí)同步保障淘寶上的數(shù)據(jù)一致。所以雙11訪問淘寶時(shí),有的訪問的是北京的服務(wù)器,有的訪問的是上海的服務(wù)器,這樣通過分布式服務(wù)分布式的存儲(chǔ),網(wǎng)站可以應(yīng)對(duì)的并發(fā)自然就很大了。

評(píng)論0 贊同0
  •  加載中...
bingo

bingo

回答于2022-06-28 09:53

Hi,你好。很高興看到并回答此問題。如果我的回答對(duì)你有幫助,記得點(diǎn)個(gè)贊哦~~

下面我結(jié)合之前的項(xiàng)目來回答一下。


樓主所理解的65535(端口數(shù)量)與連接數(shù)是一個(gè)東西,這個(gè)是錯(cuò)的。具體原因前面已經(jīng)有不少同行小伙伴描述的非常清楚了,我就不再闡述了。

下面我具體來回答一下樓主的后半部分:服務(wù)器是如何支撐百萬并發(fā)的。


下面闡述的觀點(diǎn)是:通過優(yōu)化系統(tǒng)架構(gòu)提升系統(tǒng)負(fù)載能力,即提高系統(tǒng)并發(fā)量。


一、什么是高并發(fā)



高并發(fā)是互聯(lián)網(wǎng)系統(tǒng)所面臨的普通問題,也是系統(tǒng)架構(gòu)時(shí)考慮的重要因素之一。

并發(fā)與負(fù)載】是相對(duì)的兩個(gè)詞。

想實(shí)現(xiàn)高并發(fā),就要提高系統(tǒng)負(fù)載能力。系統(tǒng)負(fù)載能力強(qiáng)了,自然可以處理高并發(fā)請(qǐng)求。

所以,實(shí)現(xiàn)高并發(fā),本質(zhì)就是提高系統(tǒng)的負(fù)載能力。

一般對(duì)于系統(tǒng)負(fù)載能力的評(píng)估參數(shù)有:響應(yīng)時(shí)間 、吞吐量、每秒請(qǐng)求數(shù)QPS、并發(fā)用戶數(shù)。

  • 響應(yīng)時(shí)間:系統(tǒng)對(duì)請(qǐng)求做出響應(yīng)的時(shí)間。例如系統(tǒng)處理一個(gè)HTTP請(qǐng)求需要200ms,這個(gè)200ms就是系統(tǒng)的響應(yīng)時(shí)間。
  • 吞吐量:?jiǎn)挝粫r(shí)間內(nèi)處理的請(qǐng)求數(shù)量。
  • QPS:每秒響應(yīng)請(qǐng)求數(shù),與吞吐量概念類似。
  • 并發(fā)用戶數(shù):同時(shí)使用系統(tǒng)功能的用戶數(shù)量。


二、如何提高并發(fā)處理能力(并發(fā)數(shù))


需要說明的是:以下內(nèi)容不考慮【帶寬】和【硬件配置】這兩個(gè)因素。

很顯然,帶寬高、硬件配置高,系統(tǒng)負(fù)載能力就強(qiáng),能處理的并發(fā)用戶數(shù)就多。


那么如何提高并發(fā)處理能力呢?

答案就是:通過優(yōu)化系統(tǒng)架構(gòu)來提高并發(fā)處理能力。

并且系統(tǒng)架構(gòu)設(shè)計(jì)是一個(gè)復(fù)雜的過程,不僅涉及到技術(shù)層面,還包括業(yè)務(wù)層面。



三、通過業(yè)務(wù)拆分提高并發(fā)處理能力(微服務(wù)架構(gòu))



將一個(gè)系統(tǒng)拆分為多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)負(fù)責(zé)一個(gè)多帶帶的服務(wù),這就是常說的【服務(wù)治理】


拆分為多個(gè)子系統(tǒng)后,每個(gè)子系統(tǒng)(服務(wù))獨(dú)立運(yùn)行,每個(gè)服務(wù)之間通過REST/RPC方式調(diào)用,用戶也可以直接調(diào)用這些服務(wù)接口。

這種設(shè)計(jì)將大化小,這種架構(gòu)也稱為【微服務(wù)架構(gòu)】。


舉例:商城系統(tǒng)中,可拆分為【訂單服務(wù)】【用戶服務(wù)】【產(chǎn)品服務(wù)】等多個(gè)服務(wù)接口。



四、通過水平擴(kuò)展提高并發(fā)處理能力

這一塊要分開來講。


1. 前端部分



使用nginx反向代理軟件提高并發(fā)處理量

nginx進(jìn)行水平擴(kuò)展:DNS輪詢等


2. 應(yīng)用服務(wù)器部分



java中常見的應(yīng)用服務(wù)器tomcat為例,它可以實(shí)現(xiàn)集群和負(fù)載均衡。集群配置成功后,相當(dāng)于提供了一個(gè)“服務(wù)器池”,如果想要再提高處理能力,只需要向“池”中繼續(xù)添加應(yīng)用服務(wù)器即可。另外,集群也實(shí)現(xiàn)了系統(tǒng)高可用。


3. 數(shù)據(jù)庫(kù)層面

常見的分庫(kù)分表,讀寫分離都是解決數(shù)據(jù)庫(kù)壓力大的方法之一。

數(shù)據(jù)庫(kù)瓶頸是系統(tǒng)在運(yùn)行中最先碰到、最常碰到的問題之一。

經(jīng)常見到的問題就是磁盤IO高,導(dǎo)致處理緩慢。

剛才所說方法都可以解決這一問題。

常見的分表原則有:按范圍分,按哈希值分。


4. 緩存層面



在系統(tǒng)中添加緩存是當(dāng)前必選的方案。

添加緩存的主要目標(biāo)是減少磁盤IO。

可以緩存的內(nèi)容很多,例如緩存頁(yè)面內(nèi)容(HTML,CSS,圖片),緩存應(yīng)用服務(wù)器中數(shù)據(jù)對(duì)象等。

通過設(shè)計(jì)多級(jí)緩存,實(shí)現(xiàn)數(shù)據(jù)的快速獲取、請(qǐng)求的快速響應(yīng)。

在分布式架構(gòu)中,還要注意分布式緩存的更新一致性問題。(不再詳述)


五、最后


其實(shí)很多系統(tǒng)的并發(fā)數(shù)都不到百萬級(jí),只有少量頭部網(wǎng)站才會(huì)有,例如淘寶。

但我們之所以研究如何解決百萬級(jí)并發(fā)架構(gòu),是從中學(xué)會(huì)和掌握【系統(tǒng)架構(gòu)演變過程】。


系統(tǒng)架構(gòu)設(shè)計(jì)的原則是:適合的就是最好的。不能剛開始架構(gòu)就要滿足百萬級(jí),因?yàn)檫@樣設(shè)計(jì)會(huì)提高成本,造成資源浪費(fèi)。

所以,我們要明白:系統(tǒng)架構(gòu)是演進(jìn)的。


只有當(dāng)我們經(jīng)歷了從【單一架構(gòu)】至【分布式架構(gòu)】這一過程,才能真正理解架構(gòu)的能力。在這過程中,你的架構(gòu)能力也會(huì)飛快增長(zhǎng)。



我是一名Java全棧開發(fā)工程師、系統(tǒng)架構(gòu)師,從業(yè)15年。曾帶領(lǐng)小團(tuán)隊(duì)完成多個(gè)數(shù)百萬級(jí)項(xiàng)目。我正在寫一些關(guān)于互聯(lián)網(wǎng)行業(yè)及開發(fā)技術(shù)方面的文章。關(guān)注我,你一定會(huì)有所收獲。


如果有項(xiàng)目開發(fā)、行業(yè)及求職方面的問題,都可以在評(píng)論區(qū)留言或私信我。(關(guān)注后私信我,向你免費(fèi)分享行業(yè)級(jí)學(xué)習(xí)資料)

評(píng)論0 贊同0
  •  加載中...
ZweiZhao

ZweiZhao

回答于2022-06-28 09:53

你好,IT行業(yè)的碼農(nóng)前來答題。

題主有一個(gè)概念上的誤解,錯(cuò)誤的把TCP端口號(hào)的上限65535理解成了TCP連接數(shù)的上限,進(jìn)而認(rèn)為L(zhǎng)inux無法實(shí)現(xiàn)超過65,535個(gè)的并發(fā)任務(wù),實(shí)際上端口號(hào)數(shù)量和TCP連接數(shù)確實(shí)有關(guān)聯(lián),但并非一一對(duì)應(yīng)的關(guān)系。

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

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

TCP怎么建立連接,與端口號(hào)是什么關(guān)系?

Linux服務(wù)器在交互時(shí),一般有兩種身份:客戶端或者服務(wù)器端。典型的交互場(chǎng)景是:

(1)服務(wù)器端主動(dòng)創(chuàng)建監(jiān)聽的socket,并綁定對(duì)外服務(wù)端口port,然后開始監(jiān)聽

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

(3)服務(wù)端接受客戶端的請(qǐng)求,然后再生成新的socket

(4)服務(wù)器和客戶端在新的socket里進(jìn)行通信

可以看到,端口port主要用在服務(wù)器和客戶端的“握手認(rèn)識(shí)”過程,一旦互相認(rèn)識(shí)了,就會(huì)生成的的socket進(jìn)行通信,這時(shí)候port就不再需要了,可以給別的socket通信去使用,所以很明顯TCP連接的數(shù)量可以大于TCP端口號(hào)的數(shù)量65,535。

考慮一下兩個(gè)極端場(chǎng)景,即某臺(tái)Linux服務(wù)器只作為客戶端或者服務(wù)器端

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

這時(shí)候每發(fā)起一個(gè)TCP請(qǐng)求,系統(tǒng)就會(huì)指定一個(gè)空間的本地端口給你用,而且是獨(dú)占式的,不會(huì)被別的TCP連接搶走,這樣最多可以建立65535個(gè)連接,每個(gè)連接都與不同的服務(wù)器進(jìn)行交互。這種場(chǎng)景,就是題主所描述的樣子,但是由于條件過于苛刻,屬于小概率事件,所以更多的還是理論上的可能,現(xiàn)實(shí)的環(huán)境中幾乎不會(huì)出現(xiàn)。

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

這種場(chǎng)景下,服務(wù)端就會(huì)固定的監(jiān)聽本地端口port,等著客戶端來向它發(fā)起請(qǐng)求。為了計(jì)算簡(jiǎn)單,我們假設(shè)服務(wù)器端的IP跟端口是多對(duì)一的,這樣TCP四元組里面就有remote ip和remote port是可變的,因此最大支持創(chuàng)建TCP個(gè)數(shù)為2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等于2的48次方。

現(xiàn)實(shí)中單臺(tái)Linux服務(wù)器支持的TCP連接數(shù)量

通過前面的分析我們知道,在現(xiàn)實(shí)場(chǎng)景中,由于存在端口port復(fù)用的情況,服務(wù)器可同時(shí)支持的TCP連接數(shù)跟65,535沒有一一對(duì)應(yīng)關(guān)系,事實(shí)上,真正影響TCP連接數(shù)量的,是服務(wù)器的內(nèi)存以及允許單一進(jìn)程同時(shí)打開文件的數(shù)量,因?yàn)槊縿?chuàng)建一個(gè)TCP連接都要?jiǎng)?chuàng)建一個(gè)socket句柄,每個(gè)socket句柄都占用一部分系統(tǒng)內(nèi)存,當(dāng)系統(tǒng)內(nèi)存被占用殆盡,允許的TCP并發(fā)連接數(shù)也就到了上限。一般來講,通過增加服務(wù)器內(nèi)存、修改最大文件描述符個(gè)數(shù)等,可以做到單臺(tái)服務(wù)器支持10萬+的TCP并發(fā)。

當(dāng)然,在真實(shí)的商用場(chǎng)景下,單臺(tái)服務(wù)器都會(huì)編入分布式集群,通過負(fù)載均衡算法動(dòng)態(tài)的調(diào)度不同用戶的請(qǐng)求給最空閑的服務(wù)器,如果服務(wù)器平均內(nèi)存使用超過80%的警戒線,那么就會(huì)及時(shí)采用限流或者擴(kuò)展集群的方式來保證服務(wù),絕對(duì)不會(huì)出現(xiàn)服務(wù)器的內(nèi)存被耗盡的情況,那樣就算事故了。


總之,65,535只是Linux系統(tǒng)中可使用端口port數(shù)量的上限,端口port數(shù)量與TCP連接數(shù)量并非完全一一對(duì)應(yīng)的關(guān)系,服務(wù)器支持的TCP并發(fā)連接數(shù)量主要跟服務(wù)器的內(nèi)存以及允許單個(gè)進(jìn)程同時(shí)打開的文件數(shù)量有關(guān)系,通過端口復(fù)用及調(diào)整服務(wù)器參數(shù)等手段,單臺(tái)服務(wù)器支持的TCP并發(fā)連接數(shù)是可以高于65,535的。

評(píng)論0 贊同0
  •  加載中...
waltr

waltr

回答于2022-06-28 09:53

TCP/IP 協(xié)議規(guī)定了端口數(shù)占兩個(gè)字節(jié),所以 65535 是端口數(shù)的上限,但是和連接數(shù)不是一個(gè)意思。

一個(gè) TCP 連接(會(huì)話)用四元組來標(biāo)識(shí):

客戶端IP : 源端口 -> 服務(wù)器 IP : 目的端口

TCP 連接大概有這么幾種場(chǎng)景:

1,服務(wù)端需要監(jiān)聽特定的端口(socket listen),比如 WEB 需要監(jiān)聽 80 和 8080 端口,監(jiān)聽的端口是獨(dú)占的,也就是說同一 IP 的端口綁定數(shù)量上限是 65535;

2,客戶端連接服務(wù)器,系統(tǒng)會(huì)自動(dòng)分配本地空閑端口,本地端口也是獨(dú)占的,所以傳出連接數(shù)(Outgoing)上限是 65535;

3,當(dāng)服務(wù)端收到傳入的連接請(qǐng)求(socket accept)并建立連接,對(duì)于服務(wù)端而言,傳入連接并不會(huì)產(chǎn)生新的端口占用,連接數(shù)量不受端口限制,而是操作系統(tǒng)和系統(tǒng)資源限制。

評(píng)論0 贊同0
  •  加載中...
Batkid

Batkid

回答于2022-06-28 09:53

首先,問題中描述的65535個(gè)連接指的是客戶端連接數(shù)的限制。

在tcp應(yīng)用中,server事先在某個(gè)固定端口監(jiān)聽,client主動(dòng)發(fā)起連接,經(jīng)過三路握手后建立tcp連接。那么對(duì)單機(jī),其最大并發(fā)tcp連接數(shù)是多少呢?

如何標(biāo)識(shí)一個(gè)TCP連接

在確定最大連接數(shù)之前,先來看看系統(tǒng)如何標(biāo)識(shí)一個(gè)tcp連接。系統(tǒng)用一個(gè)4四元組來唯一標(biāo)識(shí)一個(gè)TCP連接:{localip, localport,remoteip,remoteport}。

client最大tcp連接數(shù)

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

server最大tcp連接數(shù)

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

實(shí)際的tcp連接數(shù)

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

所以,對(duì)server端,通過增加內(nèi)存、修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)TCP連接數(shù)超過10萬,甚至上百萬是沒問題的。

這明顯是進(jìn)入了思維的誤區(qū),65535是指可用的端口總數(shù),并不代表服務(wù)器同時(shí)只能接受65535個(gè)并發(fā)連接。

舉個(gè)例子:

我們做了一個(gè)網(wǎng)站,綁定的是TCP的80端口,結(jié)果是所有訪問這個(gè)網(wǎng)站的用戶都是通過服務(wù)器的80端口訪問,而不是其他端口。可見端口是可以復(fù)用的。即使Linux服務(wù)器只在80端口偵聽服務(wù), 也允許有10萬、100萬個(gè)用戶連接服務(wù)器。Linux系統(tǒng)不會(huì)限制連接數(shù)至于服務(wù)器能不能承受住這么多的連接,取決于服務(wù)器的硬件配置、軟件架構(gòu)及優(yōu)化。

01

我們知道兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提是:能夠唯一的標(biāo)示一個(gè)進(jìn)程。在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個(gè)進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大。

這時(shí)候就需要另辟它徑了,IP地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,這樣可以利用IP地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。

能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了。socket(套接字)是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。socket源自Unix,是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。

02

唯一能夠確定一個(gè)連接有4個(gè)東西:

1. 服務(wù)器的IP

2. 服務(wù)器的Port

3. 客戶端的IP

4. 客戶端的Port

服務(wù)器的IP和Port可以保持不變,只要客戶端的IP和Port彼此不同就可以確定一個(gè)連接數(shù)。一個(gè)socket是可以建立多個(gè)連接的,一個(gè)TCP連接的標(biāo)記為一個(gè)四元組(source_ip, source_port, destination_ip, destination_port),即(源IP,源端口,目的IP,目的端口)四個(gè)元素的組合。只要四個(gè)元素的組合中有一個(gè)元素不一樣,那就可以區(qū)別不同的連接。

舉個(gè)例子:

->你的主機(jī)IP地址是1.1.1.1, 在8080端口監(jiān)聽

->當(dāng)一個(gè)來自 2.2.2.2 發(fā)來一條連接請(qǐng)求,端口為5555。這條連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 5555)

->這時(shí)2.2.2.2又發(fā)來第二條連接請(qǐng)求,端口為6666。新連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 6666)

那么,你主機(jī)的8080端口建立了兩條連接;

->(2.2.2.2)發(fā)來的第三條連接請(qǐng)求,端口為5555(或6666)。第三條連接的請(qǐng)求就無法建立,因?yàn)闆]有辦法區(qū)分于上面兩條連接。

同理,可以在同一個(gè)端口號(hào)和IP地址上綁定一個(gè)TCP socket和一個(gè)UDP socket

因?yàn)槎丝谔?hào)雖然一樣,但由于協(xié)議不一樣,所以端口是完全獨(dú)立的。

TCP/UDP一般采用五元組來定位一個(gè)連接:

source_ip, source_port, destination_ip, destination_port, protocol_type

即(源IP,源端口,目的IP,目的端口,協(xié)議號(hào))

綜上所述,服務(wù)器的并發(fā)數(shù)并不是由TCP的65535個(gè)端口決定的。服務(wù)器同時(shí)能夠承受的并發(fā)數(shù)是由帶寬、硬件、程序設(shè)計(jì)等多方面因素決定的。

所以也就能理解淘寶、ucloud、我們、百度、新浪、嗶嗶嗶嗶等為什么能夠承受住每秒種幾億次的并發(fā)訪問,是因?yàn)樗麄儾捎玫氖欠?wù)器集群。服務(wù)器集群分布在全國(guó)各地的大型機(jī)房,當(dāng)訪問量小的時(shí)候會(huì)關(guān)閉一些服務(wù)器,當(dāng)訪問量大的時(shí)候回不斷的開啟新的服務(wù)器。

以上個(gè)人淺見,歡迎批評(píng)指正。

認(rèn)同我的看法,請(qǐng)點(diǎn)個(gè)贊再走,感謝!

你這個(gè)提問中有一些邏輯的錯(cuò)誤,我來一一給你解釋一下。

第一個(gè)錯(cuò)誤的地方是,TCP連接數(shù)量和Linux沒有關(guān)系。不管是Windows還是Linux,只要使用TCP/IP,那么單個(gè)IP地址連接相同互聯(lián)網(wǎng)服務(wù)的TCP連接數(shù),就不會(huì)超過65535個(gè),甚至在一般情況下,我們認(rèn)為不會(huì)超過4萬個(gè)(注意,這里指相同互聯(lián)網(wǎng)服務(wù),即相同目的地址和端口)。

這個(gè)原因是因?yàn)?,TCP/IP中,一個(gè)TCP連接,就要耗費(fèi)源IP地址一個(gè)TCP端口,而TCP的端口數(shù)量也就是65535個(gè),因?yàn)閰f(xié)議規(guī)定了TCP端口的長(zhǎng)度也就是16位(二進(jìn)制),所以換成十進(jìn)制也就是1~65535.

這也就意味著,如果你的電腦要訪問一個(gè)網(wǎng)站,那么你的電腦只能和這個(gè)網(wǎng)站建立65535個(gè)連接,一個(gè)連接消耗一個(gè)TCP端口。當(dāng)然這是理想的情況,實(shí)際的情況是,有很多端口被一些知名的協(xié)議占據(jù)了,或者做了預(yù)留,例如80端口就屬于HTTP的,所以一般認(rèn)為能使用的端口就是4萬個(gè)左右。

第二個(gè)錯(cuò)誤是,TCP的端口數(shù)量和服務(wù)器沒有關(guān)系。因?yàn)檫@里所說的4萬個(gè)TCP的端口,是指源端口,也就是你訪問網(wǎng)站時(shí)使用的個(gè)人電腦使用的端口,而對(duì)于目的端口,也就是網(wǎng)站的端口,使用的TCP端口也就是相同的23端口。這個(gè)意思也就意味著,4萬個(gè)連接都連的是這個(gè)網(wǎng)站的23端口,換一個(gè)用戶又可以用4萬個(gè)連接連接服務(wù)器的23端口。

所以我們可以粗略估算一下,如果是100萬個(gè)并發(fā)連接,在1個(gè)用戶4萬個(gè)訪問的情況下,也就是25個(gè)并發(fā)的用戶。當(dāng)然,實(shí)際使用時(shí),你的PC機(jī)不會(huì)有4萬個(gè)連接訪問相同的網(wǎng)站,假設(shè)我們按照一個(gè)PC機(jī)4個(gè)連接訪問網(wǎng)站計(jì)算,100萬個(gè)并發(fā)也就是25萬個(gè)用戶訪問。

最后回答一下你的問題,服務(wù)器如何撐住百萬千萬個(gè)TCP連接呢?這個(gè)和服務(wù)器的資源有關(guān)。實(shí)際上單個(gè)服務(wù)器支持的TCP連接數(shù)的確是有限的,單個(gè)服務(wù)器所支持的TCP連接不可能到達(dá)理論值,服務(wù)連接一多,CPU撐不住內(nèi)存也頂不住,所以每個(gè)服務(wù)器都有規(guī)格限制,硬件性能越強(qiáng),服務(wù)器支持的TCP連接數(shù)越大。

但是一個(gè)網(wǎng)站可以有多個(gè)服務(wù)器啊,可以有集群服務(wù)器啊,服務(wù)器的規(guī)模越大,支持的訪問能力就越強(qiáng),所以這個(gè)也不是問題。

比如ucloud巴巴是如何撐過雙11的?ucloud云在北上廣深等很多地方都有服務(wù)器,而且每個(gè)地方的服務(wù)器都是彈性集群,這些服務(wù)器實(shí)時(shí)同步保障淘寶上的數(shù)據(jù)一致。所以雙11訪問淘寶時(shí),有的訪問的是北京的服務(wù)器,有的訪問的是上海的服務(wù)器,這樣通過分布式服務(wù)分布式的存儲(chǔ),網(wǎng)站可以應(yīng)對(duì)的并發(fā)自然就很大了。

樓主所理解的65535(端口數(shù)量)與連接數(shù)是一個(gè)東西,這個(gè)是錯(cuò)的。具體原因前面已經(jīng)有不少同行小伙伴描述的非常清楚了,我就不再闡述了。

下面我具體來回答一下樓主的后半部分:服務(wù)器是如何支撐百萬并發(fā)的。

下面闡述的觀點(diǎn)是:通過優(yōu)化系統(tǒng)架構(gòu)提升系統(tǒng)負(fù)載能力,即提高系統(tǒng)并發(fā)量。

一、什么是高并發(fā)

高并發(fā)是互聯(lián)網(wǎng)系統(tǒng)所面臨的普通問題,也是系統(tǒng)架構(gòu)時(shí)考慮的重要因素之一。

【并發(fā)與負(fù)載】是相對(duì)的兩個(gè)詞。

想實(shí)現(xiàn)高并發(fā),就要提高系統(tǒng)負(fù)載能力。系統(tǒng)負(fù)載能力強(qiáng)了,自然可以處理高并發(fā)請(qǐng)求。

所以,實(shí)現(xiàn)高并發(fā),本質(zhì)就是提高系統(tǒng)的負(fù)載能力。

一般對(duì)于系統(tǒng)負(fù)載能力的評(píng)估參數(shù)有:響應(yīng)時(shí)間 、吞吐量、每秒請(qǐng)求數(shù)QPS、并發(fā)用戶數(shù)。

響應(yīng)時(shí)間:系統(tǒng)對(duì)請(qǐng)求做出響應(yīng)的時(shí)間。例如系統(tǒng)處理一個(gè)HTTP請(qǐng)求需要200ms,這個(gè)200ms就是系統(tǒng)的響應(yīng)時(shí)間。

吞吐量:?jiǎn)挝粫r(shí)間內(nèi)處理的請(qǐng)求數(shù)量。

QPS:每秒響應(yīng)請(qǐng)求數(shù),與吞吐量概念類似。

并發(fā)用戶數(shù):同時(shí)使用系統(tǒng)功能的用戶數(shù)量。

二、如何提高并發(fā)處理能力(并發(fā)數(shù))

需要說明的是:以下內(nèi)容不考慮【帶寬】和【硬件配置】這兩個(gè)因素。

很顯然,帶寬高、硬件配置高,系統(tǒng)負(fù)載能力就強(qiáng),能處理的并發(fā)用戶數(shù)就多。

那么如何提高并發(fā)處理能力呢?

答案就是:通過優(yōu)化系統(tǒng)架構(gòu)來提高并發(fā)處理能力。

并且系統(tǒng)架構(gòu)設(shè)計(jì)是一個(gè)復(fù)雜的過程,不僅涉及到技術(shù)層面,還包括業(yè)務(wù)層面。

三、通過業(yè)務(wù)拆分提高并發(fā)處理能力(微服務(wù)架構(gòu))

將一個(gè)系統(tǒng)拆分為多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)負(fù)責(zé)一個(gè)多帶帶的服務(wù),這就是常說的【服務(wù)治理】

拆分為多個(gè)子系統(tǒng)后,每個(gè)子系統(tǒng)(服務(wù))獨(dú)立運(yùn)行,每個(gè)服務(wù)之間通過REST/RPC方式調(diào)用,用戶也可以直接調(diào)用這些服務(wù)接口。

這種設(shè)計(jì)將大化小,這種架構(gòu)也稱為【微服務(wù)架構(gòu)】。

舉例:商城系統(tǒng)中,可拆分為【訂單服務(wù)】【用戶服務(wù)】【產(chǎn)品服務(wù)】等多個(gè)服務(wù)接口。

四、通過水平擴(kuò)展提高并發(fā)處理能力

這一塊要分開來講。

1. 前端部分

使用nginx反向代理軟件提高并發(fā)處理量

nginx進(jìn)行水平擴(kuò)展:DNS輪詢等

2. 應(yīng)用服務(wù)器部分

java中常見的應(yīng)用服務(wù)器tomcat為例,它可以實(shí)現(xiàn)集群和負(fù)載均衡。集群配置成功后,相當(dāng)于提供了一個(gè)“服務(wù)器池”,如果想要再提高處理能力,只需要向“池”中繼續(xù)添加應(yīng)用服務(wù)器即可。另外,集群也實(shí)現(xiàn)了系統(tǒng)高可用。

3. 數(shù)據(jù)庫(kù)層面

常見的分庫(kù)分表,讀寫分離都是解決數(shù)據(jù)庫(kù)壓力大的方法之一。

數(shù)據(jù)庫(kù)瓶頸是系統(tǒng)在運(yùn)行中最先碰到、最常碰到的問題之一。

經(jīng)常見到的問題就是磁盤IO高,導(dǎo)致處理緩慢。

剛才所說方法都可以解決這一問題。

常見的分表原則有:按范圍分,按哈希值分。

4. 緩存層面

在系統(tǒng)中添加緩存是當(dāng)前必選的方案。

添加緩存的主要目標(biāo)是減少磁盤IO。

可以緩存的內(nèi)容很多,例如緩存頁(yè)面內(nèi)容(HTML,CSS,圖片),緩存應(yīng)用服務(wù)器中數(shù)據(jù)對(duì)象等。

通過設(shè)計(jì)多級(jí)緩存,實(shí)現(xiàn)數(shù)據(jù)的快速獲取、請(qǐng)求的快速響應(yīng)。

在分布式架構(gòu)中,還要注意分布式緩存的更新一致性問題。(不再詳述)

五、最后

其實(shí)很多系統(tǒng)的并發(fā)數(shù)都不到百萬級(jí),只有少量頭部網(wǎng)站才會(huì)有,例如淘寶。

但我們之所以研究如何解決百萬級(jí)并發(fā)架構(gòu),是從中學(xué)會(huì)和掌握【系統(tǒng)架構(gòu)演變過程】。

系統(tǒng)架構(gòu)設(shè)計(jì)的原則是:適合的就是最好的。不能剛開始架構(gòu)就要滿足百萬級(jí),因?yàn)檫@樣設(shè)計(jì)會(huì)提高成本,造成資源浪費(fèi)。

所以,我們要明白:系統(tǒng)架構(gòu)是演進(jìn)的。

題主有一個(gè)概念上的誤解,錯(cuò)誤的把TCP端口號(hào)的上限65535理解成了TCP連接數(shù)的上限,進(jìn)而認(rèn)為L(zhǎng)inux無法實(shí)現(xiàn)超過65,535個(gè)的并發(fā)任務(wù),實(shí)際上端口號(hào)數(shù)量和TCP連接數(shù)確實(shí)有關(guān)聯(lián),但并非一一對(duì)應(yīng)的關(guān)系。

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

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

TCP怎么建立連接,與端口號(hào)是什么關(guān)系?

Linux服務(wù)器在交互時(shí),一般有兩種身份:客戶端或者服務(wù)器端。典型的交互場(chǎng)景是:

(1)服務(wù)器端主動(dòng)創(chuàng)建監(jiān)聽的socket,并綁定對(duì)外服務(wù)端口port,然后開始監(jiān)聽

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

(3)服務(wù)端接受客戶端的請(qǐng)求,然后再生成新的socket

(4)服務(wù)器和客戶端在新的socket里進(jìn)行通信

可以看到,端口port主要用在服務(wù)器和客戶端的“握手認(rèn)識(shí)”過程,一旦互相認(rèn)識(shí)了,就會(huì)生成的的socket進(jìn)行通信,這時(shí)候port就不再需要了,可以給別的socket通信去使用,所以很明顯TCP連接的數(shù)量可以大于TCP端口號(hào)的數(shù)量65,535。

考慮一下兩個(gè)極端場(chǎng)景,即某臺(tái)Linux服務(wù)器只作為客戶端或者服務(wù)器端

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

這時(shí)候每發(fā)起一個(gè)TCP請(qǐng)求,系統(tǒng)就會(huì)指定一個(gè)空間的本地端口給你用,而且是獨(dú)占式的,不會(huì)被別的TCP連接搶走,這樣最多可以建立65535個(gè)連接,每個(gè)連接都與不同的服務(wù)器進(jìn)行交互。這種場(chǎng)景,就是題主所描述的樣子,但是由于條件過于苛刻,屬于小概率事件,所以更多的還是理論上的可能,現(xiàn)實(shí)的環(huán)境中幾乎不會(huì)出現(xiàn)。

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

這種場(chǎng)景下,服務(wù)端就會(huì)固定的監(jiān)聽本地端口port,等著客戶端來向它發(fā)起請(qǐng)求。為了計(jì)算簡(jiǎn)單,我們假設(shè)服務(wù)器端的IP跟端口是多對(duì)一的,這樣TCP四元組里面就有remote ip和remote port是可變的,因此最大支持創(chuàng)建TCP個(gè)數(shù)為2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等于2的48次方。

現(xiàn)實(shí)中單臺(tái)Linux服務(wù)器支持的TCP連接數(shù)量

通過前面的分析我們知道,在現(xiàn)實(shí)場(chǎng)景中,由于存在端口port復(fù)用的情況,服務(wù)器可同時(shí)支持的TCP連接數(shù)跟65,535沒有一一對(duì)應(yīng)關(guān)系,事實(shí)上,真正影響TCP連接數(shù)量的,是服務(wù)器的內(nèi)存以及允許單一進(jìn)程同時(shí)打開文件的數(shù)量,因?yàn)槊縿?chuàng)建一個(gè)TCP連接都要?jiǎng)?chuàng)建一個(gè)socket句柄,每個(gè)socket句柄都占用一部分系統(tǒng)內(nèi)存,當(dāng)系統(tǒng)內(nèi)存被占用殆盡,允許的TCP并發(fā)連接數(shù)也就到了上限。一般來講,通過增加服務(wù)器內(nèi)存、修改最大文件描述符個(gè)數(shù)等,可以做到單臺(tái)服務(wù)器支持10萬+的TCP并發(fā)。

當(dāng)然,在真實(shí)的商用場(chǎng)景下,單臺(tái)服務(wù)器都會(huì)編入分布式集群,通過負(fù)載均衡算法動(dòng)態(tài)的調(diào)度不同用戶的請(qǐng)求給最空閑的服務(wù)器,如果服務(wù)器平均內(nèi)存使用超過80%的警戒線,那么就會(huì)及時(shí)采用限流或者擴(kuò)展集群的方式來保證服務(wù),絕對(duì)不會(huì)出現(xiàn)服務(wù)器的內(nèi)存被耗盡的情況,那樣就算事故了。

總之,65,535只是Linux系統(tǒng)中可使用端口port數(shù)量的上限,端口port數(shù)量與TCP連接數(shù)量并非完全一一對(duì)應(yīng)的關(guān)系,服務(wù)器支持的TCP并發(fā)連接數(shù)量主要跟服務(wù)器的內(nèi)存以及允許單個(gè)進(jìn)程同時(shí)打開的文件數(shù)量有關(guān)系,通過端口復(fù)用及調(diào)整服務(wù)器參數(shù)等手段,單臺(tái)服務(wù)器支持的TCP并發(fā)連接數(shù)是可以高于65,535的。


評(píng)論0 贊同0
  •  加載中...
elisa.yang

elisa.yang

回答于2022-06-28 09:53

作為一個(gè)資深的Layer4-7層網(wǎng)絡(luò)測(cè)試人員,回答你的問題:)

其實(shí)這個(gè)問題,根源在于你不理解服務(wù)器是使用IP+端口號(hào)方式工作的,看我下面的解釋。

Linux的TCP連接數(shù)量最大不能超過65535個(gè)

首先,這個(gè)說法是正確的,但是有限定。它指的是Linux系統(tǒng)作為client,從它自身發(fā)起的連接不能超過65535個(gè),并且用的是源端口號(hào)。

而對(duì)于一臺(tái)電腦上來說,一個(gè)端口號(hào)就表示一個(gè)進(jìn)程,所以一臺(tái)電腦的最大進(jìn)程個(gè)數(shù)為65535。

請(qǐng)看下圖:

這個(gè)就是TCP的報(bào)文格式,它的頭部一般為20字節(jié),而用來表示源/目端口的字段都是2字節(jié),即16bits,所以2的16次方,最大值為65535(從0開始)。

其實(shí)不僅是Linux系統(tǒng),現(xiàn)在存在的Windows、MAC、Android等系統(tǒng),都是一樣的。

服務(wù)器如何應(yīng)對(duì)百萬千萬的并發(fā)?

看下面的兩張圖片,是否理解了呢?

第一張:三臺(tái)PC同時(shí)訪問服務(wù)器,向服務(wù)器發(fā)送連接請(qǐng)求:

  • 三臺(tái)PC發(fā)送報(bào)文時(shí),他們的源IP地址都不相同
  • 三臺(tái)PC發(fā)送報(bào)文時(shí),他們的目的IP和目的端口號(hào)都相同
  • 服務(wù)器只監(jiān)聽一個(gè)端口號(hào)

第二張圖片:服務(wù)器回復(fù)3臺(tái)PC的連接請(qǐng)求:



  • 服務(wù)器回復(fù)3臺(tái)PC時(shí),源IP和源端口號(hào)都相同;
  • 服務(wù)器回復(fù)3臺(tái)PC時(shí),目的IP地址不同;

看到這里,各位小伙伴應(yīng)該明白為啥服務(wù)器能夠處理百萬千萬的并發(fā)了吧?

因?yàn)榉?wù)器處理數(shù)據(jù)時(shí),會(huì)同時(shí)使用 IP和端口號(hào),而不是只單純的使用端口號(hào);

IPv4地址理論上有4,294,967,296,在加上每一臺(tái)PC可以有65535個(gè)源端口,這樣它們的乘積完全是一個(gè)天文數(shù)字,完全沒有必要為服務(wù)器擔(dān)心。

服務(wù)器只使用一個(gè)IP+一個(gè)端口就可以實(shí)現(xiàn)百萬千萬的并發(fā)

看完上面的內(nèi)容,小伙伴只需要記住,服務(wù)器在實(shí)現(xiàn)連接時(shí),并不只使用端口號(hào),還需要使用IP地址,而IP地址理論是有43億左右的,這樣完全不用擔(dān)心不夠用的問題。

歡迎關(guān)注我,一起學(xué)習(xí)和討論網(wǎng)絡(luò)知識(shí),共同進(jìn)步,共同成長(zhǎng)!

評(píng)論0 贊同0
  •  加載中...
mdluo

mdluo

回答于2022-06-28 09:53

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

65535是怎么來的?是TCP協(xié)議規(guī)定的端口字段的最大范圍,2個(gè)字節(jié),16比特,每一比特有0和2種狀態(tài),按照排列組合,2的16次方,一共就是65536,端口0預(yù)留不用,就是65535。

客戶端每發(fā)起一次TCP連接,要消耗一個(gè)端口,并獨(dú)占該端口,最大只能同時(shí)發(fā)起65535個(gè)TCP連接,實(shí)際上65535這個(gè)最大值只是TCP協(xié)議的規(guī)定,操作系統(tǒng)還有限制呢,發(fā)起主動(dòng)連接前1024個(gè)端口號(hào)(0-1023)都不給用,真實(shí)最大只有64512個(gè)。

說完客戶端再說服務(wù)端。服務(wù)端一般都監(jiān)聽某一個(gè)端口,比如80的web端口,比如22的ssh端口,比如3306的mysql端口,都是在被動(dòng)等待別人來連,所以沒有限制。

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

前面為什么又說是理論上無限制呢,因?yàn)樽畲蟮南拗撇辉赥CP連接數(shù)上,而在硬件上,主要是CPU和內(nèi)存,一個(gè)連接占幾k內(nèi)存。一個(gè)市面上現(xiàn)在普通的物理服務(wù)器,最大也就十幾萬并發(fā)連接吧。

題主所述服務(wù)器如何應(yīng)對(duì)百萬千萬的并發(fā),現(xiàn)在沒什么好辦法,其實(shí)就是堆服務(wù)器,一臺(tái)十萬,十臺(tái)百萬,百臺(tái)千萬……我們給這一堆服務(wù)器一個(gè)高大上的名字,“集群”。

評(píng)論0 贊同0
  •  加載中...
zhangwang

zhangwang

回答于2022-06-28 09:53

本來不想回答這個(gè)問題,因?yàn)樘?jiǎn)單,但是上下瀏覽了下,竟然沒一個(gè)人答到點(diǎn)子上,不得不說一句。

這個(gè)問題說道點(diǎn)子上其實(shí)挺簡(jiǎn)單。

那就是服務(wù)器百萬,千萬并發(fā),并不是同時(shí)你認(rèn)為的“同時(shí)”連接。

而是依次排隊(duì)通訊。

只是因?yàn)榉?wù)器性能高,排隊(duì)速度很快,所以看似并發(fā)。

那個(gè)連接數(shù)跟多少萬并發(fā)沒任何關(guān)系。

是指不同的服務(wù)端口。

而講服務(wù)器能支持多少萬并發(fā)的性能,講的是同一個(gè)服務(wù),在同一個(gè)端口上的并發(fā)。

是通過高速排隊(duì)實(shí)現(xiàn)的。

至于你說單臺(tái)服務(wù)器性能不夠,出現(xiàn)了排隊(duì)延遲,無法讓人覺得是并發(fā)。那就涉及到服務(wù)器陣列的問題了。

這是另一個(gè)話題。

本質(zhì)上是通過多臺(tái)服務(wù)器聯(lián)合工作打破單臺(tái)服務(wù)器硬件性能瓶頸。

跟這個(gè)話題實(shí)質(zhì)上并不是同一個(gè)話題。

換句話說,所謂的百萬級(jí)并發(fā),千萬級(jí)并發(fā),通常意義上來講,都是假并發(fā),實(shí)質(zhì)是排隊(duì)通訊。

都是有先來后到的。

只是說,因?yàn)樾阅茏銐蚋撸栽诙嗌倥抨?duì)限度內(nèi),讓用戶感覺是在并發(fā)。那就是這個(gè)服務(wù)器能實(shí)現(xiàn)多少級(jí)別的“并發(fā)”。

至于你說,要做到真并發(fā)。

這就是同時(shí)處理。

這在實(shí)踐上是不科學(xué)的,因?yàn)檎娌l(fā)之后,為了保障分布部署的服務(wù)器的數(shù)據(jù)一致性,同步數(shù)據(jù)的數(shù)據(jù)帶來的處理量會(huì)超過真并發(fā)帶來的“好處”。

當(dāng)然。

實(shí)踐中,可以用兩個(gè)一千萬級(jí)“假并發(fā)”真排隊(duì)通訊,通過互相之間的數(shù)據(jù)同步的“真并發(fā)”,把原本只能實(shí)現(xiàn)一千萬級(jí)假并發(fā)的兩個(gè)服務(wù)器,組合成兩千萬級(jí)的假并發(fā)。

在硬件性能達(dá)到極限的情況下。

這種組合可以讓并發(fā)數(shù)實(shí)現(xiàn)極限突破。

ucloud云的上億級(jí)別的并發(fā)技術(shù)就是這樣實(shí)現(xiàn)的。

評(píng)論0 贊同0
  •  加載中...

相關(guān)問題

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<