TCP 포트 0을 들으면 시스템에서 사용 가능한 포트 번호가 할당됩니다.
그러나 TCP 포트 0 에 연결 하려고하면 어떻게됩니까 ? 대답은 “작동하지 않습니다”입니다.
$ nc localhost 0
nc: port number too small: 0
시스템의 어느 부분에서 처리됩니까? OS 커널의 TCP 스택에서? TCP 포트 0에 연결하는 Unix가 있습니까?
답변
우리가 같은 페이지에 있는지 확인하기 위해 (질문이 이런 식으로 모호한 경우) 포트 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의 범위를 넘어 설 것입니다. 본질적으로 운영 체제는 아무것도 포함하여 자신이 원하는 것을 자유롭게 할 수 있습니다.
답변
포트 0을 사용하면 운영 체제가 다음 사용 가능한 포트를 검색하고 할당하도록 트리거합니다. 따라서 특정 포트를 하드 코딩하거나 사용 가능한 포트를 검색하지 않아도됩니다. 내 민트 리눅스 시스템이 반환
nc: port range not valid
에
nc localhost 0
답변
nc -l 0
OS가 포트 0에서 수신 대기하도록 요청합니다. 그러나 위에서 언급했듯이 대부분의 운영 체제는 0을 확인하고 응용 프로그램에 대해 양수 포트를 선택하는 특정 관습을 호출하므로 nc
56514와 같은 일부 포트에서 수신 대기합니다.