多播的实现和需要注意的问题
 
       前段时间研究了一小段时间的网络多播问题,自己很有感触,把自己的经历写出来,希望有需要的可以少走一些弯路。
         先说一下原理,我觉得这个还是需要说一下的。
         网络中存在三种传输概念,单播,多播,广播,单播和广播大家可能都很了解,单播,连接的建立是一对一的,广播则是向一个网络内所有用户发送。
         我们这里只说多播,多播的好处我就不说了,节省带宽什么的。
        其实我个人觉得,单播多播都可以看错是某种意义上的广播,单播可以理解为网络只有一个用户,多播则可以理解为是受限制的一组广播用户(指定的一组用户)。
网络中存在五种IP地址,A,B,C,D,E类
需要明白的一点事,IP地址分为两部分,IP=类别+网络号+主机号
           类别号     网络号       主机号
A类,   0             1~126          0~255 0~255 1~254
B类,10              128~191     0~255 0~2551~254
C类,110            192~223     0~255 0~255 1~254
D类,1110         224~239      0~255 0~255 1~254
E类,1111          240~255 0~255 0~255 1~254
 
 
 
排版不是我想要的,还是看图吧。
其中,对于A类地址来说,10.0.0.0 ~ 10.255.255.255为私有地址,127.0.0.0~127.255.255.255为回环地址,主机ID全0标识一个网络,主机ID全1表示广播地址,B类地址:172.16.0.0 ~ 172.31.255.255为私有地址,主机ID全0标识一个网络,主机ID全1表示广播地址,C类地址:192.168.0.0 ~ 192.168.255.255为私有地址(这个应该很熟悉吧),主机ID全0标识一个网络,主机ID全1表示广播地址。
          组播对应的MAC地址:01-00-5e-xx-xx-xx
映射关系:
          
 

 
         多播只会由感兴趣的端口接收,他是怎么知道这些端口的呢?这里就要说D类地址了。这里一定要理解一个概念:多播组。多播的数据是定向的发给一个多播组的,这样凡是多播组内的成员就会收到数据,有人问了,网络上有那么多多播组,是怎么知道要发给哪个组。这里就是D类地址了,D类地址充当了多播组的标识,记住,仅仅是标识。可以理解为,多播组的目的地址,多播组的ID。所有的主机可以选择加入多播组,也就是被标记为一个该多播组的一个ID。如何加入多播组是技术问题,我们后面讲。
          那么接下来的问题是,分布在全球的这么多台主机,如果美国的一台主机加入了这个多播组,英国的一个主机也加入了同样一个多播组,而我源头是中国这边的主机,那么他怎么发过去呢?
          需要考虑的问题,数据包如何到达子网路由器(主机-路由器之间的组成员关系协议),数据包如何在公网内路由(路由器-路由器之间的组播路由协议)(转发规则),数据如何被目的子网路由器接受并转发。
           首先,这个数据包要能到达你所在的子网的路由器,这一步如何实现的?答案,是IGMP协议。
IGMP(Internet Group Management Protocol),看名字就可以看出是因特网组播管理协议。是主机与路由器之间唯一的信令协议。目前有三个版本,V1,V2,V3(不同之处主要是V1,V2,V2是主动离开组播组,V1则是不会主动离开).通过用wireshark软件抓包测试,你会发现,目前网络上大部分是V2版本的组播协议包。主机向本地路由器发送一个IGMP,加入相对应的组播(组播地址端口,自己定义)。这样主机是可以加入组播了,但是到来的组播数据包是如何知道数据包要发给谁呢?还是IGMP!当发现有数据包来的时候,本地路由器向本地子网内的主机发送一个查询报文(IGMP),加入了多播组的主机则会发送一个回复给路由器(IGMP包),那后面就会转发此数据包了。如果主机要离开组播组怎么办呢?也是IGMP!主机只需要向路由器发送一个离开的消息(IGMP包)给路由器就可以了。
           数据发送到路由器后,路由器根据什么将数据包转发到其他路由器呢(公网内路由器的转发)?答案是:域内组播路由协议及域间组播路由协议。其实个人感觉不需要区分这个域间和域内路由,我们只需要关心,数据包可以在因特网上自由转发就可以了。这里需要知道的是两个域内路由协议,PIM-SM,PIM-DM,DVMRP(主要区别是密集模式和稀疏模式区别)。路由器间的转发需要的是这几个路由协议,原理在网上一搜一大堆,我就不讲了。这几个协议主要在转发,邻居发现什么的有些区别,比如说剪枝策略。
         组播的转发利用了一个叫逆向路径转发策略(RPF),RPF协议决定是否转发次数据包以及丢弃掉。
        路由器检查到达组播包的源地址,如果信息包是在可返回源站点的接口上到达,则RPF检查成功,信息包被转发如果RPF检查失败,丢弃信息包。
         大家这个时候可能对这个有些概念,组播说的也很神乎,比如很省带宽,毕竟是一发多,只需要发送一份,但是可以很多都接受。比单播好用多了,那你可能会问,那组播的应用应该很广了?答案是肯定的,组播的应用很多,比如多媒体会议,联网游戏等。但是有个问题目前确实致命的!应用的条件:路由器没有开启这个功能!!!
          大致可以说一下组播路由的过程,数据包从源端口出发,经路由器转发(这个应该是所有路由器都会经过,可是所有哦),然后到达有目的组播的成员则转发给他。这个时候你可能会发现一个问题,如果组播大规模应用的话,那网络上这种数据包会非常多,毕竟谁都可以创建组播组,然后发送,路由器是要进行转发的。
          我自己本来也是想实现一个组播功能的类似于视频会议的应用的,但是测试的时候发现,数据包就是冲不出去内网,只能在局域网内转(局域网内可以收到)。后来发现是路由器虽然有这个功能,但是默认都给关闭了。记得当时查这个资料的时候,在一个路由器管理员配置的一个BBS,上面一个人发帖,有人回答说:管理员如果开启这个功能,那只能说有病。足可以看出,目前路由器对组播支持的尴尬处境。
         所以这里只是提醒一下做这个的朋友,路由器对这个支持不是很好,如果要做的话多考虑一下。可能我理解不对,如果有做出来这个的,希望能提供观点哈。

【miscellaneous】多播的实现和需要注意的问题的更多相关文章

  1. 【miscellaneous】单播、广播和多播IP地址

    转自:http://www.cnblogs.com/gaoxing/archive/2012/02/19/2358484.html 除地址类别外,还可根据传输的消息特征将IP地址分为单播.广播或多播. ...

  2. 【miscellaneous】IP多播技术及其编程

    标  题: IP多播技术及其编程 发信站: 幽幽黄桷兰 (Mon Jun 16 10:35:39 2003) 转信站: SMTH!maily.cic.tsinghua.edu.cn!news2.ues ...

  3. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

  4. 【C#进阶】多播委托和委托数组像是一回事~

    这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { publi ...

  5. 多播程序设计(基于UDP协议)

    首先要搞清楚多播IP地址有哪些 D类IP地址就是多播地址,范围是224.0.0.0 ~ 239.255.255.255 其中又划分为以下类别 D类地址的划分 类别 地址范围 描述 局部链接地址(本地网 ...

  6. 《BI那点儿事》数据流转换——多播、Union All、合并、合并联接

    建立测试数据: CREATE TABLE FactResults ( Name ) , Course ) , Score INT ) INSERT INTO FactResults ( Name , ...

  7. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

  8. C#委托使用:多播 ,向委托注册多个方法

    private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); ...

  9. 《TCP/IP详解 卷一》读书笔记-----广播&多播&IGMP

    1.广播和多播都只适用于UDP,因为TCP是面向连接的,需要将两台主机的两个进程绑定在一起,即IP地址和端口对 2.通常,网卡能看到网络中的每一个数据帧,但是往往它只接受目的地址与自己MAC地址相同的 ...

随机推荐

  1. elementUI 上传文件图片大小加了限制后 仍然上传了

    https://blog.csdn.net/chanlingmai5374/article/details/80558444  看了这位老哥的说法 在看看文档 才发现自己没认真看文档 <el-u ...

  2. ACM-ICPC 2015 沈阳赛区现场赛 I. Triple && HDU 5517(二维BIT)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5517 题意:有二元组(a,b),三元组(c,d,e).当b == e时它们能构成(a,c,d)然后,当 ...

  3. Codeforces Round #588 (Div. 2) A. Dawid and Bags of Candies

    链接: https://codeforces.com/contest/1230/problem/A 题意: Dawid has four bags of candies. The i-th of th ...

  4. IAT表和导入表

    1.关于IAT(import address table)表 当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址:

  5. 001_C/C++笔试题_考察C/C++语言基础概念

    (一)文章来自:C/C++笔试题-主要考察C/C++语言基础概念.算法及编程,附参考答案 (二)基础概念 2. 头文件中的ifndef/define/endif的作用? 答:防止该头文件被重复引用. ...

  6. (vue.js)Vue element tab 每个tab用一个路由来管理?

    (vue.js)Vue element tab 每个tab用一个路由来管理? 来源:网络整理     时间:2017/5/13 0:24:01     关键词:   关于网友提出的“ (vue.js) ...

  7. Appium环境搭建(win/mac)

    课程使用Windows+Android虚拟机, 建议使用Windows系统学习课程, 如使用Mac系统, 请另外准备一台Andorid手机 Windows系统Appium环境搭建 安装JDK并配置环境 ...

  8. 发布web项目时,关于未能加载文件或程序集或它的某一个依赖项。拒绝访问的问题

    asp.net的程序是发布再iis上面的嘛,然后iis里面呢选中你的程序,在右边菜单有个编辑权限.然后添加权限Everyone.设置文件夹只读为否

  9. codeforces#1150D. Three Religions(dp+序列自动机)

    题目链接: https://codeforces.com/contest/1150/problem/D 题意: 给出长度为$n$的字符串,和$q$次询问 每次询问是,给$x$宗教增加一个字符$key$ ...

  10. 【APUE】第3章 文件I/O (3) 文件共享、原子操作、函数dup/dup2、函数sync/fsync/fdatasync、函数fcntl、函数ioct1、目录/dev/fd 使用说明

    1.文件共享 UNIX系统支持在不同的进程间共享打开文件.为了说明这种共享,以下介绍内核用于所有I/O的数据结构. 内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个 ...