网络层的组播用于向某些特定的主机群发消息,而不必给每一个主机都单独发送消息。与单播路由相比,相同点是路由算法在网络层仍发挥着重要作用,但是不同点是处理组播包的路由器必须建立和维护组播连接的状态信息。
组播通常采用间接的方式进行组播:每一组接收者有一个统一的“标识符”,将包传送到与该“标识符”相连的所有接收者,而不是把所有接受者的目的地址都放在IP组播包里面的直接法。这是显而易见的,因为当某个组播的主机很多的时候地址太多会严重影响消息传递的效率。发送方应该知道组里面有多少成员(并且成员应该随意加入和退出),并且路由器应该知道怎么把组播数据包传递给所有有连接某一个组播的主机的路由器。如下图所示:
图中蓝色的是组播路由器,带g符号的是参加某一个组播的主机。那么假设某个源是组播源,它想发送消息给所有的加入某个组播的主机,那么首先他应该把消息发送给所有组播路由器;之后组播路由器再把消息发送给自己的加入组播的主机。
从上面的步骤来看,主要就两个部分,所以网络层的组播协议主要也由两个部分组成:IGMP协议(Internet组管理协议)以及组播路由协议。IGMP协议用于用户进程通过该协议提出加入/退出某个组的请求,也就是说路由器通过这个协议了解自己局域网下面哪些主机加入了哪些组;组播路由协议用于保证所有组播路由器都能收到组播包。这篇文章着重讲一下IGMP,而文章后面的拓展部分则是关于组播路由算法。
IGMP协议工作在主机与其直接相连的路由器之间,主机用它来通告它想加入某个组播组,路由器用它来发现所连网络上是否有主机属于某个组播组。路由器用它来发现所连网络上是否有主机属于某个组播组,并且定期探询表中成员以便确定该主机组是否仍然存在。
如果路由器下某个主机想加入一个组:
加入的过程如下:①H1发送“Membership-Report”消息告知想加入组地址224.2.0.1。 ②R1接收到成员报告消息后将所有发给224.2.0.1的包都转发到net1
③R1定期向224.0.0.1(所有的组成员)发送“Membership-Query”消息确认是否还有组员。
如果某个主机想退出组的过程如下:
①H1发送“Leave-Group ”消息到224.0.0.2(所有组播路由器) ②R1接收此消息 ③R1停止转发目的地为224.2.0.1的报文到net1(如果在net1上再也没有属于224.2.0.1组的成员)
通过IGMP协议,组播路由器就知道自己局域网下面主机加入和退出组播的情况。如果有加入,那么当组播数据包来的时候就转发给自己的主机,反之如果都退出了就会发送“prune”信息给自己的上级路由器,就不会有组播数据包发送给自己了。
拓展阅读