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

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

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

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

智能計算芯世界 ? 來源:科技民兵 ? 作者:科技民兵 ? 2022-11-06 19:36 ? 次閱讀

首先,問題中描述的65535個連接指的是客戶端連接數(shù)的限制。 在tcp應(yīng)用中,server事先在某個固定端口監(jiān)聽,client主動發(fā)起連接,經(jīng)過三次握手后建立tcp連接。那么對單機(jī),其最大并發(fā)tcp連接數(shù)是多少呢?

如何標(biāo)識一個TCP連接

在確定最大連接數(shù)之前,先來看看系統(tǒng)如何標(biāo)識一個tcp連接。系統(tǒng)用一個4四元組來唯一標(biāo)識一個TCP連接:{localip, localport,remoteip,remoteport} = {本地ip,本地port,遠(yuǎn)程ip,遠(yuǎn)程port}

client最大tcp連接數(shù)

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

server最大tcp連接數(shù)

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

實際的tcp連接數(shù)

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

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

即使Linux服務(wù)器只在80端口偵聽服務(wù), 也允許有10萬、100萬個用戶連接服務(wù)器。Linux系統(tǒng)不會限制連接數(shù)至于服務(wù)器能不能承受住這么多的連接,取決于服務(wù)器的硬件配置、軟件架構(gòu)及優(yōu)化。01我們知道兩個進(jìn)程如果需要進(jìn)行通訊最基本的一個前提是:能夠唯一的標(biāo)示一個進(jìn)程。在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個進(jìn)程PID沖突幾率很大。 這時候就需要另辟它徑了,IP地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號可以唯一標(biāo)示主機(jī)的一個進(jìn)程,這樣可以利用IP地址+協(xié)議+端口號唯一標(biāo)示網(wǎng)絡(luò)中的一個進(jìn)程。 能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了。socket(套接字)是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用以實現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。

2aec419e-5d6c-11ed-a3b6-dac502259ad0.jpg

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

服務(wù)器的IP

服務(wù)器的Port

客戶端的IP

客戶端的Port

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

2b0205ba-5d6c-11ed-a3b6-dac502259ad0.jpg

一個socket是可以建立多個連接的,一個TCP連接的標(biāo)記為一個四元組(source_ip, source_port, destination_ip, destination_port),即(源IP,源端口,目的IP,目的端口)四個元素的組合。只要四個元素的組合中有一個元素不一樣,那就可以區(qū)別不同的連接。 舉個例子:

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

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

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

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

(2.2.2.2)發(fā)來的第三條連接請求,端口為5555(或6666)。第三條連接的請求就無法建立,因為沒有辦法區(qū)分于上面兩條連接。

同理,可以在同一個端口號和IP地址上綁定一個TCP socket和一個UDP socket

因為端口號雖然一樣,但由于協(xié)議不一樣,所以端口是完全獨立的。TCP/UDP一般采用五元組來定位一個連接:source_ip, source_port, destination_ip, destination_port, protocol_type 即(源IP,源端口,目的IP,目的端口,協(xié)議號)

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

所以也就能理解淘寶、騰訊、頭條、百度、新浪、嗶嗶嗶嗶等為什么能夠承受住每秒種幾億次的并發(fā)訪問,是因為他們采用的是服務(wù)器集群。服務(wù)器集群分布在全國各地的大型機(jī)房,當(dāng)訪問量小的時候會關(guān)閉一些服務(wù)器,當(dāng)訪問量大的時候回不斷的開啟新的服務(wù)器。 65535從哪來的,干啥的?

2b0ec034-5d6c-11ed-a3b6-dac502259ad0.jpg

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

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

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

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

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

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

(4)服務(wù)器和客戶端在新的socket里進(jìn)行通信 可以看到,端口port主要用在服務(wù)器和客戶端的“握手認(rèn)識”過程,一旦互相認(rèn)識了,就會生成新的socket進(jìn)行通信,這時候port就不再需要了,可以給別的socket通信去使用,所以很明顯TCP連接的數(shù)量可以大于TCP端口號的數(shù)量65,535。 考慮一下兩個極端場景,即某臺Linux服務(wù)器只作為客戶端或者服務(wù)器端

(1)Linux服務(wù)器只作為客戶端 這時候每發(fā)起一個TCP請求,系統(tǒng)就會指定一個空閑的本地端口給你用,而且是獨占式的,不會被別的TCP連接搶走,這樣最多可以建立65535個連接,每個連接都與不同的服務(wù)器進(jìn)行交互。這種場景,就是題主所描述的樣子,但是由于條件過于苛刻,屬于小概率事件,所以更多的還是理論上的可能,現(xiàn)實的環(huán)境中幾乎不會出現(xiàn)。 (2)Linux服務(wù)器只作為服務(wù)端 這種場景下,服務(wù)端就會固定的監(jiān)聽本地端口port,等著客戶端來向它發(fā)起請求。為了計算簡單,我們假設(shè)服務(wù)器端的IP跟端口是多對一的,這樣TCP四元組里面就有remote ip和remote port是可變的,因此最大支持創(chuàng)建TCP個數(shù)為2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等于2的48次方。 現(xiàn)實中單臺Linux服務(wù)器支持的TCP連接數(shù)量。通過前面的分析我們知道,在現(xiàn)實場景中,由于存在端口port復(fù)用的情況,服務(wù)器可同時支持的TCP連接數(shù)跟65535沒有一一對應(yīng)關(guān)系,事實上,真正影響TCP連接數(shù)量的,是服務(wù)器的內(nèi)存以及允許單一進(jìn)程同時打開文件的數(shù)量,因為每創(chuàng)建一個TCP連接都要創(chuàng)建一個socket句柄,每個socket句柄都占用一部分系統(tǒng)內(nèi)存,當(dāng)系統(tǒng)內(nèi)存被占用殆盡,允許的TCP并發(fā)連接數(shù)也就到了上限。一般來講,通過增加服務(wù)器內(nèi)存、修改最大文件描述符個數(shù)等,可以做到單臺服務(wù)器支持10萬+的TCP并發(fā)。

2b2a5010-5d6c-11ed-a3b6-dac502259ad0.jpg

當(dāng)然,在真實的商用場景下,單臺服務(wù)器都會編入分布式集群,通過負(fù)載均衡算法動態(tài)的調(diào)度不同用戶的請求給最空閑的服務(wù)器,如果服務(wù)器平均內(nèi)存使用超過80%的警戒線,那么就會及時采用限流或者擴(kuò)展集群的方式來保證服務(wù),絕對不會出現(xiàn)服務(wù)器的內(nèi)存被耗盡的情況,那樣就算事故了。 總之,65535只是Linux系統(tǒng)中可使用端口port數(shù)量的上限,端口port數(shù)量與TCP連接數(shù)量并非完全一一對應(yīng)的關(guān)系,服務(wù)器支持的TCP并發(fā)連接數(shù)量主要跟服務(wù)器的內(nèi)存以及允許單個進(jìn)程同時打開的文件數(shù)量有關(guān)系,通過端口復(fù)用及調(diào)整服務(wù)器參數(shù)等手段,單臺服務(wù)器支持的TCP并發(fā)連接數(shù)是可以高于65535的。

審核編輯:郭婷

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

    關(guān)注

    12

    文章

    8866

    瀏覽量

    84962
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6617

    瀏覽量

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

    關(guān)注

    8

    文章

    1337

    瀏覽量

    78868

原文標(biāo)題:一臺服務(wù)器?最大并發(fā)TCP連接數(shù)多少?65535?

文章出處:【微信號:AI_Architect,微信公眾號:智能計算芯世界】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Kubernetes集群搭建容器云需要幾臺服務(wù)器

    Kubernetes集群搭建容器云需要幾臺服務(wù)器?至少需要4臺服務(wù)器。搭建容器云所需的服務(wù)器數(shù)量以及具體的搭建步驟,會根據(jù)所選用的技術(shù)棧、業(yè)務(wù)規(guī)模、架構(gòu)設(shè)計以及安全需求等因素而有所不同。以下是一個基于Kubernetes集群的容
    的頭像 發(fā)表于 10-21 10:06 ?60次閱讀

    如果ESP上的TCP客戶端與服務(wù)器斷開連接,如何啟用自動重連?

    ESP - TCP 客戶端 嵌入式 Linux 服務(wù)器 - TCP 服務(wù)器 如果ESP上的TCP客戶端與
    發(fā)表于 07-17 06:25

    tcp方式連接不了服務(wù)器了,服務(wù)器代碼還能開源嗎?

    是在維護(hù)服務(wù)器嗎?已經(jīng)兩天了。http方式還可以連接上,就tcp的方式不行了.服務(wù)器代碼能開源嗎?讓我們自己搭建服務(wù)器用。
    發(fā)表于 07-15 06:53

    ESP826如何運行AP TCP服務(wù)器?

    我正在開發(fā)一個室外遠(yuǎn)程控制系統(tǒng),帶有來自ESP8266 AP的專用WLAN。帶有 TCP 客戶端的平板電腦應(yīng)連接到它,以便在 ESP 上設(shè)置一些 GPIO。根據(jù)我的理解,ESP 上的 TCP
    發(fā)表于 07-09 06:27

    AT+CIPSERVERMAXCONN查詢/設(shè)置服務(wù)器允許建立的最大連接數(shù)是幾個呢?

    AT+CIPSERVERMAXCONN查詢/設(shè)置服務(wù)器允許建立的最大連接數(shù)是幾個呢?
    發(fā)表于 06-27 08:07

    求助,關(guān)于ESP32C3 TCP客戶端連接斷線問題求解

    ESP32C3開啟AP模式做TCP服務(wù)器,手機(jī)做客戶端連接服務(wù)器;超過默認(rèn)最大連接數(shù)(5)以后,即使有部分客戶端斷開了,也無法再發(fā)起
    發(fā)表于 06-27 07:54

    電腦TCP客戶端連接開發(fā)板時LWIP出現(xiàn)錯誤怎么解決?

    開發(fā)板使用的STM32F407,UCOSII+LWIP,開發(fā)板作TCP服務(wù)器時,用電腦作TCP客戶端連接連接數(shù)在第四個時LWIP出現(xiàn)錯誤:
    發(fā)表于 05-09 06:38

    無線測溫系統(tǒng)的后臺服務(wù)器

    無線測溫后臺服務(wù)器是無線測溫系統(tǒng)的重要組成部分,它負(fù)責(zé)接收、處理、存儲和展示來自無線測溫設(shè)備的數(shù)據(jù)。 報警功能是后臺服務(wù)器的一個重要特色,用戶可根據(jù)需求自定義溫度報警值。一旦設(shè)備溫度超過設(shè)定值,后臺服務(wù)器
    的頭像 發(fā)表于 03-29 09:42 ?286次閱讀

    服務(wù)器遠(yuǎn)程不上服務(wù)器怎么辦?服務(wù)器無法遠(yuǎn)程的原因是什么?

    。 解決辦法:一般剛開始拿到的服務(wù)器的端口服務(wù)器商會主動幫忙設(shè)置好的,在這之后更換了的端口記得要加進(jìn)防火墻策略哦, 不會操作的話可以聯(lián)系服務(wù)器商幫忙操作。 3.已超出遠(yuǎn)程計算機(jī)上的連接數(shù)
    發(fā)表于 02-27 16:21

    服務(wù)器數(shù)據(jù)恢復(fù)—服務(wù)器陣列磁盤進(jìn)水損壞的數(shù)據(jù)恢復(fù)案例

    服務(wù)器數(shù)據(jù)恢復(fù)環(huán)境: 數(shù)臺服務(wù)器+數(shù)臺存儲陣列柜,共上百塊硬盤,劃分了數(shù)十組lun。 服務(wù)器故障&檢測: 外部因素導(dǎo)致
    的頭像 發(fā)表于 01-22 13:40 ?290次閱讀
    <b class='flag-5'>服務(wù)器</b>數(shù)據(jù)恢復(fù)—<b class='flag-5'>服務(wù)器</b>陣列磁盤進(jìn)水損壞的數(shù)據(jù)恢復(fù)案例

    臺服務(wù)器,最大支持TCP連接數(shù)是多少?

    很多同學(xué)第一反應(yīng)就是端口的限制,端口號最多是 65536個,那就最多只能支持 65536 條 TCP 連接
    的頭像 發(fā)表于 01-19 18:16 ?5155次閱讀
    一<b class='flag-5'>臺服務(wù)器</b>,最大<b class='flag-5'>支持</b>的<b class='flag-5'>TCP</b><b class='flag-5'>連接數(shù)</b>是多少?

    如何配置臺服務(wù)器

    萬里征途總是從第一步開始的,構(gòu)建一個復(fù)雜系統(tǒng)也是如此。我們從簡單的部分著手,先讓所有的功能都在一個服務(wù)器上運行。圖1-1展示了如何配置臺服務(wù)器,讓一切都在其上運行,包括Web應(yīng)用、數(shù)據(jù)庫、緩存等。
    的頭像 發(fā)表于 01-19 10:19 ?507次閱讀
    如何配置<b class='flag-5'>單</b><b class='flag-5'>臺服務(wù)器</b>

    redis連接數(shù)對性能測試影響

    連接數(shù)對性能測試的影響。 連接數(shù)并發(fā)性能: 在性能測試中,連接數(shù)代表著客戶端同時連接到Redis服務(wù)器
    的頭像 發(fā)表于 12-04 11:33 ?888次閱讀

    redis連接數(shù)配置多少合適

    Redis 是一款高性能的內(nèi)存數(shù)據(jù)庫,廣泛應(yīng)用于緩存、消息隊列、會話存儲等場景。在配置 Redis 連接數(shù)時,需要根據(jù)實際情況綜合考慮一系列因素,如服務(wù)器硬件規(guī)格、業(yè)務(wù)負(fù)載、并發(fā)訪問量、數(shù)據(jù)模型等
    的頭像 發(fā)表于 12-04 11:31 ?1254次閱讀

    服務(wù)器并發(fā)的概念

    在編寫服務(wù)器時,如果服務(wù)器的設(shè)計初衷是要可以承擔(dān)百萬、千萬的客戶端連接,那么默認(rèn)的情況下,Linux操作系統(tǒng)提供的相關(guān)配置參數(shù)(比如說進(jìn)程可分配的文件數(shù)目等)是不能夠滿足我們的程序需求的,因此需要
    的頭像 發(fā)表于 11-10 10:05 ?4196次閱讀
    <b class='flag-5'>服務(wù)器</b><b class='flag-5'>并發(fā)</b>的概念