0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-03-17 11:41 ? 次閱讀

最大并發(fā)tcp連接數(shù)是多少呢?

首先,問題中描述的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ù)之前,先來(lái)看看系統(tǒng)如何標(biāo)識(shí)一個(gè)tcp連接。系統(tǒng)用一個(gè)4四元組來(lái)唯一標(biāo)識(shí)一個(gè)TCP連接:{localip, localport,remoteip,remoteport} = {本地ip,本地port,遠(yuǎn)程ip,遠(yuǎn)程port}

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萬(wàn),甚至上百萬(wàn)是沒問題的。

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

舉個(gè)例子:

我們做了一個(gè)網(wǎng)站,綁定的是TCP的80端口,結(jié)果是所有訪問這個(gè)網(wǎng)站的用戶都是通過服務(wù)器的80端口訪問,而不是其他端口??梢姸丝谑强梢詮?fù)用的。

fde3125a-c426-11ed-bfe3-dac502259ad0.jpg

即使Linux服務(wù)器只在80端口偵聽服務(wù), 也允許有10萬(wàn)、100萬(wàn)個(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來(lái)唯一標(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ò)中通信。

fe028f0e-c426-11ed-bfe3-dac502259ad0.jpg

socket源自Unix,是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。

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

服務(wù)器的IP

服務(wù)器的Port

客戶端的IP

客戶端的Port

服務(wù)器的IP和Port可以保持不變,只要客戶端的IP和Port彼此不同就可以確定一個(gè)連接數(shù)。

fe269e94-c426-11ed-bfe3-dac502259ad0.jpg

一個(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è)來(lái)自 2.2.2.2 發(fā)來(lái)一條連接請(qǐng)求,端口為5555。這條連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 5555)

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

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

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

同理,可以在同一個(gè)端口號(hào)和IP地址上綁定一個(gè)TCP socket和一個(gè)UDP socket因?yàn)槎丝谔?hào)雖然一樣,但由于協(xié)議不一樣,所以端口是完全獨(dú)立的。TCP/UDP一般采用五元組來(lái)定位一個(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ì)等多方面因素決定的。

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

轉(zhuǎn)載自 https://blog.csdn.net/daocaokafei/article/details/115410761

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

65535從哪來(lái)的,干啥的?

fe46db1e-c426-11ed-bfe3-dac502259ad0.jpg

要解釋好這個(gè)問題,就要先說(shuō)清楚65535的含義。在Linux系統(tǒng)中,如果兩個(gè)機(jī)器要通信,那么相互之間需要建立TCP連接,為了讓雙方互相認(rèn)識(shí),Linux系統(tǒng)用一個(gè)四元組來(lái)唯一標(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è),即65536個(gè),另外端口0有特殊含義不給使用,這樣每個(gè)服務(wù)器最多就有65535個(gè)端口可用。因此,65535代表Linux系統(tǒng)支持的TCP端口號(hào)數(shù)量,在TCP建立連接時(shí)會(huì)使用。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

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,等著客戶端來(lái)向它發(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ù)跟65535沒有一一對(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ù)也就到了上限。一般來(lái)講,通過增加服務(wù)器內(nèi)存、修改最大文件描述符個(gè)數(shù)等,可以做到單臺(tái)服務(wù)器支持10萬(wàn)+的TCP并發(fā)。

fe56102a-c426-11ed-bfe3-dac502259ad0.jpg

當(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ò)展集群的方式來(lái)保證服務(wù),絕對(duì)不會(huì)出現(xiàn)服務(wù)器的內(nèi)存被耗盡的情況,那樣就算事故了。

總之,65535只是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ù)是可以高于65535的。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11215

    瀏覽量

    208749
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8979

    瀏覽量

    85102
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1348

    瀏覽量

    78942

原文標(biāo)題:Linux的TCP連接數(shù)量最大不能超過65535?那服務(wù)器是如何應(yīng)對(duì)百萬(wàn)千萬(wàn)的并發(fā)的?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    tcp應(yīng)用中,server事先在某個(gè)固定端口監(jiān)聽,client主動(dòng)發(fā)起連接,經(jīng)過三路握手后建立tcp連接。那么對(duì)單機(jī),其最大并發(fā)
    的頭像 發(fā)表于 10-10 10:33 ?2864次閱讀

    請(qǐng)問如何增加CYW43455的最大LE連接數(shù)?

    平臺(tái):樹莓派 4 芯片:cyw43455 在環(huán)境上測(cè)試后,LE 連接數(shù)量為 5 個(gè)設(shè)備。 順便說(shuō)一句,連接的設(shè)備是筆記本電腦和手機(jī)。 如何增加CYW43455的最大LE
    發(fā)表于 02-29 07:29

    ESP32-C3超過最大站點(diǎn)連接數(shù)如何解決?

    C3為服務(wù)端,一個(gè)設(shè)備不停的斷開連接再重新連接C3,站點(diǎn)數(shù)也會(huì)增加,在斷開連接時(shí)并不會(huì)減少站點(diǎn)數(shù).導(dǎo)致多次以后,超過最大站點(diǎn)
    發(fā)表于 06-20 08:23

    TAS5717的MCLK如果是12.288MHZ,這個(gè)頻率的上下誤差最大不能超過多少呢?

    TAS5717的MCLK如果是12.288MHZ,這個(gè)頻率的上下誤差最大不能超過多少?
    發(fā)表于 11-05 08:23

    使用CYW20706怎么實(shí)現(xiàn)最大連接數(shù)

    sensor.3232i獲得吞吐量的損失不能連接超過4傳感器沒有至少一sensor.6464i獲得吞吐量的損失不能超過4固定連接沒有至少一個(gè)
    發(fā)表于 10-08 16:18

    使用STM32F107網(wǎng)絡(luò)來(lái)傳輸ov7670視頻數(shù)據(jù)長(zhǎng)度不能超過65535嗎?

    _write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags)這個(gè)函數(shù)的里數(shù)集長(zhǎng)度為 u16_t類型 也就是數(shù)據(jù)長(zhǎng)度不能超過65535
    發(fā)表于 12-28 09:12

    請(qǐng)問TAS5717的MCLK是12.288MHZ那頻率的上下誤差最大不能超過多少?

    TAS5717的MCLK如果是12.288MHZ,這個(gè)頻率的上下誤差最大不能超過多少?
    發(fā)表于 08-06 10:49

    LinuxTCP Server最大連接數(shù)是多少?

    無(wú)論是Linux還是Windows作為服務(wù)器都可以支持眾多的Client的長(zhǎng)連接,例如我實(shí)驗(yàn)的在單臺(tái)I7 4790+8G內(nèi)存的機(jī)器上搭建的服務(wù)器可以支持90W個(gè)連接沒有問題,但是在ARM Li
    發(fā)表于 05-17 23:30

    關(guān)于單片機(jī)位數(shù)的思考(8位、16位、32位)精選資料分享

    參與運(yùn)算的數(shù)據(jù)最大不能超過255。而16位機(jī)的字長(zhǎng)是16位,其數(shù)據(jù)表達(dá)范圍是0~65535,即每次參與運(yùn)算的數(shù)據(jù)最大不能超過65535;32位單片機(jī)的字長(zhǎng)是32位,其數(shù)據(jù)表達(dá)范圍是0~
    發(fā)表于 07-15 09:01

    TCP/IP在單次并行循環(huán)里,穩(wěn)定使用的最大并發(fā)數(shù)量上限確認(rèn)及優(yōu)化問題

    漏接收?qǐng)?bào)文,連接數(shù)量再多的情況會(huì)出現(xiàn)丟幀和亂碼情況。電腦是八核1.6Ghz的CPU。各位有好的思路優(yōu)化或者其它建議么?
    發(fā)表于 04-06 09:32

    ESP32-C3-MINI socket連接,超過最大站點(diǎn)連接數(shù),請(qǐng)問有什么解決辦法嗎?

    C3為服務(wù)端,一個(gè)設(shè)備不停的斷開連接再重新連接C3,站點(diǎn)數(shù)也會(huì)增加,在斷開連接時(shí)并不會(huì)減少站點(diǎn)數(shù).導(dǎo)致多次以后,超過最大站點(diǎn)
    發(fā)表于 02-20 09:02

    影響無(wú)線路由器的最大連接數(shù)因素分析

     路由器的設(shè)置,比如路由器存在默認(rèn)的最大連接數(shù)設(shè)置,以及可以編輯的最大連接數(shù),大于限制以外的節(jié)點(diǎn)不被關(guān)聯(lián)。
    發(fā)表于 01-27 16:36 ?3216次閱讀
    影響無(wú)線路由器的<b class='flag-5'>最大連接數(shù)</b>因素分析

    預(yù)計(jì)到2025年授權(quán)的低功率蜂窩連接數(shù)量將增至9億

    Strategy Analytics物聯(lián)網(wǎng)戰(zhàn)略服務(wù)最新發(fā)布的研究報(bào)告《物聯(lián)網(wǎng)授權(quán)的低功率蜂窩連接按垂直市場(chǎng)劃分》預(yù)測(cè),盡管在中國(guó)境外啟動(dòng)緩慢,但到2025年,授權(quán)的低功率LPWA連接數(shù)量將增長(zhǎng)到近9億,這將大大超過同期的未授權(quán)的
    的頭像 發(fā)表于 06-15 16:22 ?1932次閱讀

    我國(guó)移動(dòng)物聯(lián)網(wǎng)連接數(shù)超過“人對(duì)人”連接的手機(jī)用戶數(shù)量

      據(jù)工業(yè)和信息化部最新統(tǒng)計(jì),截至8月底,中國(guó)移動(dòng)物聯(lián)網(wǎng)連接數(shù)量達(dá)到16.98億,首次超過代表“人對(duì)人”連接的手機(jī)用戶數(shù)量(16.78億)。
    的頭像 發(fā)表于 09-23 17:37 ?1418次閱讀

    單臺(tái)服務(wù)器支持的TCP并發(fā)連接數(shù)

    總之,65535只是Linux系統(tǒng)中可使用端口port數(shù)量的上限,端口port數(shù)量TCP連接數(shù)量
    的頭像 發(fā)表于 11-06 19:36 ?1552次閱讀