三种 IP 地址:单播地址、广播地址和多播地址。
广播和多播仅应用于 UDP
,它们对需将报文同时传往多个接收者的应用来说十分重要。
单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来说,就是网卡的 MAC 地址(不是FF-FF-FF-FF-FF-FF这样的地址)。现在的具有路由功能的主机应该可以将单播数据定向转发,而目的主机的网络接口则可以过滤掉和自己 MAC 地址不一致的数据。
如下表中所示,广播可以分为四种情形。广播所用的 MAC 地址 FF-FF-FF-FF-FF-FF。网络内所有的主机都会收到这个广播数据,网卡只要把 MAC 地址为 FF-FF-FF-FF-FF-FF 的数据交给内核就可以了。一般说来 ARP,或者路由协议 RIP 应该是以广播的形式播发的。
受限的广播地址是 255.255.255.255。
该地址用于主机配置过程中 IP 数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的 IP 地址也不知道。
在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
指向网络的广播地址是主机号为全 1 的地址。
A 类网络广播地址为 netid.255.255.255,其中 netd 为 A 类网络的网络号。
一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
指向子网的广播地址为主机号为全 1 且有特定子网号的地址。作为子网直接广播地址的 IP 地址需要了解子网的掩码。
例如,如果路由器收到发往 128.1.2.255 的数据报,当 B 类网络 128.1 的子网掩码为 255.255.255.0 时,该地址就是指向子网的广播地址;但如果该子网的掩码为 255.255.254.0,该地址就不是指向子网的广播地址。
指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全 1。
例如, 如果目的子网掩码为 255.255.255.0,那么 IP 地址 128.1.255.255 是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。
使用组播的缘由是: 有的应用程序要把一个分组发送给多个目的主机. 不是让源主机给每一个目的主机都发送一个单独的分组, 而是让源主机把单个分组发送给一个组播地址, 该组播地址标识一组地址. 网络把这个分组给该组中的每一个主机都投递一份拷贝
(单播与组播的比较示意图如上图所示).
能够接收发往一个特定多播组地址数据的主机集合称为主机组 (host group)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。(下文将会介绍主机使用一个称作 IGMP (因特网组管理协议)的协议加入多播组.)
需要注意:
主机组播时仅发送一份数据
, 只有数据在传送路径出现分岔时才将分组复制后继续转发. 这样对发送者而言, 数据只需发送一次就可以发送到所有接收者, 大大减轻了网络的负载和发送者的负担.组播需要路由器的支持才能实现
, 能够运行组播协议的路由器称为组播路由器.一些多播组地址被 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 应用。
IP组播使用D类地址格式. D 类地址的前四位是 1110, 因此 D 类地址范围为224.0.0.0~239.255.255.255. 每一个D类IP地址标志一个组播组;
虽然多播比较特殊,但是究其原理,多播的数据还是要通过数据链路层进行MAC地址绑定然后进行发送。所以一个以太网卡在绑定了一个多播IP地址之后,必定还要绑定一个多播的MAC地址,才能使得其可以像单播那样工作。这个多播的IP和多播MAC地址有一个对应的算法,下面将会介绍。可以看到这个对应不是一一对应的,主机还是要对多播数据进行过滤。
将使以太网多播地址中的 23bit 与 IP 多播组号对应起来,通过将多播组号中 的低位 23bit 映射到以太网地址中的低位 23bit 实现。
由于多播组号中的最高 5 bit在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。
32 个不同的多播组号被映射为一个以太网地址。例如,多播地址 224.128.64.32(十六进制 e0.80.40.20)和 224.0.64.32(十六进制 e0.00.40.20)都映射为同一以太网地址 01:00:5e:00:40:20。
既然地址映射是不唯一的,那么设备驱动程序或 IP层就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。
这些实验并不是很复杂,我们只是要 ping 一下一般的 ip 和一个广播地址。首先我 ping 一下自己所在的子网的某一台主机:
➜ ~ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=2.054 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.918 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=2.438 ms
^C
--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.918/2.137/2.438/0.220 ms
可以看到,机器返回的是一台主机的回应结果,进而推测,如果我ping一个广播地址呢?结果如下(关于ping广播地址失败的原因可以参考,原理)
//使用 ifconfig 命令可以查询相应的广播地址
➜ ~ ping 192.168.0.255
PING 192.168.0.255 (192.168.0.255): 56 data bytes
64 bytes from 192.168.0.103: icmp_seq=0 ttl=64 time=0.071 ms
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=2.556 ms
64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=0.084 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.273 ms
^C
--- 192.168.0.255 ping statistics ---
2 packets transmitted, 2 packets received, +2 duplicates, 0.0% packet loss
round-trip min/avg/max/stddev = 0.071/0.996/2.556/1.024 ms
可以看到,ping返回了一些随机的ip的结果,这些ip都是与主机在同一子网内的ip。我们可以看到,广播实际上是给处于子网内的所有ip发信。
再来一个多播的例子,但是要实现这个多播并不容易,因为我不知道网络内有多少个多播组,就只好利用几个特殊的多播地址来验证了。
对于多播地址,有几个特殊的多播地址被占用,他们是
所以只要ping这几个IP,就应该能得到一些结果,比如说我ping 224.0.0.1。
➜ ~ ping 224.0.0.1
PING 224.0.0.1 (224.0.0.1): 56 data bytes
64 bytes from 192.168.0.103: icmp_seq=0 ttl=64 time=0.077 ms
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=2.229 ms
64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=2.714 ms
64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.084 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=2.737 ms
^C
--- 224.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, +3 duplicates, 0.0% packet loss
round-trip min/avg/max/stddev = 0.077/1.323/2.737/1.248 ms
IGMP 的英文全称是(Internet Group Management Protocol),用于支持主机和路由器进行多播
。它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。
这种查询回应数据报的TTL一般是1,而且就算是出错也不产生ICMP差错(没必要)。
多播路由选择实际上就是要找出以源主机为根节点的多播转发树, 其中每一个分组在每条链路上只传送一次(即在多播转发树上的路由器不会收到重复的多播数据报). 对不同的多播组对应于不同的多播转发树; 同一个多播组, 对不同的源点也会有不同的多播转发树.
IP 地址 224.0.0.1 被称为所有主机组地址。它涉及在一个物理网络中的所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送 IGMP 报告。