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.