Java中的DatagramSocketImpl有一个joinGroup方法,它接受套接字地址(IP和PORT)加上接口地址(IP和PORT).我试图了解多播堆栈中这三个地址中每个地址的区别和目的:
>绑定地址的目的是什么?它需要一个端口吗?
>接口地址的目的是什么?它需要一个端口吗?
>多播地址的目的是什么?它需要一个端口吗?
我很困惑:我不知道绑定地址和接口地址之间的区别.此外,我不确定多播地址是否真的需要一个端口.我可以将多播地址的IP称为多播地址组吗?
解决方法
实际上你在这里混淆了三种方法.第一个是bind,用于将套接字绑定到指定的地址和端口.使用此方法基本上您打开一个udp-port并等待该地址上的此端口的数据.第二个是join-method,用于让套接字加入指定的多播组.组播组的示例是224.0.0.1 – “所有主机”组播组 – 其针对同一网段上的所有主机.第三种方法是joinGroup,它允许套接字在指定的网络接口上加入指定的多播组.如您所见,方法二和三用于IP多播,方法一用于UDP(不一定与多播组合).通过加入多播组,套接字能够接收使用IP多播发送的数据报.两者当然可以组合在一起,例如使用多播接收数据,然后在必要时使用多播(如果数据对组中的所有主机感兴趣)或直接发送给发送者(如果数据仅对发送者有意义) .
>使用bind方法将套接字绑定到地址时,这也涉及端口.除非套接字也加入多播组,否则只能接收该特定地址/端口组合的数据报.>我不确定你是如何从joinGroup到接口地址的.你需要的是一个SocketAddress和一个NetworkInterface. NetworkInterface可以通过接口名称(NetworkInterface.getByName)或地址(NetworkInterface.getByInetAddress)检索.在getByInetAddress的情况下,您可以将其称为接口地址,但它所做的只是检索具有指定地址的NetworkInterface,因此不使用端口号.>多播地址用于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可以路由,如果全局路由必须封装.