IP 0.0.0.0에 성공적으로 연결되었습니다. 어떻게? 왜?

IP 0.0.0.0에 성공적으로 연결되었습니다. 어떻게? 왜?

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
[...]

무슨 뜻이에요? 왜 작동합니까?

답변1

0.0.0.0은 대상 주소로 라우팅할 수 없는 호스트 또는 "이 호스트"를 다양하게 나타냅니다(RFC 5735 섹션 3). 실제로 대부분의 경우 0.0.0.0에 연결하는 것은 localhost에 연결하는 것과 같습니다. 엄밀히 말하면 회선의 대상 주소로 유효하지 않습니다(RFC 1122 섹션 3.2.1.3)은 소스 주소로만 사용되므로 운영 체제는 대상 주소가 0.0.0.0인 패킷이 변경되지 않고 시스템을 떠나지 않도록 해야 합니다. 실제로 Linux 커널이 대상 주소를 0.0.0.0(목적지 주소 없음),소스 주소를 대상 주소로 복사합니다., 패킷에도 소스 주소가 없으면 둘 다 루프백 주소로 설정됩니다. 두 경우 모두 패킷은 루프백 인터페이스를 통해 "전송"되므로 시스템을 떠나지 않습니다.

바인딩할 때 "이 호스트"는 "이 호스트의 모든 주소"로 확장됩니다. 따라서 응용 프로그램은 일반적으로 0.0.0.0으로 바인딩하여 연결을 허용합니다. 이는 시스템 데이터 팩의 모든 IPv4 주소로 주소가 지정된 연결을 수신한다는 의미입니다.

관련 정보