Linux

綁定、網路(介面)和多播地址有什麼區別?

  • February 27, 2012

DatagramSocketImplJava 中有一個方法joinGroup,它接受一個套接字地址(IP 和 PORT)加上介面地址(IP 和 PORT)。我試圖了解多播堆棧中這三個地址中的每一個的區別和目的:

  1. 綁定地址的目的是什麼?它需要一個埠嗎?
  2. 介面地址的用途是什麼?它需要一個埠嗎?
  3. 多播地址的用途是什麼?它需要一個埠嗎?

我一頭霧水:不知道綁定地址和介面地址的區別。另外,我不確定多播地址是否真的需要一個埠。我可以將組播地址的IP稱為組播地址組嗎?

實際上,您在這裡混合了三種方法。第一個是bind,用於將套接字綁定到指定的地址和埠。使用此方法基本上您打開一個 udp 埠​​並等待該地址上的該埠的數據。第二個是加入方法,用於讓套接字加入指定的多播組。多播組的一個範例是 224.0.0.1 - “所有主機”多播組 - 它定址同一網段上的所有主機。第三種方法是 joinGroup,它允許套接字在指定的網路介面上加入指定的多播組。如您所見,方法二和三用於 IP 多播,方法一用於 UDP(不一定與多播結合使用)。通過加入多播組,套接字能夠接收使用 IP 多播發送的數據報。

  1. 當您使用 bind 方法將套接字綁定到一個地址時,這也涉及一個埠。除非套接字也加入多播組,否則只能接收/可以接收該特定地址/埠組合的數據報。
  2. 我不確定你是如何從 joinGroup 到介面地址的。您需要的是一個 SocketAddress 和一個 NetworkInterface。NetworkInterface 可以通過介面名稱 (NetworkInterface.getByName) 或地址 (NetworkInterface.getByInetAddress) 檢索。在 getByInetAddress 的情況下,您可能將其稱為介面地址,但它所做的只是檢索具有指定地址的 NetworkInterface,因此不使用埠號。
  3. 多播地址用於 IP 多播,用於將 IP 數據報發送到一組主機(如果他們有興趣接收數據報)。您可以使用埠(如果您使用 UDP),但您不需要。IPv4 多播地址的 CIDR 為 224.0.0.0/4 (224.0.0.0 - 239.255.255.255),IPv6 多播地址的前綴為 ff00::/8。這些範圍內的每個 IP 地址都代表一個多播組。存在不同的多播地址塊(和多播組),它們的處理方式不同。例如,224.0.0.0/24 不會被路由出它們的原始子網,而 239.192.0.0/14 可以被路由,並且如果路由全域必須被封裝。

引用自:https://serverfault.com/questions/363436