ff02::16与组播那点事
前言
今日进行计算机网络实验,配了个非常朴素的两台PC连到一台交换机上的网络。书上说接上线后使用Wireshark抓包,应该能看到主机发送的Neighbour Solicitation报文以及针对想要加入的组播组的Multicast Listener Report Message这两个ICMPv6报文(当然还有别的)。但我接上线之后,前者没问题,后者却只能看到大量发给ff02::16的Multicast Listener Report Message v2报文。对助教进行一个问的提,但助教对IPv6这一块也没有那么熟悉。因此,在课后我打算进行一个研的调。
不过,一开始调研,我便发现我确实是对IPv6不是很了解。 因此文章里可能有些过于基础的知识。此外,由于没研究过网络,文中很多翻译可能不准确,这里尽量用括号标出原文。
什么是ff02::16?
根据RFC4291,ff开头的地址如果合法,那么它应该就是一个多播地址。ff02开头则表示这是一个well-known的(已经由IANA定义好的),分配与网络前缀无关的(not assigned based on the network prefix),不内嵌Rendezvous Point Address的,在link-local scope中使用的组播地址。一查IANA便可知道,ff02::16是一个所有MLDv2-capable routers都会监听的组播地址(后排提示下ipv6下路由器定义与通常语义有所区别)。
那么这个地址到底是用来干什么的呢? 这就要牵扯到组播的具体实现与MLDv2(Multicast Listener Discovery v2)这个协议了。
这几条ICMPv6报文是哪里来的;
要想了解组播如何实现,MLD协议至关重要。RFC2710定义的MLD协议支持IPv6路由器在与其直接相连的链路上探测想要监听组播的节点,同时确认这些节点想要监听那些地址;MLDv2则可以与MLDv1协议互相交互,并使得节点过滤组播消息来源成为可能。 MLDv2实际上是使用IPv4主机所使用的组播管理协议IGMPv3的移植(translation);而MLD则是IGMP的移植。但由于ipv4里并不要求主机支持组播,并且ipv4组播的未来看起来应该会被ipv6组播直接扼杀,因此这里就不再去调研IGMP协议。(如果你好奇的话,IGMPv2主要在速度方面进行了优化)。
但是要想完全理解该图中节点的工作原理,那只看MLDv2协议可还远远不够;我们还需要去参照RFC4861,Neighbor Discovery for IP version。在该RFC的7.2.1中提到,当一个支持组播的端口启用时,该节点必须加入该端口上的"all-nodes multicast address"和根据所有该接口(interface)分配到的IP所产生的"solicited-node multicast address"。此外,在7.2.2中还提到。当一个节点要向其邻居发送单播包难不知道该邻居的链路地址时,且在接口支持组播的情况下,会创建一条状态为INCOMPLETE的“Neighbor Cache entry",并向该IP地址对应的"solicited-node multicast address"发送询问(solicitation)报文;而收到询问的节点则会返回一条公示(advertisement)报文。这样一来,我们就可以解释上图抓包记录里收到的大部分报文了。该PC试图加入所有其应该加入的组播地址,因此向外发送Listener Report报文;而其同时也想与处于同一局域网的另一台PC机和交换机本身交互(交换机上配了ipv6地址,但两PC处于同一VLAN中),因此会向其发送Neignbor Solicitation报文。
所以到底什么是ff02::16?
实际上答案非常简单。查阅RFC3810的5.2.14,有这样一行话:Version 2 Multicast Listener Reports 的目标地址被设定为FF02:0:0:0:0:0:0:16。所有支持MLDv2的路由器都会监听这一地址。紧接着下面一句: 一个工作在v1兼容模式的节点会将v1版本的报文发送给报文的Multicast Address字段所描述的组播地址(其实就是发给要监听的组播地址)。
到了这里,事情已经很明朗了;不过我顺便去确认了下描述了MLDv1的RFC2710,在4.里果然也有当一个接口开始监听某个组播地址时,由于它可能是第一个监听者,因此应当立即发送一条un-solitced report message的字样。原来,在MLDv1中,节点确实会像书上那样向对应组播地址发Report报文;但到了MLPv2,节点只要向ff02::16发送就好。
那怎么才能再次看到MLD v1报文?
虽然没有很大的意义,但是毕竟实验还是要跟着书走的,或许。那么如何复现MLDv1报文呢?
- 让PC的MLDv2协议工作在MLDv1兼容模式下。我没能发现怎么在Windows上配置这一点;不过或许可以通过在交换机上配置或者向网络里硬塞一个MLDv1设备来实现。
- 配置交换机使用MLDv1.简单粗暴。
但不幸的是,我没能在实验室使用的交换机对应型号的手册上查询到mld的配置命令。不过在Cisco、H3C的官网上似乎是可以看到对这一协议版本的配置的
等下周去实验室试一下~