首頁  >  文章  >  系統教程  >  網路程式設計中單機最大並發 TCP 連線數及識別方式解析

網路程式設計中單機最大並發 TCP 連線數及識別方式解析

王林
王林原創
2024-07-19 13:09:22396瀏覽

网络编程中单机最大并发 TCP 连接数及标识方式解析

網路程式設計在tcp應用中,server事先在某個固定埠竊聽,client主動發動聯接,經過三路握手後建置tcp連接。這麼對單機,其最大並發tcp連接數是多少?

怎麼標示一個TCP聯接在決定最大聯接數之前,先來瞧瞧系統怎樣標示一個tcp聯接。系統用一個4四元組來惟一標示一個TCP聯結:{localip,localport,remoteip,remoteport}。

client最大tcp連接數client每次發起tcp聯接懇求時,除非綁定端口,一般會讓系統選定一個空閒的本地端口(localport),該端口是獨佔的,不能和其他tcp聯接共享。 tcp埠的資料型別是unsignedshort,因而本機埠個數最大隻有65536linux伺服器系統,埠0有特殊涵義,不能使用,這樣可用埠最多只有65535,所以在全部作為client端的情況下,最大tcp連結數為65535 ,這種聯結可以連到不同的serverip。

server最大tcp聯接數server一般固定在某個本機連接埠上竊聽,等待client的聯接懇求。在考慮位址重複使用(unix的SO_REUSEADDR選項)的情況下,雖然server端有多個ip,本地竊聽埠也是獨佔的,因而server端tcp連結4元組中只有remoteip(也就是clientip)和remoteport(客戶端port)是可變的,因而最大tcp連結為顧客端ip數×客戶端port數,對IPV4,不考慮ip位址分類等誘因linux 軟體,最大tcp連結數約為2的32次方(ip數) ×2的16次方(port數)linux tcp連線數限制,也就是server端單機最大tcp連結數約為2的48次方。

這麼單一伺服器上的並發TCP聯接數可以有多少

前面給出的是理論上的單機最大聯接數,在實際環境中,遭到機器資源、操作系統等的限制,非常是sever端,其最大並發tcp聯接數遠不能達到理論上限。在unix/linux下限制聯接數的主要誘因是顯存和容許的文件描述符個數(每位tcp聯接都要佔用一定顯存,每位socket就是一個文件描述符),另外1024以下的端口一般為保留端口。在預設2.6內核配置下,經過試驗,每位socket佔用顯示存在15~20k之間。影響一個socket佔用顯存的參數包括:rmem_maxwmem_maxtcp_rmemtcp_wmemtcp_memgrepskbuff/proc/slabinfo對server端,透過降低顯存、修改最大檔案描述符個數等參數,單機最大並發TCP聯接數超過10萬是沒問題的公司,美國UrbanAirship產品環境中已做到50萬併發。在實際應用中,對大規模網路應用,還須考慮C10K問題。

linux tcp连接数限制_限制连接数量_限制连接数与限制网速的效果

下邊再解讀一下檔案句柄限制和連接埠限制兩大常識

常識一:文件句柄限制

在linux下編撰網路伺服器程式的同事肯定都曉得每一個tcp聯接都要佔一個檔案描述符,一旦這個檔案描述符使用完了,新的聯接到來傳回給我們的錯誤是「Socket/File:Can 'topensomanyfiles」。

這時你必須明白作業系統對可以開啟的最大檔案數的限制。

linux tcp连接数限制_限制连接数与限制网速的效果_限制连接数量

進程限制

ulimit-n을 실행하면 1024가 출력됩니다. 이는 프로세스가 최대 1024개의 파일만 열 수 있음을 나타냅니다. 따라서 이 기본 구성을 사용하면 최대 수천 개의 TCP 연결을 동시에 실행할 수 있습니다.

임시 변경 사항: ulimit-n1000000, 이러한 임시 변경 사항은 현재 로그인된 사용자의 현재 사용 환경에만 유효하며 시스템을 다시 시작하거나 사용자가 로그아웃한 후에는 유효하지 않습니다.

다시 시작한 후 무효화되는 변경 사항(그러나 CentOS6.5에서 테스트한 결과 다시 시작한 후 무효성을 발견하지 못함): /etc/security/limits.conf 파일을 편집하면 변경된 내용은

linux tcp连接数限制_限制连接数与限制网速的效果_限制连接数量

*softnofile1000000

*하드노파일1000000

영구 변경 사항: /etc/rc.local을 편집하고 그 뒤에 다음 내용을 추가하세요

ulimit-SHn1000000

전역 제한

cat/proc/sys/fs/file-nr을 실행하면 93440592026이 출력됩니다. 이는 1. 할당된 파일 핸들 수, 2. 할당되었지만 사용되지 않은 파일 핸들 수, 3. 최대 파일 핸들 수입니다. 하지만 kernel2.6 버전에서는 두 번째 항목의 값이 항상 0이다. 이는 실제로 할당된 파일 디스크립터를 모두 낭비 없이 사용했다는 의미이다.

이 값을 더 큰 값으로 변경하고 루트 권한을 사용하여 /etc/sysctl.conf 파일을 변경할 수 있습니다.

fs.file-max=1000000

限制连接数与限制网速的效果_linux tcp连接数限制_限制连接数量

net.ipv4.ip_conntrack_max=1000000

filter.ip_conntrack_max=1000000

상식 2: 포트 번호의 범위가 제한되어 있나요?

1024 이하 운영 체제의 하위 배너는 시스템에 예약되어 있으며, 1024-65535는 사용자가 사용합니다. 각 TCP 연결은 포트 번호를 차지하므로 최대 60,000개 이상의 동시 연결을 가질 수 있습니다. 이런 잘못된 생각을 가지고 있는 학생들이 많은 것 같아요. (과거에도 늘 이런 느낌을 받았어요)

분석해보자

TCP 연결을 표시하는 방법: 시스템은 4-튜플을 사용하여 TCP 연결을 고유하게 표시합니다: {localip, localport, Remoteip, Remoteport}. 그럼 "UNIX 네트워크 프로그래밍: 1권"의 4장에서 accept에 대한 설명을 꺼내서 개념적인 내용을 살펴보겠습니다. 두 번째 매개변수 cliaddr은 클라이언트의 IP 주소와 포트 번호를 나타냅니다. 서버로서 우리는 실제로 바인드 중에만 이 포트를 사용합니다. 이는 포트 번호 65535가 동시성 양에 대한 제한이 아님을 보여줍니다.

서버에 대한 최대 TCP 연결 수: 서버는 일반적으로 로컬 포트에 고정되어 클라이언트의 연결 요청을 수신 대기합니다. 주소 재사용(유닉스의 SO_REUSEADDR 옵션)을 고려하지 않고, 서버 측에 IP가 여러 개 있더라도 로컬 도청 포트도 배타적이므로 4에는 RemoteIP(즉, clientip)와 RemotePort(클라이언트)만 있다. -서버 측 TCP 연결 튜플)은 가변적이므로 최대 TCP 연결은 클라이언트 IP 수 × 클라이언트 포트 수입니다. IP 주소 분류와 같은 인센티브와 관계없이Linux TCP 연결 수 제한. 최대 TCP 연결 수는 약 2 x 32 x 전원(IP 수) x 2의 16제곱(포트 수), 즉 서버 측 단일 시스템의 최대 TCP 연결 수입니다. 약 2의 48승입니다.

以上是網路程式設計中單機最大並發 TCP 連線數及識別方式解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn