TCP 포트 0에 연결할 수 있습니까?


59

TCP 포트 0을 들으면 시스템에서 사용 가능한 포트 번호가 할당됩니다.

그러나 TCP 포트 0 에 연결 하려고하면 어떻게됩니까 ? 대답은 "작동하지 않습니다"입니다.

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

시스템의 어느 부분에서 처리됩니까? OS 커널의 TCP 스택에서? TCP 포트 0에 연결하는 Unix가 있습니까?


2
이론적으로 포트 0에서 수신 또는 연결이 작동하는 사용자 정의 TCP 스택을 작성할 수 있습니다. 이는 두 가지 구현이 포트 0에서 서로 통신 할 수 있음을 의미합니다.
Joshua

답변:


60

우리가 같은 페이지에 있는지 확인하기 위해 (질문이 이런 식으로 모호한 경우) 포트 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, "연결이 거부되었습니다". 따라서 다음과 같이 답하십시오.

시스템의 어느 부분에서 처리됩니까? OS 커널의 TCP 스택에서?

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


1. 그러나 IANA 이를 "예약 됨"이라고합니다 ( 여기 참조 ). 즉,이 포트 온라인에서 사용 해서는 안됩니다 . 동적 할당 규칙과 관련하여 괜찮습니다 (실제로 사용되지 않기 때문에). 구체적으로 목적으로 명시하는 것은 아마도 IANA의 범위를 넘어 설 것입니다. 본질적으로 운영 체제는 아무것도 포함하여 자신이 원하는 것을 자유롭게 할 수 있습니다.


ipv4의 주소 0.0.0.0과 같은 아이디어입니다. 예약 된 값으로, OS 및 프로그램에서 특수 목적으로 사용합니다. 유사하게, 라디오에는 아무도 전송에 사용하지 않지만 장비에 내부적으로 사용되는 예약 된 주파수가 있습니다.
ctrl-alt-delor

1
잘못된 알 수없는 또는 비 적용 대상을 지정하는 데 사용 또는 "방송"으로한다)없이 @ 리차드, 0.0.0.0는 다른 의미를가집니다
AndreaCi

2
@AndreaCi이 255.255.255.255을 (를) 브로드 캐스트하지 않았습니다?
ratchet freak

4
@ratchetfreak 255.255.255.255가 방송됩니다. 0.0.0.0은 문맥에 따라 두 가지 의미를 갖습니다. 프로그래밍에서 이것은 INADDR_ANY리차드가 말하는 것과 같은 w /입니다 (시스템은 기본값으로 대체합니다). 그러나 실제로 네트워크에서 주소를 사용하는 것은 Andrea가 언급 한 의미를 갖는 것으로 보입니다 ( "브로드 캐스트"로 계산되는 것은 확실하지 않음) : en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

포트 0을 사용하면 운영 체제가 다음 사용 가능한 포트를 검색하고 할당하도록 트리거합니다. 따라서 특정 포트를 하드 코딩하거나 사용 가능한 포트를 검색하지 않아도됩니다. 내 민트 리눅스 시스템이 반환

nc: port range not valid

nc localhost 0 

2

nc -l 0OS가 포트 0에서 수신 대기하도록 요청합니다. 그러나 위에서 언급했듯이 대부분의 운영 체제는 0을 확인하고 응용 프로그램에 대해 양수 포트를 선택하는 특정 관습을 호출하므로 nc56514와 같은 일부 포트에서 수신 대기합니다.


대부분의 운영 체제는 그렇지 않습니까?
barlop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.