TCP/IP详解08-网络层:广播和多播、IGMP

TCP/IP详解08-网络层:广播和多播、IGMP

  • TCP/IP详解08-网络层:广播和多播、IGMP
    • 1. 单播,多播,广播的介绍
      • 1.1.单播(unicast)
      • 1.2.广播(unicast)
        • 1.2.1 受限的广播
        • 1.2.2 指向网络的广播
        • 1.2.3 指向子网的广播
        • 1.2.4 指向所有子网的广播
      • 1.3 多播
        • 1.3.1 多播组地址
        • 1.3.2 多播组地址到以太网地址的转换
      • 1.4 实验
    • 2. IGMP:Internet组管理协议
      • 2.1 IGMP报文
      • 2.2 IGMP的工作过程如下
      • 2.3 所有主机组
    • 参考

1. 单播,多播,广播的介绍

三种 IP 地址:单播地址、广播地址和多播地址。
广播和多播仅应用于 UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。

TCP/IP详解08-网络层:广播和多播、IGMP_第1张图片

  • 首先,网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。 另外,多数接口均被设置为混合模式,这种模式能接收每个帧的一个复制。
    • 对于以太网,当地址中最高字节的最低位设置为 1 时表示该地址是一个多播地址,用十六进制可表示为 01:00:00:00:00:00(以太网广播地址ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。
    • 如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃该帧)。
  • 设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。
  • IP 根据 IP 地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层(如TCP或UDP)。
  • 每次 UDP 收到由 IP 传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个 ICMP 不可达报文(TCP 根据它的端口号作相似的过滤)。如果 UDP 数据报存在检验和错,将被丢弃。

1.1.单播(unicast)

单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来说,就是网卡的 MAC 地址(不是FF-FF-FF-FF-FF-FF这样的地址)。现在的具有路由功能的主机应该可以将单播数据定向转发,而目的主机的网络接口则可以过滤掉和自己 MAC 地址不一致的数据。

1.2.广播(unicast)

如下表中所示,广播可以分为四种情形。广播所用的 MAC 地址 FF-FF-FF-FF-FF-FF。网络内所有的主机都会收到这个广播数据,网卡只要把 MAC 地址为 FF-FF-FF-FF-FF-FF 的数据交给内核就可以了。一般说来 ARP,或者路由协议 RIP 应该是以广播的形式播发的。
TCP/IP详解08-网络层:广播和多播、IGMP_第2张图片

1.2.1 受限的广播

受限的广播地址是 255.255.255.255。该地址用于主机配置过程中 IP 数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的 IP 地址也不知道。

在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。

1.2.2 指向网络的广播

指向网络的广播地址是主机号为全 1 的地址。A 类网络广播地址为 netid.255.255.255,其中 netd 为 A 类网络的网络号。

一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

1.2.3 指向子网的广播

指向子网的广播地址为主机号为全 1 且有特定子网号的地址。作为子网直接广播地址的 IP 地址需要了解子网的掩码。

例如,如果路由器收到发往 128.1.2.255 的数据报,当 B 类网络 128.1 的子网掩码为 255.255.255.0 时,该地址就是指向子网的广播地址;但如果该子网的掩码为 255.255.254.0,该地址就不是指向子网的广播地址。

1.2.4 指向所有子网的广播

指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全 1。

例如, 如果目的子网掩码为 255.255.255.0,那么 IP 地址 128.1.255.255 是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。

1.3 多播

TCP/IP详解08-网络层:广播和多播、IGMP_第3张图片
使用组播的缘由是: 有的应用程序要把一个分组发送给多个目的主机. 不是让源主机给每一个目的主机都发送一个单独的分组, 而是让源主机把单个分组发送给一个组播地址, 该组播地址标识一组地址. 网络把这个分组给该组中的每一个主机都投递一份拷贝(单播与组播的比较示意图如上图所示).

能够接收发往一个特定多播组地址数据的主机集合称为主机组 (host group)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。(下文将会介绍主机使用一个称作 IGMP (因特网组管理协议)的协议加入多播组.)

需要注意:

  • (1)主机组播时仅发送一份数据, 只有数据在传送路径出现分岔时才将分组复制后继续转发. 这样对发送者而言, 数据只需发送一次就可以发送到所有接收者, 大大减轻了网络的负载和发送者的负担.
  • (2)组播需要路由器的支持才能实现, 能够运行组播协议的路由器称为组播路由器.

一些多播组地址被 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 应用。

1.3.1 多播组地址

IP组播使用D类地址格式. D 类地址的前四位是 1110, 因此 D 类地址范围为224.0.0.0~239.255.255.255. 每一个D类IP地址标志一个组播组;
TCP/IP详解08-网络层:广播和多播、IGMP_第4张图片

1.3.2 多播组地址到以太网地址的转换

虽然多播比较特殊,但是究其原理,多播的数据还是要通过数据链路层进行MAC地址绑定然后进行发送。所以一个以太网卡在绑定了一个多播IP地址之后,必定还要绑定一个多播的MAC地址,才能使得其可以像单播那样工作。这个多播的IP和多播MAC地址有一个对应的算法,下面将会介绍。可以看到这个对应不是一一对应的,主机还是要对多播数据进行过滤。

TCP/IP详解08-网络层:广播和多播、IGMP_第5张图片

将使以太网多播地址中的 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层就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。

  • 单个物理网络的多播是简单的。多播进程将目的 IP地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的 IP 层,它们想接收的发往给定多播地址的数据报,并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”。当一个主机收到多播数据报时,它必须向属于那个多播组的每个进程均传送一个复制。这和单个进程收到单播 UDP数据报的UDP不同。使用多播,一个主机上可能存在多个属于同一多播组的进程。
  • 当把多播扩展到单个物理网络以外需要通过路由器转发多播数据时,复杂性就增加了。需要有一个协议让多播路由器了解确定网络中属于确定多播组的任何一个主机。这个协议就是Internet组管理协议(IGMP),后文将会介绍。

1.4 实验

这些实验并不是很复杂,我们只是要 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发信。

再来一个多播的例子,但是要实现这个多播并不容易,因为我不知道网络内有多少个多播组,就只好利用几个特殊的多播地址来验证了。

对于多播地址,有几个特殊的多播地址被占用,他们是

  • 224.0.0.1–该子网内所有的系统组。
  • 224.0.0.2–该子网内所有的路由器。
  • 224.0.1.1–网络实现协议NTP专用IP。
  • 224.0.0.9–RIPv2专用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

2. IGMP:Internet组管理协议

IGMP 的英文全称是(Internet Group Management Protocol),用于支持主机和路由器进行多播它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。

2.1 IGMP报文

TCP/IP详解08-网络层:广播和多播、IGMP_第6张图片

TCP/IP详解08-网络层:广播和多播、IGMP_第7张图片

  • IGMP 类型为 1 说明是由多播路由器发出的查询报文,为 2 说明是主机发出的报告报文。
  • 检验和的计算和 ICMP 协议相同。
  • 组地址为 D 类 IP 地址。在查询报文中组地址设置为 0,在报告报文中组地址为要参加的组地址。

2.2 IGMP的工作过程如下

  1. 当主机加入一个新的工作组时,它发送一个 igmp host membership report 的报文给全部主机组,宣布此成员关系. 本地多播路由器接收到这个报文后,向Internet上的其他多播路由器传播这个关系信息,建立必要的路由.与此同时,在主机的网络接口上将ip主机组地址映射为mac地址,并重新设置地址过滤器.
  2. 为了处理动态的成员关系,本地多路广播路由器周期性的轮询本地网络上的主机,以便确定在各个主机组有哪些主机,这个轮询过程是通过发送 igmp host membership query 报文来实现的,这个报文发送给全部主机组,且报文的 ttl 域设为1,以确保报文不会传送到 lan 以外.收到报文的主机组成员会发送响应报文.如果所有的主机组成员同时响应的话,就可能造成网络阻塞.IGMP协议采用了随机延时的方法来避免这个情况.这样就保证了在同一时刻每个主机组中只有一个成员在发送响应报文。

这种查询回应数据报的TTL一般是1,而且就算是出错也不产生ICMP差错(没必要)。

TCP/IP详解08-网络层:广播和多播、IGMP_第8张图片

多播路由选择实际上就是要找出以源主机为根节点的多播转发树, 其中每一个分组在每条链路上只传送一次(即在多播转发树上的路由器不会收到重复的多播数据报). 对不同的多播组对应于不同的多播转发树; 同一个多播组, 对不同的源点也会有不同的多播转发树.

TCP/IP详解08-网络层:广播和多播、IGMP_第9张图片

2.3 所有主机组

IP 地址 224.0.0.1 被称为所有主机组地址。它涉及在一个物理网络中的所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送 IGMP 报告。

参考

  • https://blog.csdn.net/wllenyj/article/details/50318619
  • https://blog.csdn.net/kthq/article/details/6174077

你可能感兴趣的:(TCP/IP详解)