zoukankan      html  css  js  c++  java
  • 组播(Multicast)传输

    组播(Multicast)传输:

    在发送者和每一接收者之间实现点对多点网络连接。

    如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。

    单播、组播、广播的差别可以看下图:

    image

    • 单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。
    • 组播(multicast): 也叫多播, 多点广播或群播。 指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。
    • 广播(broadcast):是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。

     

    判断网卡是否支持组播

    在Linux运行ifconfig, 如果网卡信息中包含UP BROADCAST RUNNING MULTICAST,则支持广播和组播。

    image

     

    参考: http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast 

     

    组播IP地址

    组播IP地址用于标识一个IP组播组。

    IANA(internet assigned number authority)把D类地址空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。

    • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    • 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
    • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
      参考:http://baike.baidu.com/view/492256.htm

    永久的组播地址:

    • 224.0.0.0 基准地址(保留)
    • 224.0.0.1 所有主机的地址 (包括所有路由器地址)
    • 224.0.0.2 所有组播路由器的地址
    • 224.0.0.3 不分配
    • 224.0.0.4 dvmrp路由器
    • 224.0.0.5 所有ospf路由器
    • 224.0.0.6 ospf DR/BDR
    • 224.0.0.7 st路由器
    • 224.0.0.8 st主机
    • 224.0.0.9 rip-2路由器
    • 224.0.0.10 Eigrp路由器
    • 224.0.0.11 活动代理
    • 224.0.0.12 dhcp 服务器/中继代理
    • 224.0.0.13 所有pim路由器
    • 224.0.0.14 rsvp封装
    • 224.0.0.15 所有cbt路由器
    • 224.0.0.16 指定sbm
    • 224.0.0.17 所有sbms
    • 224.0.0.18 vrrp

    以太网传输单播ip报文的时候,目的mac地址使用的是接收者的mac地址。但是在传输组播报文时,传输目的不再是一个具体的接收者,而是一个成员不确定的组,所以使用的是组播mac地址。

    组播mac地址是和组播ip地址对应的。iana(internet assigned number authority)规定,组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。
    由于ip组播地址的后28位中只有23位被映射到mac地址,这样就会有32个ip组播地址映射到同一mac地址上。

     

    组成员机制

    要将组播数据准确发送给组成员,必须先确定哪些网络的哪些主机是组成员,只有先确定了成员的位置,才能正确转发组播。当组成员不再需要接收组播的时候,就应该停止向成员发送组播,要确定组成员不再需要接收组播,就必须在成员退出时明确通告发送者。要确定组成员,有两种方式:查询和报告。

    查询,就是一台路由器向网络中发出查询消息,查询是否要主机要加入组,如果有主机应答,那么路由器就可以请求上游路由器把组播流量前转到这个子网中,如果没有主机应答,则请求上游路由器停止向其前转组播流量。

    报告,主机也可以不必等待路由器的查询,可以主动向路由器请求加入某个组,退出时也要向路由器发送退出消息,让路由器停止向其前转组播流量。

    在网络中,要确定组成员,需要使用一种协议,这种协议就是IGMP (Internet Group Management Protocol)因特网组管理协议,IGMP运行在路由器和主机之间,因为当组播发送者和组成员在不同网络时,需要路由器为组播数据提供转发,那么路由器就必须确认自己直连的网络中是否存在组成员,可以使用查询和报告来发现组成员,IGMP就可以完成这样的工作。

    参考:http://www.china-ccie.com/ccie/lilun/Multicast/Multicast.html 

    组播数据包的生存时间

    将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。套接字不必成为多播组的成员即可向其发送消息。

    多数多播包的TTL比较低: 所有的IP包都有一个“生存时间”(time-to-live),或者叫TTL。和DNS记录不一样,TTL指定一个包到达目的地之前跳过网络的最大次数。单播包通常被允许穿越30个网络(比如,被路由或”跳“过29个路由),穿过网络通常小于15次”跳越“,所以30的限制经常用于当网络配置的很烂时把数据包杀掉。但是许多程序发多播时把TTL设为一个很低的值,通常为0(这样消息不会离开自身的设备)。

    设置为1表示只能发到本地网络的计算机,设置为2 表示只能穿过一个路由。很少有应用想把多播发给整个校园网络的未知设备,更不会发给整个网络。

    诸多路由都设置了很高的TTL阈值:很多网络路由器,特别是WAN路由和internet网关路由都有很高的TTL阈值,这样它们就不会发送这些低TTL(如15)的多播包。这样可以防止多播从本地网络泄漏。

    路由器一般配置成完全不发送多播,或只发一些特定的地址,或配置成阻塞多播包。

    每当多播路由器转发多播数据包时,数据包中的TTL值都会被减1,若数据包的TTL减少到0,则路由器将抛弃该数据包。TTL的值是多少,多播数据便最多能经过多少个多播路由器。例如,TTL值为0,则多播只能在本地主机的多个套接字间传播,而不能传播到“网线”上;TTL值为1(默认值),则多播数据遇到第一个路由器,便会被它“无情”地丢弃,不允许传出本地网络之外,即只有同一个网络内的多播组成员才能收到多播数据。

    Java文档中这部分参考:http://udn.yyuap.com/doc/jdk6-api-zh/java/net/MulticastSocket.html

     

    Java 组播的例子

    MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

    可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组:

    image

    例子代码取自:

    http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast/#0-tsina-1-67000-397232819ff9a47a7b7e80a40613cfe1

     

    通过 Wireshark 监控

    通过 Wireshark 监控多播的请求,可以用 下面过滤条件

    (eth.dst[0]&1) 

    image

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5276452.html
Copyright © 2011-2022 走看看