当前位置: 首页 > news >正文

TCP/IP学习笔记(7)-广播,多播IGMP协议

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

单播,多播,广播的介绍

单播(unicast)

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

广播(broadcast)

广播是主机针对某一个网络上的所有主机发送数据包。这个网络可能是网络,可能是子网,还可能是所有的子网。如果是网络,例如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应该是以广播的形式播发的。

多播(multicast)

可以说广播是多播的特例,多播就是给一组特定的主机(多播组)发送数据,这样,数据的播发范围会小一些(实际上播发的范围一点也没有变小),多播的MAC地址是最高字节的低位为一,例 如01-00-00-00-00-00。多播组的地址是D类IP,规定是224.0.0.0-239.255.255.255。
然多播比较特殊,但是究其原理,多播的数据还是要通过数据链路层进行MAC地址绑定然后进行发送。所以一个以太网卡在绑定了一个多播IP地址之后,必 定还要绑定一个多播的MAC地址,才能使得其可以像单播那样工作。这个多播的IP和多播MAC地址有一个对应的算法,这个对应不是一一对应的,主机还是要对多播数据进行过滤。
个人的看法:广播和多播的性质是一样的,路由器会把数据放到局域网里面,然后网卡对这些数据进行过滤,只拿到自己打算要的数据,比如自己感兴趣的多 播数据,自己感兴趣的组播数据。当一个主机运行了一个处理某一个多播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发信。
再来一个多播的例子,但是要实现这个多播并不容易,因为我不知道网络内有多少个多播组,就只好利用几个特殊的多播地址来验证了。
对于多播地址,有几个特殊的多播地址被占用,他们是
1. 224.0.0.1--该子网内所有的系统组。
2. 224.0.0.2--该子网内所有的路由器。
3. 224.0.1.1--网络实现协议NTP专用IP。
4. 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差错(没必要)。

本文原创地址:https://www.linuxprobe.com/multicast-broadcast.html

转载于:https://my.oschina.net/u/3585265/blog/2239741

相关文章:

  • 【编译打包】sphinx-for-chinese-2.2.1-r4311.el6.src.rpm
  • 缓冲区溢出漏洞实验
  • MSQL基本增删改语句汇总练习
  • Jsp/Servlet:小结图片操作的一些代码
  • 十:Application Lifecycle Management in Visual Studio 2008 Team Foundation Server 2008
  • it之家
  • 天气预报代码调用
  • Java静态方法和实例方法 java中的数组作为形参传入
  • [CodeForces-759D]Bacterial Melee
  • MongoDB lsm降低 disk lantency
  • CentOS7 LVM添加硬盘及扩容
  • Hanlp等七种优秀的开源中文分词库推荐
  • python基础===抽象
  • 【洛谷 P2303】 [SDOi2012]Longge的问题 (欧拉函数)
  • 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  • 11111111
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JSDuck 与 AngularJS 融合技巧
  • nodejs实现webservice问题总结
  • Otto开发初探——微服务依赖管理新利器
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Transition Group -- Transition 组件
  • 闭包--闭包之tab栏切换(四)
  • 从输入URL到页面加载发生了什么
  • 猴子数据域名防封接口降低小说被封的风险
  • 今年的LC3大会没了?
  • 聊聊sentinel的DegradeSlot
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 首页查询功能的一次实现过程
  • 树莓派 - 使用须知
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 自动记录MySQL慢查询快照脚本
  • ​用户画像从0到100的构建思路
  • # centos7下FFmpeg环境部署记录
  • #if #elif #endif
  • (¥1011)-(一千零一拾一元整)输出
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (待修改)PyG安装步骤
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (九)One-Wire总线-DS18B20
  • (算法二)滑动窗口
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Micro Framework初体验
  • .net/c# memcached 获取所有缓存键(keys)
  • .net2005怎么读string形的xml,不是xml文件。
  • .net6 webapi log4net完整配置使用流程
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET序列化 serializable,反序列化
  • .NET中两种OCR方式对比
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • [ C++ ] STL---仿函数与priority_queue