Socket

哪些 IP 地址不能綁定到偵聽套接字?

  • March 24, 2019

哪些 IP 地址不能綁定到偵聽套接字?

例如,伺服器程序能否將 255.255.255.255 綁定到監聽套接字?

謝謝。

從 Linuxbind(2)手冊頁:

在 SOCK_STREAM 套接字可以接收連接之前,通常需要使用 bind() 分配一個本地地址(請參閱 accept(2))。

名稱綁定中使用的規則因地址族而異。有關詳細資訊,請參閱第 7 節中的手冊條目。對於 AF_INET,參見 ip(7);對於 AF_INET6,參見 ipv6(7);對於 AF_UNIX,請參見 unix(7);對於 AF_APPLETALK,請參見 ddp(7);對於 AF_PACKET,請參見數據包 (7);對於 AF_X25,見 x25(7);對於 AF_NETLINK,請參見 netlink(7)。

對於 IPv4,ip(7)手冊頁說:

當一個程序想要接收新的傳入數據包或連接時,它應該使用 bind(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_FREEBINDsocket 選項,你可以綁定到任何地址,假設綁定到的地址可能會在稍後出現在某個本地介面上。但是,在這種情況真正發生之前,以這種方式綁定的套接字可能不是很有用。

Linux 也有一個SO_BINDTODEVICE套接字選項,可用於將套接字綁定到特定的網路介面,而無需指定其 IP 地址。

引用自:https://unix.stackexchange.com/questions/508385