11.3.4 内核中的多播

本文详细介绍了Linux内核如何处理多播,包括结构ip_mc_socklist、ip_mreqn、ip_sf_socklist的使用,以及IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP选项的内核处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.3.4  内核中的多播

Linux内核中的多播是利用结构struct ip_mc_socklist来将多播的各个方面连接起来的,其示意图如图11.7所示。

 

 

11.7  多播的内核结构

struct inet_sock {

    ...

    __u8                mc_ttl;     /*多播TTL*/

    ...

    __u8                ...

                        mc_loop:1;      /*多播回环设置*/

    int                 mc_index;       /*多播设备序号*/

    __be32              mc_addr;        /*多播地址*/

    struct ip_mc_socklist   *mc_list;   /*多播群数组*/

    ...

};

 

q      结构成员mc_ttl用于控制多播的TTL

q      结构成员mc_loop表示是否回环有效,用于控制多播数据的本地发送;

q      结构成员mc_index用于表示网络设备的序号;

q      结构成员mc_addr用于保存多播的地址;

q      结构成员mc_list用于保存多播的群组。

1.结构ip_mc_socklist

结构成员mc_list的原型为struct ip_mc_socklist,定义如下:

 

struct ip_mc_socklist

{

    struct ip_mc_socklist   *next;

    struct ip_mreqn     multi;

    unsigned int        sfmode;     /*MCAST_{INCLUDE,EXCLUDE}*/

    struct ip_sf_socklist   *sflist;

};

 

q      成员参数next指向链表的下一个节点。

q      成员参数multi表示组信息,即在哪一个本地接口上,加入到哪一个多播组。

q      成员参数sfmode是过滤模式,取值为 MCAST_INCLUDEMCAST_EXCLUDE,分别表示只接收sflist所列出的那些源的多播数据报,和不接收sflist所列出的那些源的多播数据报。

q      成员参数sflist是源列表。

2.结构ip_mreqn

multi成员的原型为结构struct ip_mreqn,定义如下:

 

struct ip_mreqn

{

    struct in_addr  imr_multiaddr;      /*多播组的IP地址*/

    struct in_addr  imr_address;        /*本地址网络接口的IP地址*/

    int         imr_ifindex;            /*网络接口序号*/

};

 

该结构体的两个成员分别用于指定所加入的多播组的组IP地址,和所要加入组的那个本地接口的IP地址。该命令字没有源过滤的功能,它相当于实现IGMPv1的多播加入服务接口。

3.结构ip_sf_socklist

成员sflist的原型为结构struct ip_sf_socklist,定义如下:

 

struct ip_sf_socklist

{

    unsigned int    sl_max;      /*当前sl_addr数组的最大可容纳量*/

    unsigned int    sl_count;    /*源地址列表中源地址的数量*/

    __u32         sl_addr[0];     /*源地址列表*/

};

 

q      成员参数sl_addr表示是源地址列表;

q      成员参数sl_count表示是源地址列表中源地址的数量;

q      成员参数sl_max表示是当前sl_addr数组的最大可容纳量(不确定)。

4.选项IP_ADD_MEMBERSHIP

选项IP_ADD_MEMBERSHIP用于把一个本地的IP地址加入到一个多播组,在内核中其处理过程如图11.8所示,在应用层调用函数setsockopt()函数的选项IP_ADD_MEMBE- RSHIP后,内核的处理过程如下,主要调用了函数ip_mc_join_group()

 

 

 

 

11.8  选项IP_ADD_MEMBERSHIP的内核处理过程

1)将用户数据复制如内核。

2)判断广播IP地址是否合法。

3)查找IP地址对应的网络接口。

4)查找多播列表中是否已经存在多播地址。

5)将此多播地址加入列表。

6)返回处理值。

5.选项IP_DROP_MEMBERSHIP

选项IP_DROP_MEMBERSHIP用于把一个本地的IP地址从一个多播组中取出,在内核中其处理过程如图11.9所示,在应用层调用setsockopt()函数的选项IP_DROP_ MEMBERSHIP后,内核的处理过程如下,主要调用了函数ip_mc_leave_group()

 

11.9  选项IP_DROP_MEMBERSHIP的内核处理过程

1)将用户数据复制入内核。

2)查找IP地址对应的网络接口。

3)查找多播列表中是否已经存在多播地址。

4)将此多播地址从源地址中取出。

5)将此地址结构从多播列表中取出。

6)返回处理值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值