청취 소켓에 바인딩할 수 없는 IP 주소는 무엇입니까?
예를 들어, 서버 프로세스가 255.255.255.255를 청취 소켓에 바인딩할 수 있습니까?
감사해요.
답변1
Linux bind(2)
매뉴얼 페이지에서:
SOCK_STREAM 소켓이 연결을 허용하기 전에 일반적으로 바인딩()을 사용하여 로컬 주소를 할당해야 합니다(accept(2) 참조).
이름 바인딩에 사용되는 규칙은 주소 계열에 따라 다릅니다. 자세한 내용은 섹션 7의 수동 항목을 참조하세요. AF_INET의 경우 ip(7)을 참조하고, AF_UNIX의 경우 ipv6(7)을 참조하고, AF_APPLETALK의 경우 ddp(7)를 참조하고, AF_X25의 경우 x25를 참조하십시오. (7); AF_NETLINK에 대해서는 netlink(7)을 참조하세요.
IPv4의 경우 ip(7)
매뉴얼 페이지에 다음과 같이 나와 있습니다.
프로세스가 새로 들어오는 패킷이나 연결을 수신하려는 경우, 바인딩(2)을 사용하여 소켓을 로컬 인터페이스 주소에 바인딩해야 합니다. 이 경우 하나의 IP 소켓만 지정된 로컬(주소, 포트) 쌍에 바인딩될 수 있습니다. INADDR_ANY가 바인딩 호출에 지정되면 소켓은 모든 로컬 인터페이스에 바인딩됩니다. 바인딩되지 않은 소켓에서 Listen(2)이 호출되면 소켓은 로컬 주소가 INADDR_ANY로 설정된 임의의 사용 가능한 포트에 자동으로 바인딩됩니다.
따라서 IPv4 TCP 또는 UDP 소켓의 경우 바인딩할 IP는 INADDR_ANY
로컬 시스템의 네트워크 인터페이스에 할당된 IP 주소 중 하나 이상이어야 합니다.
그러나 그것은 또한 다음과 같이 말합니다.
몇 가지 특수 주소가 있습니다. INADDR_LOOPBACK(127.0.0.1)은 항상 루프백 장치를 통해 로컬 호스트를 참조합니다. INADDR_ANY(0.0.0.0)는 바인딩할 모든 주소를 나타냅니다. INADDR_BROADCAST(255.255.255.255)는 기록상의 이유로 모든 호스트를 나타냅니다. 바인딩은 INADDR_ANY와 동일한 효과를 갖습니다.
따라서 255.255.255.255에 대한 바인딩은 유효하며 0.0.0.0과 동일한 효과를 갖지만 최신 구현에서는 0.0.0.0이 선호됩니다.
소켓 옵션이 설정되면 IP_FREEBIND
바인딩된 주소가 나중에 일부 로컬 인터페이스에 나타날 수 있다고 가정하여 모든 주소에 바인딩할 수 있습니다. 그러나 실제로 이런 일이 발생하기 전까지는 이러한 방식으로 바인딩된 소켓이 그다지 유용하지 않을 수 있습니다.
SO_BINDTODEVICE
Linux에는 IP 주소를 지정하지 않고 소켓을 특정 네트워크 인터페이스에 바인딩하는 데 사용할 수 있는 소켓 옵션 도 있습니다 .