TCP 소스 포트는 호스트마다 고유해야합니까?


10

TCP 연결이 튜플 (소스 IP, 소스 포트, 대상 IP, 대상 포트)로 식별된다는 것을 알게되었습니다. 이론적으로, host1 : port1의 클라이언트가 server1 : port1에 연결하는 동시에 다른 클라이언트 (host1에서 실행)를 host1 : port1에서 server2 : port1로 연결할 수 있어야합니다.

Java에서 조금 테스트했지만 지금까지 가능합니다.

그러나 소스 포트가 호스트 주소에 대해 고유해야한다는 것을 여러 번 읽었습니다. 이는 기본적으로 최대 65536 개의 동시 발신 TCP 연결의 하드 한계가 있음을 의미합니다. 그게 사실입니까?

업데이트 : 여기 내 Java 코드가 있습니다. 이것은 작동하는 것으로 보이며 netstat -t 는 포트 9990 (1 ~ 9997, 1 ~ 9998)에서 2 개의 활성 발신 연결을 명확하게 보여줍니다 . 적어도 현대 리눅스에서는 가능할 것 같습니까?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

그리고 netstat -t 출력 (잘라 내기) :

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"잘 설계된 시스템의 상한에 대해 묻는다면 거의 확실하게 잘못하고있는 것입니다. "
Chris S

답변:


16

TCP 요구 사항이 아닙니다. TCP와 관련하여 소스 IP, 소스 포트, 대상 IP 및 대상 포트의 조합 만 고유하면됩니다. 그러나 실제로 대부분의 TCP API는 다른 소스 IP 주소가없는 한 동일한 소스 포트로 둘 이상의 연결을 작성하는 방법을 제공하지 않습니다.


2
고마워, 그것은 내 질문의 이론적 인 부분에 완전히 대답합니다! 모든 TCP 구현마다 시도해야 할 것 같습니다.
lxgr

5

실제로 최대 값은 일반적으로 낮습니다. 예를 들어 Linux는 net.ipv4.ip_local_port커널 매개 변수를 사용하여 아웃 바운드 연결에 사용되는 포트를 정의합니다. 이것은 보통 다음과 같습니다

sysctl net.ipv4.ip_local_port_range 32768 to 61000

sysctl로 사용 가능한 수를 늘릴 수 있습니다. 예 :

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

또는 같은 정보로 /etc/sysctl.conf를 편집 할 수 있습니다

net.ipv4.ip_local_port_range = 10000 65535

내가 찾은 모든 예제는 최소값도 1024입니다.


1

위의 Iain의 답변 외에도 커널에서 보내는 연결에 10,000 개의 포트만 허용 될 수 있습니다. 외부 네트워크에서는 로컬 네트워크에있는 127.1을 사용할 수 없으므로 서로 다른 IP 주소 ( external )에 대해 65K 포트 범위 내에 나가는 포트 세트가 있습니다.

따라서 발신 한도는 실제로 다음과 같습니다.

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

이 작업을 수행하려면 이 스레드에 대한 답변을 읽어야합니다 .


0

예. 사실입니다.

포트는 네트워크와 앱을 바인딩해야합니다.

TCP로 연결된 65553 개 이상의 응용 프로그램과 동일한 호스트에서 UDP로 연결된 65535 개를 가질 수 없습니다. 운영 체제는 네트워크에 연결되는 각 앱마다 포트를 할당하여 포트를 동적으로 관리합니다.

네트워크 패키지가 도착했을 때 동일한 포트에 두 개의 응용 프로그램이 나열되어 있으면 컴퓨터는 어떤 앱이 데이터를 전달할 것인지 알 수 없었습니다. 예를 들어 같은 포트에 동일한 메신저에 Skype와 Skype가 연결되어 있으면 메신저 메시지가 skype에 나타나고 그 반대도 마찬가지입니다.


문제는 청취 응용 프로그램 수의 상한에 대한 것이 아니라 고유 포트 번호의 수에 의해 제한되는 것이 아니라 한 번에 작동하는 소켓의 수에 관한 것입니다. 웹 서버는 종종 단일 포트 80 또는 443으로 주소가 지정된 수십 개의 소켓을 가지고 있습니다. 호스트의 많은 서버가 그렇게한다면 오픈 소켓의 수가 2 ^ 32를 초과 할 이유가 없습니다.
Brandon Rhodes

0

시스템은 열린 TCP 연결 수에 제한이있을 수 있지만 일반적으로 사용되는 포트 번호에 대한 제한은 없습니다. 그러나 올바른 TCP 구현은 동일한 소켓 쌍을 두 번 사용하지 못하게해야합니다. (소켓 = IP 주소 + 포트). 그러나 포트는 연결을 훔치는 것을 방지하기 위해 프로세스에 할당되며 일반적인 방법은 수신 포트 또는 발신 포트에 사용 가능한 포트를 요청하는 것입니다. 이렇게하면 발신 소켓이 중복되어 연결이 중복되지 않습니다. 이 방법을 사용하지 못하면 응용 프로그램 자체가 중복 연결을 만들지 않아야합니다.


3
이것은 이전 질문에 이미 게시 된 답변을 어떻게 추가합니까?
Chris S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.