卷2 第12章 IP多播

12.1 引言

  • D类地址(224.0.0.0 ~ 239.255.255.255)用于多播
  • 主机组动态变化
  • IGMP管理组成员

主机多播级别

级别说明
0不能发送/接收
1能发送不能接收
2能发送和接收

12.2 代码介绍

  • net/if_ether.h:以太网多播
  • netinet/in.h:多播结构
  • netinet/in_var.h:多播定义
  • netinet/ip_var.h:多播结构

12.3 以太网多播地址

IP→以太网映射

01:00:5e + IP地址低23位

text

  • 32个IP映射到同一以太网地址
  • 需要额外过滤

12.4 ether_multi结构

成员说明
enm_addrlo/hi地址范围
enm_ac回指arpcom
enm_refcount引用计数

12.5 以太网多播接收

  • SIOCADDMULTI:添加多播地址
  • SIOCDELMULTI:删除多播地址

12.6 in_multi结构

成员说明
inm_addr多播地址
inm_ifp接口指针
inm_refcount引用计数
inm_timerIGMP定时器

12.7 ip_moptions结构

成员说明
imo_multicast_ifp输出接口
imo_multicast_ttlTTL
imo_multicast_loop环回标志
imo_membership组成员数组

12.8 多播的插口选项

选项说明
IP_MULTICAST_IF接口
IP_MULTICAST_TTLTTL
IP_MULTICAST_LOOP环回
IP_ADD_MEMBERSHIP加入组
IP_DROP_MEMBERSHIP离开组

12.9 多播的TTL值

  • 控制辖域(scope)
  • 阈值限制传播范围

推荐TTL值

TTL辖域
0同一主机
1同一子网
32同一地点
64同一区域
128同一州
255不限

12.10 ip_setmoptions函数

处理选项

  1. IP_MULTICAST_IF:设置接口
  2. IP_MULTICAST_TTL:设置TTL
  3. IP_MULTICAST_LOOP:环回控制
  4. IP_ADD_MEMBERSHIP:加入组
  5. IP_DROP_MEMBERSHIP:离开组

12.11 加入IP多播组

处理流程

  1. 验证地址
  2. 查找接口
  3. 检查是否已加入
  4. 分配in_multi结构
  5. 更新以太网多播表

12.12 离开IP多播组

  • 减少引用计数
  • 释放结构
  • 更新硬件过滤

12.13 ip_getmoptions函数

  • 获取当前多播选项设置

12.14 多播输入处理

  • 多播路由器接收所有多播
  • 检查接口成员关系
  • 转发到其他接口

12.15 多播输出处理

  1. 设置M_MCAST标志
  2. 选择TTL
  3. 选择源地址
  4. 环回处理
  5. 转发(路由器)
  6. 发送

12.16 性能的考虑

  • 线性搜索可能成为瓶颈
  • 高速缓存可提高性能

12.17 小结

多播使用D类地址,通过IGMP管理组成员。以太网多播映射不唯一。