绑定、网络(接口)和多播地址之间有什么区别?

绑定、网络(接口)和多播地址之间有什么区别?

Java中DatagramSocketImpl有一个joinGroup方法,该方法采用套接字地址(IP 和 PORT)加上接口地址(IP 和 PORT)。我试图了解多播堆栈中这三个地址的区别和用途:

  1. 绑定地址的用途是什么?它需要端口吗?
  2. 接口地址的用途是什么?它需要端口吗?
  3. 多播地址的用途是什么?它需要端口吗?

我很困惑:我不知道绑定地址和接口地址之间的区别。另外,我不确定多播地址是否真的需要端口。我可以将多播地址的 IP 称为多播地址组吗?

答案1

这里实际上有三种方法会混淆。第一种方法是 bind,用于将套接字绑定到指定的地址和端口。使用此方法基本上就是打开一个 udp 端口​​并等待该地址上的此端口的数据。第二种方法是 join 方法,用于让套接字加入指定的多播组。多播组的一个例子是 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 可以路由,如果全局路由则必须封装。

相关内容