RM新时代网站-首页

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

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

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

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

小林coding ? 來(lái)源:小林coding ? 2024-01-19 18:16 ? 次閱讀

大家好,我是小林。

最近有讀者面試騰訊的時(shí)候,被問(wèn)到 2 個(gè)很有意思的問(wèn)題:

一個(gè)服務(wù)端進(jìn)程最大能支持多少條 TCP 連接?

一臺(tái)服務(wù)器最大能支持多少條 TCP 連接?

很多同學(xué)第一反應(yīng)就是端口的限制,端口號(hào)最多是 65536個(gè),那就最多只能支持 65536 條 TCP 連接。

實(shí)際上這是不對(duì)的!

今天都帶大家分析一波這兩個(gè)問(wèn)題。

一個(gè)服務(wù)端進(jìn)程最多能支持多少條 TCP 連接?

首先我們要知道 TCP 連接本質(zhì)上在內(nèi)核里就是一個(gè) socket 對(duì)象。

structsocket{
....
//INET域?qū)S玫囊粋€(gè)socket表示,提供了INET域?qū)S械囊恍傩裕热鏘P地址,端口等
structsock*sk;
//TCP連接的狀態(tài):SYN_SENT、SYN_RECV、ESTABLISHED.....
shorttype;
....
};

structinet_sock{
...
__u32daddr;//IPv4的目標(biāo)地址。
__u16dport;//目標(biāo)端口。
__u32saddr;//源地址。
__u16sport;//源端口。
...
};

這個(gè) socket 對(duì)象也就是一個(gè)數(shù)據(jù)結(jié)構(gòu),里面包含了 TCP 四元組的信息:源IP、源端口、目標(biāo)IP、目標(biāo)端口。

6ee88d74-b6a5-11ee-8b88-92fbcf53809c.png

TCP 四元組

所以, 只要確認(rèn)了【源IP、源端口、目標(biāo)IP、目標(biāo)端口】這四個(gè)信息,就能在內(nèi)核中找到這個(gè) socket 對(duì)象,也就能確定一條 TCP 連接。

一個(gè)服務(wù)端進(jìn)程通常是監(jiān)聽(tīng) 1 個(gè)端口號(hào)(當(dāng)然也可能監(jiān)聽(tīng)多個(gè)端口號(hào),這里不考慮),比如我的圖解網(wǎng)站的 nginx 服務(wù),就監(jiān)聽(tīng)了 443 端口。

6efcd57c-b6a5-11ee-8b88-92fbcf53809c.png

你們看圖解網(wǎng)站的時(shí)候,實(shí)際上就是通過(guò) nginx 服務(wù)把網(wǎng)頁(yè)數(shù)據(jù)發(fā)送給你們的。

然后,服務(wù)端進(jìn)程除了會(huì)固定監(jiān)聽(tīng)某個(gè)一個(gè)端口之外,也通常會(huì)綁定 0.0.0.0 IP 地址。

這個(gè)IP地址是特殊的, 0.0.0.0 指的是本機(jī)上的所有IPV4地址,如果一個(gè)主機(jī)有兩個(gè) IP 地址,192.168.1.1 和 10.1.2.1,并且該主機(jī)上的一個(gè)服務(wù)監(jiān)聽(tīng)的地址是0.0.0.0,那么通過(guò)兩個(gè) IP 地址都能夠訪(fǎng)問(wèn)該服務(wù)。

所以一個(gè)服務(wù)端進(jìn)程,意味著他的 IP地址和端口號(hào)是固定的(0.0.0.0:443)。

也就是當(dāng)客戶(hù)端與服務(wù)端建立一條 TCP 連接的時(shí)候,這個(gè) TCP 連接的四元組信息中服務(wù)端的 IP地址和端口號(hào)是固定的,能產(chǎn)生變化的就是客戶(hù)端的 IP 地址和端口號(hào)了。

因此,一個(gè)服務(wù)端進(jìn)程最大能支持的 TCP 連接個(gè)數(shù)的計(jì)算公式如下:

6f00b48a-b6a5-11ee-8b88-92fbcf53809c.png

對(duì) IPv4,客戶(hù)端的 IP 數(shù)最多為 2 的 32 次方,客戶(hù)端的端口數(shù)最多為 2 的 16 次方。

那么一個(gè)服務(wù)端進(jìn)程理想情況下,最大的 TCP 連接數(shù)約為 2 的 48 次方(2^32 (ip數(shù)) * 2^16 (端口數(shù)),這數(shù)值是非??鋸埖牧耍s等于兩百多萬(wàn)億!

當(dāng)然,服務(wù)端進(jìn)程最大能支持的 TCP 連接數(shù)遠(yuǎn)不能達(dá)到理論上限,還會(huì)受到文件描述符、內(nèi)存大小資源的限制,畢竟 socket 在 Linux 的視角其實(shí)就是文件資源,而且一個(gè) socket 對(duì)象也會(huì)占用一定的內(nèi)存資源。

因此,會(huì)受以下因素影響:

文件描述符限制,每個(gè) TCP 連接都是一個(gè)文件,如果文件描述符被占滿(mǎn)了,會(huì)發(fā)生 Too many open files。Linux 對(duì)可打開(kāi)的文件描述符的數(shù)量分別作了三個(gè)方面的限制:

系統(tǒng)級(jí):當(dāng)前系統(tǒng)可打開(kāi)的最大數(shù)量,通過(guò) cat /proc/sys/fs/file-max 查看;

用戶(hù)級(jí):指定用戶(hù)可打開(kāi)的最大數(shù)量,通過(guò) cat /etc/security/limits.conf 查看;

進(jìn)程級(jí):?jiǎn)蝹€(gè)進(jìn)程可打開(kāi)的最大數(shù)量,通過(guò) cat /proc/sys/fs/nr_open 查看;

內(nèi)存限制,每個(gè) TCP 連接都要占用一定內(nèi)存,操作系統(tǒng)的內(nèi)存是有限的,如果內(nèi)存資源被占滿(mǎn)后,會(huì)發(fā)生 OOM。

一臺(tái)服務(wù)器最大最多能支持多少條 TCP 連接?

前面分析是一個(gè)服務(wù)端進(jìn)程理的情況,理論上能最大支持約為 2 的 48 次方(2^32 (ip數(shù)) * 2^16 (端口數(shù)),約等于兩百多萬(wàn)億!

那到了一臺(tái)服務(wù)器的視角就會(huì)有一點(diǎn)不一樣。

一臺(tái)服務(wù)器是可以有多個(gè)服務(wù)端進(jìn)程的,每個(gè)服務(wù)端進(jìn)程監(jiān)聽(tīng)不同的端口,比如:ssh的22,Redis的6339,當(dāng)然所有65535個(gè)端口你都可以用來(lái)監(jiān)聽(tīng)一遍。

6f05e95a-b6a5-11ee-8b88-92fbcf53809c.png

當(dāng)然所有65535個(gè)端口你都可以用來(lái)監(jiān)聽(tīng)一遍,這樣理論上線(xiàn)就到了2的32次方(ip數(shù))×2的16次方(port數(shù))×2的16次方(服務(wù)器port數(shù))個(gè),感興趣你可以算一下,這個(gè)基本相當(dāng)于無(wú)窮個(gè)了。

不過(guò)理想和實(shí)際總是會(huì)有差距的!

因?yàn)長(zhǎng)inux每維護(hù)一條TCP連接都要花費(fèi)資源,處理連接請(qǐng)求,?;?,數(shù)據(jù)的收發(fā)時(shí)需要消耗一些CPU,維持TCP連接主要消耗內(nèi)存。

我們題目的問(wèn)題是考慮最大多少個(gè)連接,所以我們先不考慮數(shù)據(jù)的收發(fā),那么TCP在靜止的狀態(tài)下,就不怎么消耗CPU了,主要消耗內(nèi)存,而Linux上內(nèi)存是有限的。

首先,我們要知道一條處于 ESTABLISH 狀態(tài)的 TCP 連接具體占用多大內(nèi)存?

一個(gè) TCP 對(duì)象占用的大小,等于它所包含的一些數(shù)據(jù)結(jié)構(gòu)占用大小的總和,也是就把上面這些數(shù)據(jù)結(jié)構(gòu)的大小累加起來(lái),就是一個(gè) TCP 連接占用的大小了。

這里直接給大家一個(gè)結(jié)論,一條處于 ESTABLISH 狀態(tài)的 TCP 連接占用的大小是 3.44 KB(0.81K+2.19K+0.19K+0.25K)。

6f09bf44-b6a5-11ee-8b88-92fbcf53809c.png

TCP對(duì)象內(nèi)存開(kāi)銷(xiāo)總結(jié)

也就是,每一條靜止?fàn)顟B(tài)的TCP連接大約需要吃 3.44K 的內(nèi)存。

那么 8 GB 物理內(nèi)存的服務(wù)器,最大能支持的 TCP 連接數(shù)=8GB/3.44KB=2,438,956(約240萬(wàn))

當(dāng)然, 實(shí)際過(guò)程中的 TCP 連接,肯定不是靜止?fàn)顟B(tài)的,還會(huì)進(jìn)行發(fā)送數(shù)據(jù)和接收數(shù)據(jù)了,那么這些過(guò)程還是會(huì)額外消耗更多的內(nèi)存資源的,并發(fā)很難達(dá)到百萬(wàn)級(jí)別。

總結(jié)

一個(gè)服務(wù)端進(jìn)程最多能支持多少條 TCP 連接?

如果在不考慮服務(wù)器的內(nèi)存和文件句柄資源的情況下,理論上一個(gè)服務(wù)端進(jìn)程最多能支持約為 2 的 48 次方(2^32 (ip數(shù)) * 2^16 (端口數(shù)),約等于兩百多萬(wàn)億!

但是在實(shí)際中是支持不了這個(gè)數(shù)值的,每個(gè) TCP 連接都是一個(gè)文件,會(huì)占用文件句柄資源,也會(huì)占用一定的內(nèi)存空間。

一臺(tái)服務(wù)器最大最多能支持多少條 TCP 連接?

一臺(tái)服務(wù)器是可以有多個(gè)服務(wù)端進(jìn)程的,每個(gè)服務(wù)端進(jìn)程監(jiān)聽(tīng)不同的端口,當(dāng)然所有65535個(gè)端口你都可以用來(lái)監(jiān)聽(tīng)一遍。

當(dāng)然所有65535個(gè)端口你都可以用來(lái)監(jiān)聽(tīng)一遍,這樣理論上線(xiàn)就到了2的32次方(ip數(shù))×2的16次方(port數(shù))×2的16次方(服務(wù)器port數(shù))個(gè),這個(gè)基本相當(dāng)于無(wú)窮個(gè)了。

但是 Linux每維護(hù)一條TCP連接都要花費(fèi)內(nèi)存資源的,每一條靜止?fàn)顟B(tài)(不發(fā)送數(shù)據(jù)和不接收數(shù)據(jù))的 TCP 連接大約需要吃 3.44K 的內(nèi)存,那么 8 GB 物理內(nèi)存的服務(wù)器,最大能支持的 TCP 連接數(shù)=8GB/3.44KB=2,438,956(約240萬(wàn))。

實(shí)際過(guò)程中的 TCP 連接,還會(huì)進(jìn)行發(fā)送數(shù)據(jù)和接收數(shù)據(jù)了,那么這些過(guò)程還是會(huì)額外消耗更多的內(nèi)存資源的,并發(fā)很難達(dá)到百萬(wàn)級(jí)別。







審核編輯:劉清

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

    關(guān)注

    87

    文章

    11292

    瀏覽量

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

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79055

原文標(biāo)題:騰訊三面:一臺(tái)服務(wù)器,最大支持的TCP連接數(shù)是多少?

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    服務(wù)器超出了連接范圍的解決方法

    服務(wù)器超出了連接范圍的解決方法終端服務(wù)器超出了最大允許連接解決方法使用遠(yuǎn)程桌面鏈接登錄到終端服務(wù)器
    發(fā)表于 01-06 22:59

    Linux的TCP Server最大連接數(shù)是多少

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

    怎樣把設(shè)計(jì)的library移動(dòng)到另一臺(tái)服務(wù)器上去?

    在完成設(shè)計(jì)之后,想把設(shè)計(jì)的library移動(dòng)到另一臺(tái)服務(wù)器。直接copy過(guò)去,設(shè)計(jì)相關(guān)的工藝庫(kù)的信息怎么處理啊?在設(shè)計(jì)之前,會(huì)做attach工藝庫(kù)的動(dòng)作。對(duì)于完整的設(shè)計(jì),這個(gè)要怎么attach工藝庫(kù)呢?
    發(fā)表于 06-24 06:44

    如何將整個(gè)POST參數(shù)字符串傳遞到另一臺(tái)服務(wù)器?

    正在發(fā)送“X=nnn&Y=nnn&Z=nnn”,并希望將其原封不動(dòng)地傳遞給另一臺(tái)服務(wù)器
    發(fā)表于 02-27 06:18

    有沒(méi)有人有多個(gè)LWIP客戶(hù)端通過(guò)個(gè)端口連接一臺(tái)服務(wù)器的示例?

    有沒(méi)有人有多個(gè)客戶(hù)端通過(guò)個(gè)端口連接一臺(tái)服務(wù)器的示例?這樣做的最佳做法是什么?
    發(fā)表于 03-02 08:17

    租用一臺(tái)服務(wù)器多少錢(qián)?

    租用一臺(tái)服務(wù)器多少錢(qián)??很多初次購(gòu)買(mǎi)服務(wù)器的用戶(hù)經(jīng)常會(huì)詢(xún)問(wèn)服務(wù)器多少錢(qián)一臺(tái)的問(wèn)題,而要回答這個(gè)問(wèn)題,首先就得遵循服務(wù)器購(gòu)買(mǎi)流程,先依據(jù)自身的
    發(fā)表于 07-20 11:11 ?1377次閱讀

    一臺(tái)Linux服務(wù)器最多能支撐多少個(gè)TCP連接?

    量,還是內(nèi)存大小,亦或者是可創(chuàng)建文件句柄數(shù)量?讓我們起來(lái)了解下吧。 困惑很多人的并發(fā)問(wèn)題 在網(wǎng)絡(luò)開(kāi)發(fā)中,我發(fā)現(xiàn)有很多同學(xué)對(duì)個(gè)基礎(chǔ)問(wèn)題始終是沒(méi)有徹底搞明白。那就是一臺(tái)服務(wù)器最大究竟能
    的頭像 發(fā)表于 12-29 11:13 ?5171次閱讀

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

    的文件數(shù)量有關(guān)系,通過(guò)端口復(fù)用及調(diào)整服務(wù)器參數(shù)等手段,單臺(tái)服務(wù)器支持TCP并發(fā)連接數(shù)是可以高于65535的。
    的頭像 發(fā)表于 11-06 19:36 ?1602次閱讀

    用舊手機(jī)DIY一臺(tái)服務(wù)器

    本文將向你展示如何使用 UrBackup 和 Linux Deploy在一臺(tái) Android 舊手機(jī)上搭建一臺(tái)備份服務(wù)器。舊手機(jī)的污染問(wèn)題眾所周知,我有一臺(tái)舊手機(jī),雖然外殼有裂紋和磨損
    的頭像 發(fā)表于 12-30 14:30 ?1328次閱讀

    一臺(tái)服務(wù)器最大能建立多少條TCP連接呢?

    我們知道在Linux中切皆文件,那么一臺(tái)服務(wù)器最大能打開(kāi)多少個(gè)文件呢?Linux上能打開(kāi)的最大文件數(shù)量受三個(gè)參數(shù)影響
    的頭像 發(fā)表于 02-03 10:11 ?1597次閱讀

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

    服務(wù)器數(shù)據(jù)恢復(fù)環(huán)境: 數(shù)臺(tái)服務(wù)器+數(shù)臺(tái)存儲(chǔ)陣列柜,共上百塊硬盤(pán),劃分了數(shù)十組lun。 服務(wù)器
    的頭像 發(fā)表于 01-22 13:40 ?349次閱讀
    <b class='flag-5'>服務(wù)器</b>數(shù)據(jù)恢復(fù)—<b class='flag-5'>服務(wù)器</b>陣列磁盤(pán)進(jìn)水損壞的數(shù)據(jù)恢復(fù)案例

    主機(jī)托管是多個(gè)用戶(hù)共享一臺(tái)服務(wù)器嗎?有什么優(yōu)勢(shì)

    主機(jī)托管并不是多個(gè)用戶(hù)共享一臺(tái)服務(wù)器。主機(jī)托管是服務(wù),客戶(hù)可以將自己的硬件服務(wù)器托管給服務(wù)商,并享受專(zhuān)業(yè)的
    的頭像 發(fā)表于 08-13 14:45 ?245次閱讀

    多個(gè)網(wǎng)站放在同一臺(tái)服務(wù)器ip有什么影響?

    將多個(gè)網(wǎng)站放在同一臺(tái)服務(wù)器上,使用同個(gè)IP地址,可能會(huì)有以下影響: 1、資源共享:多個(gè)網(wǎng)站共享同一臺(tái)服務(wù)器的資源,如CPU、內(nèi)存、存儲(chǔ)空間和帶寬。如果其中個(gè)網(wǎng)站流量或資源消耗突然增
    的頭像 發(fā)表于 09-12 11:15 ?536次閱讀
    RM新时代网站-首页