多播(组播)原理分析

为什么要使用多播:
        网 卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和广播模式。利用这一特性,UDP(用户数据报协议)还提供了向多个目标地址发送广播数据包的能力。广播数据即数据从一个工作站上发出, 只要将数据包的目标物理地址对应的所有bit位都设为1,局域网内的所有工作站网卡都会收到这条消息并将其上传给驱动程序。这一特征适用于无连接协议,因为局域网(LAN)上的所有机器都可获得并处理广播消息。使用广播消息的不利之处是每台机器都必须对该消息进行处理。比如,一用户在LAN上广播一条消息,每台机器上的网卡都会收到这条消息,并把它上传到网络堆栈(驱动程序完成),然后,堆栈将这条消息的目标端口号与该主机上运行的所有的网络应用程序中所指定的端口号依次比较,看它们是否相等,从而决定哪个网络应用程序应该接收这条消息。通常,这个局域网上的多数机器对该消息都不感兴趣,草草地一弃了之。但是,各台机器在驱动程序中都仍需花时间来处理这个数据包,看是否有应用程序对它感兴趣。结果,高广播通信流使LAN上的机器陷入困境,因为每个工作站都要检查这个数据包。
有一些特殊的物理地址,他们不能作为任何网卡的实际物理地址使用,但网卡能够设定为不过滤从网络上接收到的一个以这些物理地址中的一个和若干个作为目的物理地址的帧。这些物理地址称为多播传送地址网卡的这种工作模式称为多播传送模式
多播”亦称“多点传送”(multicast),也就是一台主机发出的包可以同时被其他多个有资格的主机接收,这台主机和那些有资格的主机就形成了一个组,他们在组内的通信是广播式的多播的工作原理是将一个网络上的某些主机的网卡设置成多播传送工作模式,指定其不过滤以某一个多播传送地址作为目的物理地址的数据帧,这样,这些主机的驱动程序中就可以同时接收以该多播传送地址作为目的物理地址的数据帧,而其他主机的驱动程序却接收不到,这些主机在逻辑上便形成了一个“多播”组。采用这种技术,相对广播而言,可有效减轻网络上“多播”组之外的其他主机的负担,因为发送给“多播”组的数据不会被传送到它们的驱动程序中去处理,避免资源的无谓浪费。最开始的时候,设计这一技术的目的是弥补“广播”(Broadcasting)通信的不足。

多播有两种实现方式:
1.设置网卡为混杂模式,然后通过驱动对收到的所有数据包进行过滤,留下指定的多播地址的数据包。
  这种方式效率比较低,适合不支持多播模式的网卡。
2.设置网卡为多播模式,网卡本身有多播过滤器,网卡自己能够判断进入的数据包是否属于多播数据。
  由于多播过滤是由硬件完成的,所以效率比较高。

 

网卡只接收目的地址为网卡自身物理地址多播地址(广播是多播的一种)的帧。对于以太网,多播的地址的最高字节的最低位为1(01:00:00:00:00:00)
对于IP多播,IP多播地址会转换成以太网多播地址,一个以太网多播地址可以对应多个IP多播地址

因此,设备驱动程序或IP层必须对数据报进行过滤,因为网卡可能收到主机不想接收的多播数据帧。当网卡不提供足够多播数据帧过滤功能时,就必须把网卡设置成“混杂模式”,由驱动检查收到的数据帧是否为主机需要的。
也就是说多播的两种实现模式,都需要由驱动程序参与过滤,只不过如果先由网卡过滤,可以减轻驱动程序的工作量。

 

 多播地址(multicast address)是一组主机的标示符,它已经加入到一个多播组中。在以太网中,多播地址是一个48位的标示符,命名了一组应该在这个网络中应用接收到一个分组的站点。在IPv4中,它历史上被叫做D类地址,一种类型的IP地址,它的范围从224.0.0.0239.255.255.255。D类地址用于组播。

 

 

    Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iftop

在类Unix系统中可以使用top查看系统资源、进程、内存占用等信息。查看网络状态可以使用netstat、nmap等工具。若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop。一、iftop是什么?iftop是类似于top的实时流量监控工具。官方网站&…

sql 日记

--4.选择雇用时间在1998-02-01到1998-05-01之间的员工姓名,job_id和雇用时间select last_name,job_id,hire_datefrom employeeswhere to_char(hire_date,yyyy-mm-dd) between 1998-02-01 and 1998-05-01 --5.选择在20或50号部门工作的员工姓名和部门号select last_n…

CSS3中的变形处理

变形分类 缩放 使用scale方法来实现文字或图像的缩放,在参数中指定缩放倍率。例如“scale(0.5)”,表示缩小50 倾斜 使用skew方法来实现文字或图像的缩放,在参数中指定水平方向的倾斜角度与垂直方向的倾斜角度&#xf…

linux基本知识学习

LINUX黑洞 /dev/null 这是一个虚设的设备,俗称“LINUX 黑洞”,任何对/dev/null的写入都会成功, 但是数据会消失得无影无踪,没有任何反馈。所以经常把不想在屏幕 显示的信息全部送到/dev/null,在shell脚本中用得较多。 …

日志OLAP:在SQL中使用UDF, lambda函数使用案例

场景 日志服务内置了20类SQL函数。面对用户复杂的业务场景,例如使用json来沉淀业务数据,普通的SQL函数可能就无法满足需求,需要一些用户自定义处理逻辑。为了处理json类的业务数据,我们可以采用把json展开成多行的形式进行统计分析…

瓶子个数计数halcon

文章目录处理要求处理方法一源码效果方法二源码效果博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找纸箱内瓶子个数 处理方法一 源码 dev_clear_window () dev_open_window (0, 0, 640*1.5, 512*1.5, black, WindowHandle…

lightoj1060_组合数学

http://lightoj.com/volume_showproblem.php?problem1060 有一些用尼康托展开http://blog.csdn.net/niushuai666/article/details/6611131,简单的尼康托,每个字母多个数的还不会 组合数学解看起来比较简单 给定一个字符串和k,求字符串第k大字…

几个so经常使用Function

SD_WF_ORDER_REJECT SO拒绝 RV_ORDER_FLOW_INFORMATION 获得凭证流,支持OBD,SO等 call function RV_ORDER_FLOW_INFORMATION exporting aufbereitung 2 belegtyp C comwa l_comwa…

LIVE555建立RTSP服务记录

在官网上面 http://www.live555.com/liveMedia/#config-unix下载最新源码,并进行编译,同时官网上面告诉了你怎么样编译已经不同平台对应需要修改的内容 一、arm_linux_g下面编译视频文件LIVE555 【config.armlinux】 CROSS_COMPILE arm-none…

halcon自动对焦算法

1、介绍 图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制。对焦不准确,图像就会变得比较模糊不清晰。相机对焦时通过一些清晰度评判指标,控制镜…

HTML学习笔记06-连接

HTML超链接 HTML使用标签<a>来设置文本超链接。 超链接可以是文字&#xff0c;也可以是图片&#xff0c;点击这些内容跳转到新的文档或当前文档的某个部分 代码类似这样&#xff1a; <a href"url">连接文本</a> 实例&#xff1a; <!DOCTYPE HTM…

在Xcode中使用Git进行源码版本控制

在Xcode中使用Git进行源码版本控制 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本。如果是多个人共同开发一个项目&#xff0c;那么代码的控制就会非常复杂。幸运的是&am…

Linux环境变量的设置和查看方法

1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO"Hello!" $ echo $HELLO Hello! 3. 使用env命令显示所有的环境变量 $ env HOSTNAMEredbooks.safe.org PVM_RSH/usr/bin/rsh Shell/bin/bash TERMxterm HISTSIZE1000 ..…

CefSharp试用

Github地址&#xff1a; https://github.com/cefsharp/CefSharp 首先下载所有源代码下来 然后直接打开Sln 然后就可以直接调试WinForm、Wpf的Example了 注意地方&#xff1a; CefSharp.Core、CefSharp.BrowserSubprocess.Core 这两个类库是用C写的&#xff0c;所以VisualStudio…

ORA-30649: 缺少DIRECTORY关键字的问题解决方法

在oracle 里执行该语句时 提示 ORA-30649: 缺少 DIRECTORY 关键字把NOT null 放到 default 后面&#xff0c;就是如下写法&#xff0c;oracle 正常执行alter table PM_INFO ADD sort NUMBER(10,0) DEFAULT (0) NOT NULL;转载于:https://www.cnblogs.com/person008/p/9234637.ht…

java 解决汉诺塔问题

//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void Show(String a,String b){ System.out.print(" " a "->" b " " ); } //从a移到c public static void Fun(int n, Str…

利用VC++实现局域网实时传输

本文针对不同的局域网&#xff0c;提出一种通用的实时视频传输的解决方案。在使用Divx编解码的基础上&#xff0c;提出了从压缩、组帧、发送到接收、解压整个流程的思想&#xff0c;具体实施方案和VC实现核心源代码以及传输控制策略&#xff0c;有效地保证了高质量的实时视频传…

ASP.NET Web API之消息[拦截]处理(转)

出处&#xff1a;http://www.cnblogs.com/Leo_wl/p/3238719.html 标题相当难取&#xff0c;内容也许和您想的不一样&#xff0c;而且网上已经有很多这方面的资料了&#xff0c;我不过是在实践过程中作下记录。废话少说&#xff0c;直接开始。 Exception 当服务端抛出未处理异常…

无人驾驶遇见人工智能 百度将推有“大脑”的汽车

在日前举行的中国云计算大会&#xff0c;百度高级副总裁、技术战略委员会主席王劲表示&#xff0c;百度将在今年下半年推出无人驾驶汽车。不过&#xff0c;百度自己并不会造车&#xff0c;它将与第三方汽车厂商合作制造。据介绍&#xff0c;百度将利用现有的大数据、地图、人工…

AdlinkMotionCardLibrary函数C++

#include "stdafx.h" #include "AdlinkMotionCardLibrary.h"extern "C" _declspec(dllexport) bool _stdcall MotionCardIni(I32& BoardId_InBits, I32 Mode) { try{//mode0&#xff1a;&#xff1a; 系统指定卡号 mode1&#xff1a;&am…