多播的实现和需要注意的问题
 
       前段时间研究了一小段时间的网络多播问题,自己很有感触,把自己的经历写出来,希望有需要的可以少走一些弯路。
         先说一下原理,我觉得这个还是需要说一下的。
         网络中存在三种传输概念,单播,多播,广播,单播和广播大家可能都很了解,单播,连接的建立是一对一的,广播则是向一个网络内所有用户发送。
         我们这里只说多播,多播的好处我就不说了,节省带宽什么的。
        其实我个人觉得,单播多播都可以看错是某种意义上的广播,单播可以理解为网络只有一个用户,多播则可以理解为是受限制的一组广播用户(指定的一组用户)。
网络中存在五种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. oracle之约束-主键、非空、唯一、check、外键、默认

    --首先添加主键约束alter table studentadd constraint PK_student_sno primary key(sno) --删除约束alter table studen ...

  2. [暂停维护]基于8211lib库对s57电子海图的解析和存储

    此篇博文停止维护,欢迎移步最新地址(含源代码),https://www.yanlongwang.net/USV/ENC-analysis-store.md/, 查看最新文章. 电子海图是为适用航海需要 ...

  3. 使用Jieba提取文章的关键词

    import jieba.analyse as analyse import matplotlib.pyplot as plt from wordcloud import WordCloud data ...

  4. Homebrew是什么?怎么关闭自动更新?

    Homebrew是MacOS 的软件包管理器. 通过它可以安装.卸载.更新.查看.搜索任何想要安装的软件.如:git, node等. 安装Homebrew /usr/bin/ruby -e " ...

  5. CUDA-F-5-5-常量内存

    title: [CUDA 基础]5.5 常量内存 categories: - CUDA - Freshman tags: - CUDA常量内存 - CUDA只读缓存 toc: true date: 2 ...

  6. From 7.29 To 8.4

    From 7.29 To 8.4 大纲 英语按时背 做点思维题 可能还有时间学点东西, 这周我也不知道应该干什么 7.29 上午考试, 终于有一回不是自闭的考试了 题目比较简单, 就不说了 7.30 ...

  7. 【BZOJ3098】 Hash Killer II

    BZOJ3098 Hash Killer II Solution 这道题目好像题面里面给了提示(当然没给就有点难想了.) 曾经讲过一个叫做生日悖论的,不知道还有多少人记得 考虑相同的可能性大概是\(\ ...

  8. python并发——进程间同步和通信

    一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...

  9. redis的哨兵

    删除旧master或者不可达slave sentinel永远会记录好一个Master的slaves,即使slave已经与组织失联好久了.这是很有用的,因为sentinel集群必须有能力把一个恢复可用的 ...

  10. Turtle库画小猫咪

    视频请点击这里哟 这个是用python库画的小猫咪,前面一步步的画整个猫的整个身体,具体步骤都写在了注释之中.身体部分画的比较快,后面画了5个心,由于画心的时候要改变好多度数,而且每次只前进一点点,所 ...