TCP 포트 0에 연결할 수 있나요?

TCP 포트 0에 연결할 수 있나요?

TCP 포트 0을 수신하면 시스템에 사용 가능한 포트 번호가 할당됩니다.

하지만 내가 시도하면 어떻게 될까요?연결하다TCP 포트 0으로? 분명한 대답은 "작동하지 않습니다"입니다.

$ nc localhost 0                 
nc: port number too small: 0

이는 시스템 어디에서 처리되나요? 운영 체제 커널의 TCP 스택에 있습니까? Unix에서 TCP 포트 0에 연결할 수 있습니까?

답변1

동일한 페이지에 있는지 확인하기 위해(귀하의 질문이 이와 같이 모호함) 포트 0에 TCP 바인딩을 요구한다는 것은 동적으로 생성된 사용되지 않은 포트 번호를 요청하는 것을 의미합니다. 즉, 해당 요청 이후 실제로 수신 대기 중인 포트 번호는 0이 아닙니다. 이에 대한 [linux kernel source]/net/ipv4/inet_connection_sock.c의견이 다음과 같습니다 inet_csk_get_port().

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

이것은 표준 유닉스 규칙입니다. 실제로 포트 0의 사용을 허용하는 일부 시스템이 있을 수 있지만 이는 나쁜 습관으로 간주됩니다. 그러나 이 동작은 POSIX, IANA 또는 TCP 프로토콜에 의해 공식적으로 지정되지 않습니다. 1당신은 찾을 수 있습니다이건 재미 있네.

그렇기 때문에 포트 0에 대한 TCP 연결을 현명하게 설정할 수 없습니다. 아마도 nc이미 이 사실을 알고 말도 안되는 요청을 했다는 사실을 귀하에게 알렸을 것입니다. 네이티브 코드에서 이 작업을 시도하면 다음과 같습니다.

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

사용할 수 없는 다른 포트에 연결을 시도할 때와 동일한 오류( ECONNREFUSED"연결이 거부되었습니다")가 발생합니다. 그래서 대답은 다음과 같습니다.

이는 시스템 어디에서 처리되나요? 운영 체제 커널의 TCP 스택에 있습니까?

아마도 그렇지 않을 것입니다. 특별한 처리가 필요하지 않습니다. 즉, 포트 0에서 바인딩 및 수신 대기를 허용하는 시스템을 찾을 수 있다면 해당 시스템에 연결할 수 있을 것입니다.


1. 하지만 IANA하다통화 포트 0 "예약됨"(이봐). 즉 이 항구는해서는 안 된다온라인으로 사용하세요. 이는 동적 할당 규칙을 괜찮게 만듭니다(실제로 사용되지 않으므로). 이를 목적으로 명시적으로 언급하는 것은 IANA의 범위를 벗어날 수 있습니다. 기본적으로 운영 체제는 아무것도 하지 않는 것을 포함하여 원하는 것을 자유롭게 수행할 수 있습니다.

답변2

포트 0을 요청하면 운영 체제가 사용 가능한 다음 포트를 검색하고 할당하도록 트리거됩니다. 이렇게 하면 특정 포트를 하드코딩하거나 사용 가능한 포트를 검색할 필요가 없습니다. 내 Linux Mint 시스템은 회귀입니다.

nc: port range not valid

도착하다

nc localhost 0

답변3

nc -l 0운영 체제는 포트 0에서 수신 대기하라는 요청을 받습니다. 그러나 위에서 설명했듯이 대부분의 운영 체제는 0을 보고 애플리케이션에 대해 양수 포트를 선택하는 특정 습관을 호출하므로 nc결국 56514와 같은 일부 포트에서 수신 대기하게 됩니다.

관련 정보