帧的过滤
当网络接口收到一个数据帧时,若数据帧的目的地址==广播地址 || 数据帧的目的地址 == 组播地址 || 目的地址==当前接口地址 || 当前接口工作在混杂模式下,则接受该数据帧,然后检验检验和,若正确则交付给网络接口的设备驱动程序。设备驱动程序再进一步执行过滤,并将未过滤掉的帧交付给下一层协议,...
广播
首先IP地址 == 网络号+子网号+主机号,所以:
当主机号全为1时,是一个广播地址.
当主机号,子网号均为1时,是一个广播地址.
当主机号,子网号,网络号均为1时,即255.255.255.255;此时也是一个广播地址,称为受限的广播地址,即路由器不会转发目的地址为255.255.255.255的IP数据包!
设路由器D上有网络接口A(广播地址为 ip1),B(广播地址为 ip2),C(广播地址为 ip3);当D接受一个目的地址为ip的IP数据包时,若ip!=ip1&&ip!=ip2&&ip!=ip3,则查询路由表,然后转发该IP数据包,否则假设ip==ip1,则路由器会以该IP数据包为数据生成一个广播数据帧然后通过接口A发送.这就是广播数据包的转发.
预备知识
主机在每一个接口上都维护着一张表(表A),表中记录着至少含有一个进程的多播组,以及多播组中进程个数.如下:
[接口A]
多播组地址,多播组中进程个数
网络接口的设备驱动程序进行多播过滤来检测该主机是否属于多播地址说明的多播组,实现可能是,主机的每一个多播接口都维护着一张表(表B),表中记录着允许的多播MAC地址,当接口接收到一个多播数据帧时,若该帧的目的地址在表中存在,则接受该数据帧,否则丢弃该数据帧.
路由器在每一个接口上维护着一张表(表C),表中记录着至少含有一个主机的多播组地址.
加入一个多播组
进程在主机的一个给定接口I上加入一个给定的多播组G,此时经过大概如下:
若G在接口I的表A中已经存在,则更新相应的'进程个数'字段即可.
若G在接口I的表A中不存在,则在接口I的表A中新建一项,该项的'多播组地址'字段设为G,'多播组中进程个数'字段设为1,并且将G添加到接口I的表B中.
224.0.0.1
该组地址被称为所有主机组地址,它涉及在一个物理网络中的所有具备多播能力的主机和路由器.
具有多播能力的接口在初始化之后会将 224.0.0.1 对应的MAC地址添加到该接口的表B上,同时将224.0.0.1添加到该接口的表A上.
IGMP 报文
报文格式
版本,用于说明IGMP协议的版本,取值为1;
类型,若值为1,表明该IGMP报文是查询报文,此时'32位组地址'为0,若值为2,表明该IGMP报文是报告报文,此时'32位组地址'为相应的组地址.
查询报文
由多播路由器定期发送,并且多播路由器必须向每个接口发送一个 IGMP 查询报文,此时发送的帧的格式如下:
帧首部:01:00:5e:00:00:01(即224.0.0.1对应的MAC地址);发送接口的MAC地址;
IP首部: TTL=1;目的地址=224.0.0.1;源地址=发送接口的IP地址;
IGMP 报文,依据IGMP报文格式填充.
假设该IGMP报文被主机H的多播接口I接受到,则I的设备驱动程序根据I的表B决定接受该数据帧,以及IP层根据I的表A决定接受该IP数据包,最终上交给IGMP层.
报告报文
IGMP 层对I的表A上的每一个多播组G都生成一个 IGMP 报告报文,然后通过接口I发送该IGMP报文,此时发送的帧格式如下:
帧首部:目的地址=G对应的MAC地址 ;源地址=接口I的MAC地址.
IP首部:TTL=1,目的地址=G;源地址=接口I的IP地址;
IGMP: 32位的多播组地址=G.
多播路由器必须接收在它所有接口上的所有多播数据报,因此多播路由器可以接收到上述发送的承载着IGMP报告报文的数据帧(假设该数据帧被接口J收到),并且会把它交付多播路由器的IGMP层,此时
若多播组地址G在接口J的表C上不存在,则将多播组地址G添加到接口J的表C上.
若已经存在,则不进行任何操作,因为多播路由器并不关心有多少主机属于该组,而只关心该组是否还至少拥有一个主机.
为什么目的地址=G/G对应的MAC地址,可以参见TCP/IP详解卷-P114-13.3.3.
多播下的TTL
TTL为0的多播数据报将被限制在同一主机,即若主机上某进程产生了TTL=0的UDP多播数据包,则该数据包会直接交付该主机的UDP层,然后按照UDP端点交付给主机上相应的进程.
TTL为1的多播数据报仅局限在同一物理网络内传送,即多播路由器不会转发该多播数据包.因此该多播数据包仅被同一物理网络中相应主机接收到.
仅当TTL>1并且目的地址不属于[224.0.0.0-224.0.0.255]的多播数据包才会被路由器转发.
当路由器收到一份多播数据包
若该多播数据包的目的地址M在多播路由器的接口I的表C中存在,则向接口I发送该多播数据包,发送的数据帧格式如下:
帧首部: 目的地址=M对应的MAC地址;源地址=接口I的MAC地址;
IP数据包
否则,根据多播路由器的路由表来转发该多播数据包,多播路由器的路由表可能如下: