<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一臺服務器?最大并發(fā) tcp 連接數(shù)多少?65535?

          共 4328字,需瀏覽 9分鐘

           ·

          2022-07-08 00:41

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

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

          如何標識一個TCP連接

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

          client最大tcp連接數(shù)

          client每次發(fā)起tcp連接請求時,除非綁定端口,通常會讓系統(tǒng)選取一個空閑的本地端口(local port),該端口是獨占的,不能和其他tcp連接共享。tcp端口的數(shù)據類型是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端單機最大tcp連接數(shù)約為2的48次方。

          實際的tcp連接數(shù)

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

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

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

          舉個例子:

          我們做了一個網站,綁定的是TCP的80端口,結果是所有訪問這個網站的用戶都是通過服務器的80端口訪問,而不是其他端口??梢姸丝谑强梢詮陀玫摹?span style="color: rgb(160, 160, 160);font-size: 14px;letter-spacing: 2px;word-spacing: 2px;text-align: right;widows: 1;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;">

          即使Linux服務器只在80端口偵聽服務, 也允許有10萬、100萬個用戶連接服務器。Linux系統(tǒng)不會限制連接數(shù)至于服務器能不能承受住這么多的連接,取決于服務器的硬件配置、軟件架構及優(yōu)化。

          01
          我們知道兩個進程如果需要進行通訊最基本的一個前提是:能夠唯一的標示一個進程。在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網絡中的兩個進程PID沖突幾率很大。

          這時候就需要另辟它徑了,IP地址可以唯一標示主機,而TCP層協(xié)議和端口號可以唯一標示主機的一個進程,這樣可以利用IP地址+協(xié)議+端口號唯一標示網絡中的一個進程。

          能夠唯一標示網絡中的進程后,它們就可以利用socket進行通信了。socket(套接字)是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用以實現(xiàn)進程在網絡中通信。

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

          02
          唯一能夠確定一個連接有4個東西:

          1. 服務器的IP

          2. 服務器的Port

          3. 客戶端的IP

          4. 客戶端的Port

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

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

          舉個例子:

          你的主機IP地址是1.1.1.1, 在8080端口監(jiān)聽
          當一個來自 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)

          那么,你主機的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é)議號)

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

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

          65535從哪來的,干啥的?

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

          TCP怎么建立連接,與端口號是什么關系?

          Linux服務器在交互時,一般有兩種身份:客戶端或者服務器端。典型的交互場景是:
          (1)服務器端主動創(chuàng)建監(jiān)聽的socket,并綁定對外服務端口port,然后開始監(jiān)聽
          (2)客戶端想跟服務器端通信時,就開始連接服務器的端口port
          (3)服務端接受客戶端的請求,然后再生成新的socket
          (4)服務器和客戶端在新的socket里進行通信

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

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

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

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

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

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

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

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

          鏈接:https://blog.csdn.net/daocaokafei/article/details/115410761


          推薦閱讀:

          世界的真實格局分析,地球人類社會底層運行原理

          不是你需要中臺,而是一名合格的架構師(附各大廠中臺建設PPT)

          企業(yè)IT技術架構規(guī)劃方案

          論數(shù)字化轉型——轉什么,如何轉?

          華為干部與人才發(fā)展手冊(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉型從業(yè)者必備!

          【中臺實踐】華為大數(shù)據中臺架構分享.pdf

          華為的數(shù)字化轉型方法論

          華為如何實施數(shù)字化轉型(附PPT)

          超詳細280頁Docker實戰(zhàn)文檔!開放下載

          華為大數(shù)據解決方案(PPT)

          瀏覽 15
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.大香蕉在线 | 五月天色婷婷综合 | 国产A片免费领取 | 18禁精品| 伊人妻|