设计总览
为了在linux 环境实现多播路由,内核和用户端进程进行交互和处理,主要实现我们用户端的实现。
内核处理转发数据主要是根据内核多播转发表multicast forwarding cache(MFC)。 我们用户端的pim守护进程主要是处理控制包和其他路由器的包, 然后维护用户端的转发表。
pim 守护进程处理用户端的所有pim的控制信息, 然后设置一个合适的内核环境,然后内核转发组播数据报文。
pim控制报文在用户空间,组播报文在内核空间。
根据上图,当 内核收到IP packet以后 ,传递给[ip-intr()] , ip 中断处理函数根据目的地址和协议号分配数据包到相应的模块,分三种情况去处理。
- 如果数据包是多播数据包,传递给内核 ip-mforward() , 如果在MFC 里面匹配源地址和组播地址, 返回hit , 然后转发到对应出口,如果,源地址或者主播地址或者入口不匹配,返回miss ,内核发送internal control message 传递给用户态的守护进程去处理。
- 如果这个报文是PIM 报文, 传送给 [ pim-input()] , 再传送给socket 通道 raw-input() 传递给用户层经常处理。
- 如果这个报文是IGMP报文, 同pim , 传递给内核igmp 处理模块 igmp-input(), 然后调用 raw-input() 通过socket 队列传递给用户空间。
用户空间 pim守护进程
所有的 PIM IGMP 和 internal control (e.g. cache miss and wrong incoming interface) 消息 都会被转递给 PIM 进程。
PIM进程根据这些信息去创建 多播路由表 multicast routing table (MRT) , pim 使用 ’ setsockopt()'系统调用把转发表同步给内核MFC, 确保多播数据的转发。
pim进程 监听socket队列的pim和igmp消息, 根据是pim还是igmp 传递到对应接口去处理,根据报文信息动态更形MRT 和内核的MFC。