최신 Linux 박스가 가질 수있는 이론상 최대 개방 TCP 연결 수는 얼마입니까? TCP 연결을 고유하게 정의하는 것입니다. 이는

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

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

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

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



답변

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

종종 인용되는 ’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입니다.


답변

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


답변

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

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


답변