IP 0.0.0.0에 연결했습니다. 어떻게? 왜?


41

우리는 localhost에서 포트를 제공하고 있으며 포트가 사용 가능한 경우 다른 프로세스를 체크인하려고합니다. 코드의 버그로 인해 실제로 IP 연결을 시도 0.0.0.0:<port>하고 있으며 어떤 이유로 strace가 증명하는 것처럼 성공합니다.

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

무슨 뜻인가요? 왜 작동합니까?


답변:


68

대상 주소 인 0.0.0.0은 라우팅 할 수없는 호스트 또는 "이 호스트" 를 다양하게 나타냅니다 . 실제로 0.0.0.0에 연결하는 것은 localhost에 연결하는 것과 같습니다. 엄밀히 말하면 대상 주소로는 유효하지 않으며 소스 주소로만 유효하지만 실습은 이론과 일치하지 않습니다.

바인딩 할 때 "이 호스트"는 "이 호스트의 모든 주소"로 확장됩니다. 따라서 응용 프로그램은 일반적으로 0.0.0.0에 바인딩하여 연결을 수락하므로 시스템의 모든 IPv4 주소로 주소가 지정된 패킷을받습니다.


7
이 답변을 약간 확장한다는 것은 "듣기 프로세스가 시작된 후 추가 된 IP를 포함하여이 시스템의 모든 IP 주소"를 의미합니다
Criggie

5
localhost는 단일 주소이며 주로 127.0.0.1이며 0.0.0.0은이 호스트의 모든 주소를 의미합니다.
rexkogitans

@rexkogitans localhost는 단일 주소가 아니지만 127.0.0.0/8 범위의 모든 주소, 즉 127.0.0.0에서 127.255.255.255까지의 주소
Dezza

6
@Dezza 아니요, localhost는 127.0.0.1입니다. 127.0.0.0/8 (즉, 127.0.0.0 ~ 127.255.255.255)은 대부분의 장비에서 루프백됩니다 (예 : RFC 5735 4 페이지에 문서화 됨) . 흥미롭게도 일부 Cisco 장비는 모든 주소에 루프백을 할당 할 수 있지만 기본적으로 루프백을 전혀 지원하지 않습니다. 이것이 네트워크의 다른 장비에 영향을 줄 가능성은 없습니다. 그러나 localhost는 일반적으로 단일 주소를 가리키는 이름입니다. 주소는 127.0.0.1이며 일반적으로 "호스트"파일을 사용하여 구현됩니다. 그래서 나는 당신의 수정 시도에 동의하지 않습니다.
TOOGAM

"대상 주소로만 유효하지 않고 소스 주소로만 유효"하다는 의미를 명확하게 설명해 주시겠습니까? mysql 서버가 0.0.0.0을 수신하면 주소 목적지 또는 소스입니까? mysql 클라이언트에서 보낸 요청의 대상이 아닙니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.