老板找某个高层谈话,这是一对一形式。当老板叫来所有高层谈话,那么就变为了一对多。计算机网络中也是如此,当一个主机需要和更多机器对话时,就有了广播和多播这种形式。
广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由 I P地址确定)内的两进程(由端口号确定)间存在一条连接。
网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中最高字节的最低位设置为1时表示该地址是一个多播地址,用十六进制可表示为01:00:00:00:00:00(以太网广播地址ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。
广播的类型:
1. 受限的广播
受限的广播地址是255.255.255.255。路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
2. 指向网络的广播
指向网络的广播地址是主机号为全1的地址。根据子网掩码判断主机号。
3. 指向子网的广播
指向子网的广播地址为主机号为全1且有特定子网号的地址。同样依赖子网掩码。
4. 指向所有子网的广播
指向所有子网的广播地址的子网号及主机号为全1。
比如局域网内有50台机器,我只想发送到其中的30台监听着5000端口的UDP协议程序,利用了广播:
当各个机器的网卡收到满足自己网卡地址或者是广播多播地址时,网卡要传给设备驱动程序,驱动程序再根据协议传给IP层或者ARP等,比如到了IP层,IP层还要根据协议再传给UDP层等,到了UDP层,此时UDP根据端口号发现我这台机器没监听这个端口,那么我就给它返回端口不可达的ICMP报文。
这样,那20台机器就分担了额外的压力,直到我的UDP层,我才知道哦这不是给我的。这就引出了多播的概念哈哈~我可以指定一些机器。
多播组地址: 互联网D类地址就是多播组地址:
如图:
多播组地址包括为1110的最高4bit和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255。
一些多播组地址被IANA(互联网数字分配机构)确定为知名地址。例如:224.0.0.1代表“该子网内的所有系统组”,224.0.0.2代表“该子网内的所有路由器组”。
多播地址224.0.1.1用作网络时间协议NTP,224.0.0.9用作RIP-2,224.0.1.2用作SGI公司的dogfight应用。
-- 多播组地址到以太网地址的转换:
如图:
IANA拥有一个以太网地址块,即高位24bit为00:00:5e(十六进制表示),这意味着该地址块所拥有的地址范围从00:00:5e:00:00:00到00:00:5e:ff:ff:ff。IANA将其中的一半(高位的第四个字节的高四位分成0~7和8~f两半,这样是分成了整体的一半)分配为多播地址。为了指明一个多播地址,任何一个以太网地址的首字节必须是01,这意味着与IP多播相对应的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff(7f这个就是一半)。
由于7的二进制是0111,所以高位0是确定的了,因此以太网地址的前三个字节01:00:5e和下一位0确定了25bit。剩下的23bit和IP地址的低23bit相同。这样D类地址中高9bit中的低5bit就被忽略了。 --这样带来一个问题,5bit被忽略,那么表示会有32(2的5次方)个不同的多播号映射成了相同的以太网地址...比如:224.128.64.32和224.0.64.32都映射为同一以太网地址01:00:5e:00:40:20。
既然地址映射是不唯一的,那么设备驱动程序或IP层就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。
- IGMP:Internet组管理协议
IGMP协议让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。
正如ICMP一样,IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据。
如图:
这是版本为1的IGMP。IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文(多播路由器发出的是查询类型的报文,网络上的主机发送的是报告类型的报文)。检验和的计算和IGMP协议相同,同样覆盖首部和数据部分。组地址为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。
多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况。使用规则如
下:
1) 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
2) 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
3) 多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
4) 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组(多播路由只关心是不是至少有一个,有一个就得转发)。当路由器收到要转发的多播数据报时,它只将该数据报转发到(使用相应的多播链路层地址)还拥有属于那个组主机的接口上。
如图:查询和报告的报文。显示了两个IGMP报文,一个是主机发送的报告,另一个是路由器发送的查询。该路由器正在要求那个接口上的每个主机说明它加入的每个多播组
值得注意的是:1. 在主机发送报告报文的时候,目的IP地址是组地址(表示报告发送的时候,网络上其它同一个组地址的主机也可以接收到,这意味着如果一个主机在等待发送报告的过程中,却收到了发自其他主机的相同报告,则该主机的响应就可以不必发送了,因为多播路由只要知道至少有一个多播组存在就OK了。);2. 多播路由发送的目的IP地址是224.0.0.1(这表示该子网内的所有系统组)。3. 一个初始TTL为0的多播数据报将被限制在同一主机。默认情况下,待传多播数据报的TTL被设置为1,这将使多播数据报仅局限在同一子网内传送。
实现IGMP的几个细节:
1). 当一个主机首次发送IGMP报告(当第一个进程加入一个多播组)时,并不保证该报告被可靠接收(因为使用的是IP交付服务)。下一个报告将在间隔一段时间后发送。这个时间间隔由主机在 0 ~ 1 0秒的范围内随机选择。
2). 当一个主机收到一个从路由器发出的查询后,并不立即响应,而是经过一定的时间间隔后才发出一些响应s(一个主机可能不止一个多播组,有几个就要发送几个响应)。
-