您的位置:首页 > 理论基础 > 计算机网络

《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议

2018-11-11 22:09 2626 查看

对应原书章节


《TCP/IP详解 卷1:协议》在线阅读版 - 第12章 广播和多播
《TCP/IP详解 卷1:协议》在线阅读版 - 第13章 IGMP:Internet组管理协议

单播,多播,广播的介绍


1单播(unicast)


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

2广播(unicast)


广播是主机针对某一个网络上的所有主机发送数据包。这个网络可能是网络,可能是子网,还可能是所有的子网。如果是网络, 例如 A 类网址的广播就是 netid.255.255.255,如果是子网,则是 netid.netid.subnetid.255;如果是所有的子网(B 类 IP)则是则是 netid.netid.255.255。广播所用的 MAC 地址 FF-FF-FF-FF-FF-FF。网络内所有的主机都会收到这个广播数据,网卡只要把 MAC 地址为 FF-FF-FF-FF-FF-FF 的数据交给内核就可以了。一般说来 ARP,或者路由协议 RIP 应该是以广播的形式播发的。

3多播(multicast)


可以说广播是多播的特例,多播就是给一组特定的主机(多播组)发送数据,这样,数据的播发范围会小一些(实际上播发的范围 一点也没有变小),多播的 MAC 地址是最高字节的低位为一,例 如01-00-00-00-00-00。多播组的地址是 D 类 IP,规定是 224.0.0.0-239.255.255.255。

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

个人的看法:广播和多播的性质是一样的,路由器会把数据放到局域网里面,然后网卡对这些数据进行过滤,只拿到自己打算要 的数据,比如自己感兴趣的多 播数据,自己感兴趣的组播数据。当一个主机运行了一个处理某一个多播 IP 的进程的时候,这个进程 会给网卡绑定一个虚拟的多播 mac 地址,并做出来一个多播 ip。这样,网卡就会让带有这个多播 mac 地址的数据进来,从而实现通信, 而那些没有监听这些数据的主机就会把这些数据过滤掉,换句话说,多播,是让主机 的内核轻松了,而网卡,对不起,您就累点吧。

一些文章也印证了这种想法,最明显的就是《局域网监听的原理、实现与防范》。

一些验证性实验


这些实验并不是很复杂,我们只是要 ping 一下一般的 ip 和一个广播地址。首先我 ping 一下自己所在的子网的某一台主机:

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time=1ms TTL=255


可以看到,机器返回的是一台主机的回应结果,进而推测,如果我 ping 一个广播地址呢?结果如下:

Reply from 192.168.11.9: bytes=32 time=1ms TTL=255
Reply from 192.168.11.174: bytes=32 time<1ms TTL=64
Reply from 192.168.11.174: bytes=32 time<1ms TTL=64
Reply from 192.168.11.174: bytes=32 time<1ms TTL=64
Reply from 192.168.11.218: bytes=32 time<1ms TTL=64
Reply from 192.168.11.174: bytes=32 time<1ms TTL=64


可以看到,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.2:

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255
Reply from 192.168.11.1: bytes=32 time<1ms TTL=255


我们可以看到,这回 ping 只返回了一个 ip 的回应。而这个就是我的网关的地址,这也验证了224.0.0.2是所有路由器的多播(组播) 地址。

IGMP 协议


IGMP 的作用在于,让其他所有需要知道自己处于哪个多播组的主机和路由器知道自己的状态。一般多播路由器根本不需要知道 某一个多播组里面有多少个 主机,而只要知道自己的子网内还有没有处于某个多播组的主机就可以了。只要某一个多播组还有一台主 机,多播路由器就会把数据传输出去,这样,接受方就会通 过网卡过滤功能来得到自己想要的数据。为了知道多播组的信息,多播路 由器需要定时的发送 IGMP 查询,IGMP 的格式可以看书,各个多播组里面的主机要根 据查询来回复自己的状态。路由器来决定有几 个多播组,自己要对某一个多播组发送什么样的数据。

这种查询回应数据报的 TTL 一般是1,而且就算是出错也不产生 ICMP 差错(没必要)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: