Java中的DatagramSocketImpl有一个joinGroup方法,它使用套接字地址(IP和PORT)加上接口地址(IP和PORT)。 我想了解多播堆栈中这三个地址中每一个的差异和目的:
我很困惑:我不知道绑定地址和接口地址的区别。 另外,我不确定多播地址是否真的需要一个端口。 我可以把多播地址的IP地址称为多播地址组吗?
实际上有三种方法在这里混淆。 第一个是绑定,用来将套接字绑定到指定的地址和端口。 使用这种方法基本上你打开一个udp端口,并等待数据到这个地址上的这个端口。 第二个是用于让套接字join指定的多播组的join-method。 一个组播组的例子是224.0.0.1 – “所有主机”的组播组,它为同一网段上的所有主机寻址。 第三种方法是允许套接字在指定的networking接口上join指定的多播组的joinGroup。 正如你所看到的,方法二和三用于IP多播,方法一用于UDP(不一定与多播相结合)。 通过join多播组,套接字能够接收使用IP多播发送的数据报。 两者当然可以合并,例如使用多播接收数据,并且如果必要的话,可以使用多播(如果数据对于组中的所有主机感兴趣)或者直接发送给发送者(如果数据仅仅是发送者感兴趣的) 。
当使用绑定方法将套接字绑定到地址时,这也涉及端口。 只有特定地址/端口组合的数据报才能被接收,除非套接字也join一个多播组。
我不知道你如何从连接组到接口地址。 你需要的是一个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可以被路由并且如果全局路由必须被封装。