• 多播(组播)原理分析


    首先说明一点,要想在不同网段收到多播信息,得把网关的多播功能开发才可行!
    为什么要使用多播:
            网卡从网络上接收到目标物理地址对应的所有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.0到239.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 的分组(封包)时,它将被分发给该网段上的所有计算机。

  • 相关阅读:
    Unix/Linux环境C编程入门教程(32) 环境变量那些事儿
    Unix/Linux环境C编程入门教程(34) 编程管理系统中的用户
    Unix/Linux环境C编程入门教程(30) 字符串操作那些事儿
    Unix/Linux环境C编程入门教程(29) 内存操作那些事儿
    Unix/Linux环境C编程入门教程(28) 日期时间那些事儿
    Unix/Linux环境C编程入门教程(27) 内存那些事儿
    模板函数冲突
    C语言的本质(30)——C语言与汇编之ELF文件格式
    C语言的本质(29)——C语言与汇编之寄存器和寻址方式
    DG观察日志传输
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/9414521.html
Copyright © 2020-2023  润新知