최신 Linux 박스가 가질 수있는 이론상 최대 개방 TCP 연결 수는 얼마입니까?


236

하드웨어에서 무한한 성능을 가정 할 때 Linux 상자가> 65536 이상의 열린 TCP 연결을 지원할 수 있습니까?

임시 포트 수 (<65536)는 하나의 로컬 IP에서 하나의 원격 IP에있는 하나의 포트로의 연결 수가 제한됨을 이해합니다.

튜플 (로컬 IP, 로컬 포트, 원격 IP, 원격 포트)은 TCP 연결을 고유하게 정의하는 것입니다. 이는 이러한 매개 변수 중 하나 이상이 비어 ​​있으면 65K 이상의 연결을 지원할 수 있음을 의미합니다. 예를 들어 여러 로컬 IP에서 여러 원격 호스트의 단일 포트 번호에 연결합니다.

시스템에 또 다른 16 비트 제한이 있습니까? 아마도 파일 디스크립터의 수는?

답변:


350

하나의 청취 포트는 둘 이상의 연결을 동시에 수용 할 수 있습니다.

종종 인용되는 '64K'한계가 있지만 이는 서버 포트 당 클라이언트 당 이며 명확해야합니다.

각 TCP / IP 패킷에는 기본적으로 주소 지정을위한 4 개의 필드가 있습니다. 이것들은:

source_ip source_port destination_ip destination_port
< client            > < server                      >

TCP 스택 내에서이 4 개의 필드는 패킷을 연결 (예 : 파일 설명자)과 일치시키기위한 복합 키로 사용됩니다.

클라이언트가 동일한 대상에있는 동일한 포트에 대한 많은 연결을 가지고있는 경우 해당 필드 중 3 개는 동일 source_port합니다. 서로 다른 연결을 구별하기 위해서만 다릅니다. 포트는 16 비트 숫자이므로 지정된 클라이언트가 지정된 호스트 포트에 대해 가질 수있는 최대 연결 수는 64K입니다.

그러나 여러 클라이언트가 각각 일부 서버 포트에 최대 64K 연결을 가질 수 있으며, 서버에 여러 포트가 있거나 멀티 홈 인 경우 해당 포트를 더 곱할 수 있습니다.

따라서 실제 제한은 파일 설명자입니다. 각 개별 소켓 연결에는 파일 디스크립터가 제공되므로 실제로 시스템이 허용하고 자원을 처리하도록 구성된 파일 디스크립터 수는 한계입니다. 최대 제한은 일반적으로 300K 이상이지만 sysctl 과 같이 구성 할 수 있습니다 .

일반 박스에 대한 현실적인 한계는 단일 스레드 Jabber 메시징 서버와 같은 약 80K입니다.


3
(a) SO_REUSEADDR을 사용하고 (b) 다른 대상 IP 주소를 대상으로하는 경우 이론적으로 64K 이상의 발신 연결을 가질 수 있습니다. 그러나 커널 메모리 제한은 아마도 당신을 먼저 막을 것입니다.
Darron

4
sysctl 한도는 전체 시스템에 대한 것입니다. 프로세스의 최대 파일 디스크립터 수를 제한하는 ulimit로 구성 가능한 제한도 있습니다. 기본적으로 300K보다 훨씬 작습니다 (보통 1024).
pacoverflow

1
약간의 기술 : 클라이언트 시스템은 라우터에서 여러 IP 주소를 할당 할 수도 있습니다. 이들은 모두 단일 MAC에 할당되거나 해당 시스템에 추가 IP 주소를위한 여러 개의 물리적 네트워크 인터페이스가있을 수 있습니다. OP는 1 개의 IP를 지정했지만 더 많은 IP 주소를 배제하지 않는 것이 중요합니다.
Todd

2
@ 윌 아름답게 설명했다! 매우 도움이됩니다 ... +100 공감 비를주고 싶습니다 ... 감사합니다 :-)
Tom Taylor

1
tcp_fin_timeout은 기본적으로 60 초 동안 동일한 소켓 (소스, 대상, 포트 조합)을 차단하므로 연결이 자주 끊기고 다시 연결되는 경우 두 시스템간에 실제로 사용 가능한 tcp 연결 수가 크게 줄어 듭니다. TIME_WAIT 상태 (항상 지원되는 것은 아님)의 소켓 재사용 (tcp_tw_reuse = 1)을 허용하거나 TCP / IP 표준을 끊어이 시간 제한을 더 낮은 값으로 줄이면 (보통 잘 작동 함)이 문제를 최소화 할 수 있습니다.
fgwaller

17

서버를 실행하려고하고 하나의 시스템에서 제공 할 수있는 연결 수를 결정하려는 경우 C10k 문제점 과 많은 클라이언트를 동시에 제공하는 데 발생할 수있는 잠재적 문제점에 대해 읽을 수 있습니다.


14
C10k는 10 살이며 더 이상 재미 있지 않습니다. C1024K를 어떻게 다룰 수 있는지 알아 보려면 [이 글을 읽으십시오].
Chandranshu

@Chandranshu-당신은 metabrew.com/article/… 을 의미 습니까?
Mikko Rantalainen

1
@MikkoRantalainen-예. 현재 사용 가능한 더 나은 벤치 마크가 있다고 생각합니다. Phoenix 사람들은 이미 2 백만 개의 동시 연결로 푸시했습니다.
Chandranshu

3
@Chandranshu-12M 연결 Dell 데모가 있습니다 : mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen

1
몇 년 전 : Intel Atom D2700, 2GB RAM, 1.2M 동시 연결. 내가 가진 유일한 문제는 테스트 작업에서 Windows 상자와 관련이있었습니다. 이것들은 인텔 아톰 박스를 DoS하려고 시도하는 동안 정기적으로 뱃속까지 올라갔습니다 ...
Klaws

12

사용자 소켓에서 원시 소켓 ( SOCK_RAW) 을 사용하고 TCP를 다시 구현 한 경우이 경우에는 (local address, source port, destination address, destination port)튜플 수 (로컬 주소 당 ~ 2 ^ 64)로 답변이 제한된다고 생각합니다 .

물론 모든 연결 상태를 유지하려면 많은 메모리가 필요하며 커널 TCP 스택이 화 나거나 응답하지 않도록 iptables 규칙을 설정해야한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.