• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            TCP最大連接數

            由于TCP連接本質上可以理解為是client-server端的一對socket內核對象,那么從理論上將應該是【2^32 (ip數) * 2^16 (端口數)】條連接(約等于兩百多萬億)
            struct socket {  
                ....
                //INET域專用的一個socket表示, 提供了INET域專有的一些屬性,比如 IP地址,端口等
                struct sock             *sk;  
                //TCP連接的狀態:SYN_SENT、SYN_RECV、ESTABLISHED.....
                short                   type;  
                ....
            };  
            struct inet_sock {  
            ...
              __u32    daddr;   //IPv4的目標地址。  
              __u16    dport;   //目標端口。   
              __u32    saddr;   //源地址。  
              __u16    sport;   //源端口。  
            ...
            };  
            這個 socket 對象也就是一個數據結構,里面包含了 TCP 四元組的信息:源IP、源端口、目標IP、目標端口。
            0.0.0.0 指的是本機上的所有IPV4地址
            如果只以ESTABLISH狀態的連接來算(這些連接只是建立,但是不收發數據也不處理相關的業務邏輯)那么一臺服務器最大能建立多少連接呢?
            這種情況下,那么能建立的連接數量主要取決于【內存的大小】(因為如果是)ESTABLISH狀態的空閑連接,不會消耗CPU(雖然有TCP保活包傳輸,但這個影響非常小,可以忽略不計)
            我們知道一條ESTABLISH狀態的連接大約消耗【3.3KB內存】,那么通過計算得知一臺4GB內存的服務器,【可以建立100w+的TCP連接】(當然這里只是計算所有的連接都只建立連接但不發送和處理數據的情況,如果真實場景中有數據往來和處理(數據接收和發送都需要申請內存,數據處理便需要CPU),那便會消耗更高的內存以及占用更多的CPU,并發不可能達到100w+)
            上面討論的都是進建立連接的理想情況,在現實中如果有頻繁的數據收發和處理(比如:壓縮、加密等),那么一臺服務器能支撐1000連接都算好的了,所以一臺服務器能支撐多少連接還要結合具體的場景去分析,不能光靠理論值去算。拋開業務邏輯單純的談并發沒有太大的實際意義。
            服務器的開銷大頭往往并不是連接本身,而是每條連接上的數據收發,以及請求業務邏輯處理!?。?br />


            三次握手里socket的全連接隊列長度由參數net.core.somaxconn來控制,默認大小是128,當兩臺機器離的非常近,但是建立連接的并發又非常高時,可能會導致半連接隊列或全連接隊列溢出,進而導致server端丟棄握手包。然后造成client超時重傳握手包(至少1s以后才會重傳),導致三次握手連接建立耗時過長??梢哉{整參數net.core.somaxconn來增加去按連接隊列的長度,進而減小丟包的影響



            在Linux一切皆文件,當然也包括之前TCP連接中說的socket。進程打開一個socket的時候需要創建好幾個內核對象,換一句直白的話說就是打開文件對象吃內存,所以Linux系統基于安全角度考慮(比如:有用戶進程惡意的打開無數的文件描述符,那不得把系統搞奔潰了),在多個位置都限制了可打開的文件描述符的數量。
            內核是通過【hash表】的方式來管理所有已經建立好連接的socket,以便于有請求到達時快速的通過【TCP四元組】查找到內核中對應的socket對象
            在epoll模型中,通過紅黑樹來管理epoll對象所管理的所有socket,用紅黑樹結構來平衡快速刪除、插入、查找socket的效率

            posted on 2024-07-09 21:37 Benjamin 閱讀(66) 評論(0)  編輯 收藏 引用 所屬分類: 雜談

            久久久久97国产精华液好用吗| 久久精品国产69国产精品亚洲| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产午夜精品久久久久九九| 精品国产婷婷久久久| 伊人精品久久久久7777| 久久99九九国产免费看小说| 亚洲综合精品香蕉久久网| 韩国无遮挡三级久久| 亚洲国产成人精品女人久久久| 亚洲午夜久久久影院伊人| 久久国产精品久久国产精品| 久久se这里只有精品| 久久久久久亚洲AV无码专区| 丰满少妇人妻久久久久久4| 99精品国产免费久久久久久下载| 久久er国产精品免费观看2| 婷婷久久综合九色综合绿巨人| 国产精品久久波多野结衣| 亚洲日韩欧美一区久久久久我| 精品久久久久久无码专区不卡| 色诱久久av| 久久香蕉国产线看观看乱码| 亚洲国产精品无码成人片久久| 伊色综合久久之综合久久| 品成人欧美大片久久国产欧美...| 亚洲中文字幕无码一久久区| 久久青青草原精品国产软件| 国产精品久久久久9999| 欧洲成人午夜精品无码区久久 | 久久无码av三级| 成人资源影音先锋久久资源网| 亚洲欧美伊人久久综合一区二区 | 中文字幕亚洲综合久久菠萝蜜| 久久综合欧美成人| 97久久久久人妻精品专区| 婷婷久久久亚洲欧洲日产国码AV | 国内精品伊人久久久久av一坑 | 午夜视频久久久久一区| 精品一久久香蕉国产线看播放 | 久久精品国产亚洲av麻豆图片 |