TCP 포트 0을 들으면 시스템에서 사용 가능한 포트 번호가 할당됩니다.
그러나 TCP 포트 0 에 연결 하려고하면 어떻게됩니까 ? 대답은 "작동하지 않습니다"입니다.
$ nc localhost 0
nc: port number too small: 0
시스템의 어느 부분에서 처리됩니까? OS 커널의 TCP 스택에서? TCP 포트 0에 연결하는 Unix가 있습니까?
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의 범위를 넘어 설 것입니다. 본질적으로 운영 체제는 아무것도 포함하여 자신이 원하는 것을 자유롭게 할 수 있습니다.
INADDR_ANY
리차드가 말하는 것과 같은 w /입니다 (시스템은 기본값으로 대체합니다). 그러나 실제로 네트워크에서 주소를 사용하는 것은 Andrea가 언급 한 의미를 갖는 것으로 보입니다 ( "브로드 캐스트"로 계산되는 것은 확실하지 않음) : en.wikipedia.org/wiki/0.0.0.0