精华内容
下载资源
问答
  • 一 路由器的工作原理 3层设备;当数据包进入路由器时,路由器先查看数据包中的目标MAC地址; 1、广播 解封装到3层。...3、单播 目标MAC为路由器接收到该流量的接口mac地址 --解封装 目标MAC不是本地路

    一 路由器的工作原理
    3层设备;当数据包进入路由器时,路由器先查看数据包中的目标MAC地址;
    1、广播 解封装到3层。
    2、组播 每一个组播地址均存在自己的MAC地址;基于目标MAC就可以判断本地是否需要解封装;若本地加入了该组将解包,否则直接丢弃
    组播地址 :2的28次方,224.0.0.0-239.255.255.255
    可用组播范围:0100.5E00.0000----0100.5E07.FFFF

    3、单播 目标MAC为路由器接收到该流量的接口mac地址 --解封装
    目标MAC不是本地路由器的mac地址 --丢弃

    二,. 单播,组播和广播之间的区别
    包层面:单播 源: 单播 目:单播
    组播 源:单播 目:组播
    广播: 源:单播 目:广播
    行为层面:单播 一对一传播
    组播和广播一样
    三 . 路由器工作原理(续):
    二层解封装完成后,查看3层报头;默认路由器仅查看目标ip地址;
    目标ip:
    1、广播 解封装
    2、组播 若路由器加入了该组,解封;若没有加入,丢弃
    3、单播 目标ip地址为路由器,继续解封
    目标ip地址为其他设备,路由器将查询本地的路由表—TCAM
    交换机为CAM表(二进制表格),TCAM由1、0、x构成 x标识主机位
    四. 数据交换的方式(路由方式)
    1、原始包交换—先查询本地的TCAM表,再查看本地的ARP表来确定目标或者下一跳的mac地址—前提网络环境为以太网

    2、快速交换 – 一次路由多次交换 基于数据流的第一个包进行TCAM和ARP表查询;之后将该通过过程—源目ip地址、进出接口、新的二层封装记录到缓存中;生成一个cache列表;该数据量的第二个包将基于缓存直接转发;

    3、特快交换 最早由cisco提出;CEF技术 无需路由直接交换
    路由器将本地的路由表和ARP直接转换为二进制的列表;之后将两个表格整合形成转发规则;
    路由表—FIB转发信息数据库 –解决完了递归
    ARP—adj 邻居关系表

    网络类型:
    1、点到点 – 在一网段内只能存在两个物理接口
    2、BMA – 广播型多路访问网络 在一个MA网络中,同时存在广播洪泛机制
    3、NBMA – 非广播型多路访问网络 在一个MA中不支持洪泛机制,只能使用伪广播来进行广播或组播行为
    MA:多路访问,在一个网段内物理节点数量不做限制

    OSPF网络类型:
    OSPF网络类型的设计意义:适应不同的链路场景(适应WAN的线路场景)
    PPP所代表的是一种支持广播(组播)的点到点链路
    以太网代表的是LAN中的广播多路链路
    FR、MGRE代表的是一种非广播的多路链路:
    通过伪广播技术可以支持OSPF之间发送广播包
    俩点之间的通信:
    NBMA、P2P、BMA、P2MP、NB-P2MP
    多点之间的通信:
    非广播(不支持伪广播)(无法洪泛广播或者组播包,不是会丢弃广播或者组播包)
    NBMA、NB-P2MP
    广播:(支持伪广播)
    伪广播:将流量基于每个用户进行一次单播
    伪广播和广播从包层面上是一样的,行为上不同。广播是在群众@所有人,伪广播是依次@每个人。
    P2MP、BMA、NBMA、NB-P2MP
    NB的问题是不能自动发现邻居,出现新的节点需要新增配置。好处是安全,邻居必须手动添加。
    MP特点是分支之间不能直接到达,必须绕行总部。
    MA的特点,需要花时间选举DR/BDR并且分支之间是直接可以到达的。

    二层交换机的作用:
    1、提供端口密度,用于更多节点的互联 集线器(HUB)也可以实现
    2、对电流信息进行识别在转发;故理论上可以无限延长传输距离
    3、完全没有冲突;实现所有节点间的同时数据收发
    4、二层单播

    二层交换机的工作原理:
    数据帧进入交换机后,交换机先查看数据帧中的源mac地址,基于该mac的进入接口记录到本地的MAC地址表—CAM 表
    标准CAM MAC+ 接口编号 哈希运算
    支持vlan基础的CAM MAC+接口编号+VLAN ID 哈希运算
    哈希运算==hash 散列函数算法 – 摘要提取法
    最常用哈希算法 MD5 SHA-1 -128 -256 -512

    哈希算法特点:
    1、不等长的输入,等长的输出
    2、雪崩效应
    3、不可逆向运算

    3层交换机工作原理:
    二层交换机和路由器的功能集合设备;
    当一个数据包进入3层交换机后;
    1、先查看源mac地址,生成cam
    2、再查看目标mac地址
    1)广播 洪泛 同时解封装
    2)组播 洪泛或者基于组转发 若该设备处于该组同时解封
    3)单播 目标mac为本地,直接解封 目标mac为其他设备基于cam表转发

    3、解封装后,查看目标ip地址;此时行为将和路由器一致

    展开全文
  • 单播广播和优缺点

    千次阅读 2019-03-13 22:38:18
    当前的网络中有三种通讯模式:单播广播、组(多),其中的组出现时间最晚但同时具备单播和广播的优点,最具有发展前景。 一、单播: 主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发...

    优缺点简介

    单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。

    多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。   IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。

    知识点复习

    当前的网络中有三种通讯模式:单播、广播、组播(多播),其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景。
    一、单播:
    主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地
    单播的优点:
    1.服务器及时响应客户机的请求
    2.服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。
    单播的缺点:
    1.服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。
    2.现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。
    二、 广播:
    主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉,有线电视网就是典型的广播型网络。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
    广播的优点:
    1.网络设备简单,维护简单,布网成本低廉
    2. 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
    广播的缺点:
    1.无法针对每个客户的要求和时间及时提供个性化服务。
    2. 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。
    3. 广播禁止在Internet宽带网上传输。
    三、组播:
    主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
    组播的优点:
    1.需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
    2. 由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个(268435456)组播,所以其提供的服务可以非常丰富。
    3. 此协议和单播协议一样允许在Internet宽带网上传输。
    组播的缺点:
    1.与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
    2.现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善。

    展开全文
  • 单播、多(组和广播的区别 单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在...
    单播、多播(组播)和广播的区别  

    单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?  

    1.单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。  


    2.多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。   IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。Windows 2000中的DHCP管理器支持多播IP地址的自动分配。  


    3.广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。   广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。   在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。 


    ================================================================= 
    当前的网络中有三种通讯模式:单播、广播、组播,其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景。  
    1.单播: 

    主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用单播模式,具体的说就是IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。 

    单播的优点: 

    1)服务器及时响应客户机的请求 
    2)服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。  
    单播的缺点: 
    1)服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。 
    2)现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,

    将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞。而将主干扩展20倍几乎是不可能。  


    2.广播: 

    主机之间一对所有的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。 

    广播的优点: 

    1)网络设备简单,维护简单,布网成本低廉 
    2)由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。  
    广播的缺点: 
    1)无法针对每个客户的要求和时间及时提供个性化服务。 

    2)网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。 3)广播禁止允许在Internet宽带网上传输。  


    3.组播: 

    主机之间一对一组的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。 

    组播的优点: 

    1)需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。 2)由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富。  3)此协议和单播协议一样允许在Internet宽带网上传输。  
    组播的缺点: 
    1)与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。 2)现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。
    展开全文
  • UDP 单播广播和

    2017-11-03 16:47:22
    三、UDP广播单播 广播单播的比较  使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址端口号,然后将信息封装到一个待发送的报文中...
    

    阅读目录(Content)

         使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。     

         单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。

      通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

    一、UDP广播

      广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

    广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。

      其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

    UDP服务端代码:

    复制代码
    复制代码
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<sys/socket.h>
     4 #include<unistd.h>
     5 #include<sys/types.h>
     6 #include<netdb.h>
     7 #include<netinet/in.h>
     8 #include<arpa/inet.h>
     9 #include<string.h>
    10 using namespace std;
    11 int main()
    12 {
    13     setvbuf(stdout,NULL,_IONBF,0);
    14     fflush(stdout);
    15     int sock=-1;
    16     if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
    17     {
    18         cout<<"sock error"<<endl;
    19         return -1;
    20     }
    21     const int opt=-1;
    22     int nb=0;
    23     nb=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));//设置套接字类型
    24     if(nb==-1)
    25     {
    26         cout<<"set socket error...\n"<<endl;
    27         return -1;
    28     }
    29     struct sockaddr_in addrto;
    30     bzero(&addrto,sizeof(struct sockaddr_in));
    31     addrto.sin_family=AF_INET;
    32     addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);//套接字地址为广播地址
    33     addrto.sin_port=htons(6000);//套接字广播端口号为6000
    34     int nlen=sizeof(addrto);
    35     while(1)
    36     {
    37         sleep(1);
    38         char msg[]={"the message broadcast"};
    39         int ret=sendto(sock,msg,strlen(msg),0,(sockaddr*)&addrto,nlen);//向广播地址发布消息
    40         if(ret<0)
    41         {
    42             cout<<"send error...\n"<<endl;
    43             return -1;
    44         }
    45         else 
    46         {
    47             printf("ok\n");
    48         }
    49     }
    50     return 0;
    51 }
    复制代码
    复制代码

     UDP广播客户端代码:

    复制代码
    复制代码
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<sys/socket.h>
     4 #include<unistd.h>
     5 #include<sys/types.h>
     6 #include<netdb.h>
     7 #include<netinet/in.h>
     8 #include<arpa/inet.h>
     9 #include<string.h>
    10 
    11 
    12 using namespace std;
    13 int main()
    14 {
    15         setvbuf(stdout,NULL,_IONBF,0);
    16         fflush(stdout);
    17         struct sockaddr_in addrto;
    18         bzero(&addrto,sizeof(struct sockaddr_in));
    19         addrto.sin_family=AF_INET;
    20         addrto.sin_addr.s_addr=htonl(INADDR_ANY);
    21         addrto.sin_port=htons(6000);
    22         socklen_t len=sizeof(addrto);
    23         int sock=-1;
    24         if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
    25         {
    26                 cout<<"socket error..."<<endl;
    27                 return -1;
    28         }
    29         const int opt=-1;
    30         int nb=0;
    31         nb=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));
    32         if(nb==-1)
    33         {
    34                 cout<<"set socket errror..."<<endl;
    35                 return -1;
    36         }
    37         if(bind(sock,(struct sockaddr*)&(addrto),len)==-1)
    38         {
    39                 cout<<"bind error..."<<endl;
    40                 return -1;
    41         }
    42         char msg[100]={0};
    43         while(1)
    44         {
    45                 int ret=recvfrom(sock,msg,100,0,(struct sockaddr*)&addrto,&len);
    46                 if(ret<=0)
    47                 {
    48                         cout<<"read error..."<<endl;
    49                 }
    50                 else
    51                 {
    52                         printf("%s\t",msg);
    53                 }
    54                 sleep(1);
    55         }
    56         return 0;
    57 }
    复制代码
    复制代码

     二、UDP多播

    1、多播(组播)的概念

      多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。

      在广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择地复制并传输数据,将数据仅仅传输给组内的主机。多播的这种功能,可以一次将数据发送到多个主机,又能保证不影响其他不需要(未加入组)的主机的其他通 信。

    相对于传统的一对一的单播,多播具有如下的优点:

      1、具有同种业务的主机加入同一数据流,共享同一通道,节省了带宽和服务器的优点,具有广播的优点而又没有广播所需要的带宽。

      2、服务器的总带宽不受客户端带宽的限制。由于组播协议由接收者的需求来确定是否进行数据流的转发,所以服务器端的带宽是常量,与客户端的数量无关。

      3、与单播一样,多播是允许在广域网即Internet上进行传输的,而广播仅仅在同一局域网上才能进行。

    组播的缺点:

      1、多播与单播相比没有纠错机制,当发生错误的时候难以弥补,但是可以在应用层来实现此种功能。

      2、多播的网络支持存在缺陷,需要路由器及网络协议栈的支持。

      3、多播的应用主要有网上视频、网上会议等。

    2、广域网的多播

      多播的地址是特定的,D类地址用于多播。D类IP地址就是多播IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:

      1、局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。

      2、预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。

      3、管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

      多播的程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的,其选项值和含义参见11.5所示。

                                      表11.5 多播相关的选项

    getsockopt()/setsockopt()的选项

    含 义

    IP_MULTICAST_TTL

    设置多播组数据的TTL值

    IP_ADD_MEMBERSHIP

    在指定接口上加入组播组

    IP_DROP_MEMBERSHIP

    退出组播组

    IP_MULTICAST_IF

    获取默认接口或设置接口

    IP_MULTICAST_LOOP

    禁止组播数据回送

    3、多播程序设计的框架

    要进行多播的编程,需要遵从一定的编程框架。多播程序框架主要包含套接字初始化、设置多播超时时间、加入多播组、发送数据、接收数据以及从多播组中离开几个方面。其步骤如下:

    (1)建立一个socket。

    (2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。

    (3)加入多播组。

    (4)发送和接收数据。

    (5)从多播组离开。

    4、多播实现代码

    服务端代码:

    复制代码
    复制代码
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<sys/socket.h>
     4 #include<netdb.h>
     5 #include<sys/types.h>
     6 #include<arpa/inet.h>
     7 #include<netinet/in.h>
     8 #include<unistd.h>
     9 #include<stdlib.h>
    10 #include<string.h>
    11 #define MCAST_PORT 8888
    12 #define MCAST_ADDR "224.0.0.88"  // 多播地址
    13 #define MCAST_DATA "BROADCAST TEST DATA"  // 多播内容
    14 #define MCAST_INTERVAL 5  //多播时间间隔
    15 using namespace std;
    16 
    17 int main()
    18 {
    19         int sock;
    20         struct sockaddr_in mcast_addr;
    21         sock=socket(AF_INET,SOCK_DGRAM,0);
    22         if(sock==-1)
    23         {
    24                 cout<<"socket error"<<endl;
    25                 return -1;
    26         }
    27         memset(&mcast_addr,0,sizeof(mcast_addr));
    28         mcast_addr.sin_family=AF_INET;
    29         mcast_addr.sin_addr.s_addr=inet_addr(MCAST_ADDR);
    30         mcast_addr.sin_port=htons(MCAST_PORT);
    31         while(1)
    32         {       //向局部多播地址发送多播内容
    33                 int n=sendto(sock,MCAST_DATA,sizeof(MCAST_DATA),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr));
    34                 if(n<0)
    35                 {
    36                         cout<<"send error"<<endl;
    37                         return -2;
    38                 }
    39                 else
    40                 {
    41                         cout<<"send message is going ...."<<endl;
    42                 }
    43                 sleep(MCAST_INTERVAL);
    44 
    45         }
    46         return 0;
    47 }
    复制代码
    复制代码

    客户端代码:

    复制代码
    复制代码
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 #include<sys/types.h>
     6 #include<unistd.h>
     7 #include<sys/socket.h>
     8 #include<netdb.h>
     9 #include<arpa/inet.h>
    10 #include<netinet/in.h>
    11 #define MCAST_PORT 8888
    12 #define MCAST_ADDR "224.0.0.88" /*一个局部连接多播地址,路由器不进行转发*/
    13 #define MCAST_INTERVAL 5  //发送时间间隔
    14 #define BUFF_SIZE 256   //接收缓冲区大小
    15 using namespace std;
    16 int main()
    17 {
    18         int sock;
    19         struct sockaddr_in local_addr;
    20         int err=-1;
    21         sock=socket(AF_INET,SOCK_DGRAM,0);
    22         if(sock==-1)
    23         {
    24                 cout<<"sock error"<<endl;
    25                 return -1;
    26         }
    27         /*初始化地址*/
    28         local_addr.sin_family=AF_INET;
    29         local_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    30         local_addr.sin_port=htons(MCAST_PORT);
    31         /*绑定socket*/
    32         err=bind(sock,(struct sockaddr*)&local_addr,sizeof(local_addr));
    33         if(err<0)
    34         {
    35                 cout<<"bind error"<<endl;
    36                 return -2;
    37         }
    38         /*设置回环许可*/
    39         int loop=1;
    40         err=setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
    41         if(err<0)
    42         {
    43                 cout<<"set sock error"<<endl;
    44                 return -3;
    45         }
    46         struct ip_mreq mreq;/*加入广播组*/
    47         mreq.imr_multiaddr.s_addr=inet_addr(MCAST_ADDR);//广播地址
    48         mreq.imr_interface.s_addr=htonl(INADDR_ANY); //网络接口为默认
    49         /*将本机加入广播组*/
    50         err=setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
    51         if(err<0)
    52         {
    53                 cout<<"set sock error"<<endl;
    54                 return -4;
    55         }
    56         int times=0;
    57         socklen_t addr_len=0;
    58         char buff[BUFF_SIZE];
    59         int n=0;
    60         /*循环接受广播组的消息,5次后退出*/
    61         for(times=0;;times++)
    62         {
    63                 addr_len=sizeof(local_addr);
    64                 memset(buff,0,BUFF_SIZE);
    65                 n=recvfrom(sock,buff,BUFF_SIZE,0,(struct sockaddr*)&local_addr,&addr_len);
    66                 if(n==-1)
    67                 {
    68                         cout<<"recv error"<<endl;
    69                         return -5;
    70                 }
    71                 /*打印信息*/
    72                 printf("RECV %dst message from server : %s\n",times,buff);
    73                 sleep(MCAST_INTERVAL);
    74         }
    75         /*退出广播组*/
    76         err=setsockopt(sock,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq));
    77         close(sock);
    78         return 0;
    79 }
    复制代码
    复制代码

     关于此处bind函数的解析

      bind操作首先检查用户指定的端口是否可用,然后为socket的一些成员设置正确的值,并添加到哈希表myudp_hash中。然后,协议栈每次收到UDP数据,就会检查该数据报的源和目的地址,还有源和目的端口,在myudp_hash中找到匹配的socket,把该数据报放入该 socket的接收队列,以备用户读取。在这个程序中,bind操作把socket绑定到地址224.0.0.88:8888上, 该操作产生的直接结果就是,对于socket本身,下列值受影响:
        struct inet_sock{
            .rcv_saddr = 224.0.0.88;
            .saddr = 0.0.0.0;
            .sport = 8888;
            .daddr = 0.0.0.0;
            .dport = 0;
        }
        这五个数据表示,该套接字在发送数据包时,本地使用端口8888,本地可以使用任意一个网络设备接口,发往的目的地址不指定。在接收数据时,只接收发往IP地址224.0.0.88的端口为8888的数据。

    我的疑问???

    为什么要广播方和接受方的端口号相同才能收到广播?我试了在一台linux机子上开两个客户端其中一个和广播方的端口号不同,这个客户端结果收不到广播,哪位网友知道恳请告之。
        程序中,紧接着bind有一个setsockopt操作,它的作用是将socket加入一个组播组,因为socket要接收组播地址224.0.0.1的数据,它就必须加入该组播组。

    三、UDP广播与单播

    广播与单播的比较

      广播和单播的处理过程是不同的,单播的数据只是收发数据的特定主机进行处理,而广播的数据整个局域网都进行处理。

      例如在一个以太网上有3个主机,主机的配置如表11.4所示。

                                      表11.4 某局域网中主机的配置情况

    主 机

    A

    B

    C

    IP地址

    192.168.1.150

    192.168.1.151

    192.168.1.158

    MAC地址

    00:00:00:00:00:01

    00:00:00:00:00:02

    00:00:00:00:00:03

      单播流程:主机A向主机B发送UDP数据报,发送的目的IP为192.168.1.151,端口为 80,目的MAC地址为00:00:00:00:00:02。此数据经过UDP层、IP层,到达数据链路层,数据在整个以太网上传播,在此层中其他主机会 判断目的MAC地址。主机C的MAC地址为00:00:00:00:00:03,与目的MAC地址00:00:00:00:00:02不匹配,数据链路层 不会进行处理,直接丢弃此数据。

      主机B的MAC地址为00:00:00:00:00:02,与目的MAC地址00:00:00:00:00:02一致,此数据会经过IP层、UDP层,到达接收数据的应用程序。

      广播的流程:主机A向整个网络发送广播数据,发送的目的IP为192.168.1.255,端口为 80,目的MAC地址为FF:FF:FF:FF:FF:FF。此数据经过UDP层、IP层,到达数据链路层,数据在整个以太网上传播,在此层中其他主机会 判断目的MAC地址。由于目的MAC地址为FF:FF:FF:FF:FF:FF,主机C和主机B会忽略MAC地址的比较(当然,如果协议栈不支持广播,则 仍然比较MAC地址),处理接收到的数据。

      主机B和主机C的处理过程一致,此数据会经过IP层、UDP层,到达接收数据的应用程序。


    本文转自:http://www.cnblogs.com/lidabo/p/5865045.html

    展开全文
  • 单播广播、多

    2017-03-20 15:30:33
    单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就...
  • 单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? ... ...1.单播:网络节点之间的通信...
  • 单播、多播和广播

    千次阅读 2019-09-02 11:20:10
    单播、多播和广播 单播:信息的接受传递只在两个节点之间进行,点对点通信。网络上绝大部分数据是以单播的形式传输的,例如在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是...
  • 什么是单播、多播和广播   “单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?且听下文分解。 ...
  • 单播、多播和广播的区别

    千次阅读 2013-05-21 16:00:15
    单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就好像是人们之间的...
  • 当前的网络中有三种通讯模式:单播广播、组(多),其中的组出现时间最晚但同时具备单播和广播的优点,最具有发展前景。 一、单播(Unicast) 主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只...
  • 单播、多(组和广播的区别

    千次阅读 2019-01-17 16:17:42
    单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就好像...
  • 单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就...
  • 单播广播域多区别及IP范围

    千次阅读 2014-03-17 09:33:01
    单播、多播和广播单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就...
  •  IP有三种地址:单播地址, 广播地址,多地址。  广播和仅应用于UDP。  每个以太网帧包含源主机目的主机的以太网地址。通常每个以太网帧发往单个目的主机,目的地址指明单个接收接口,因而称为单播。 ...
  • 单播、多播和广播经典详解

    万次阅读 多人点赞 2014-01-09 10:02:00
    1 什么是单播、多播和广播  “单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?且听下文分解。 ...
  • 二、单播、多广播1.1单播1.1.1概念主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。每个以太网帧仅发往单个目的主机,目的地址指明单个接收接口,任意两个主机的通信不会干扰网内...
  • 转载至博客园博主Boblim的《多(组)、单播、任播和广播》,网址:https://www.cnblogs.com/fnlingnzb-learner/p/10490202.html 博客园博主的《MAC 地址(单播、组广播地址分类)》,网址:...
  • 单播,组播和广播

    2014-08-19 23:30:34
    单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来 描述就是 “ 单播 ” ,此时信息的接收传递只在两个节点之间进行。单播在网络中得到了广泛的应用...
  • 什么是单播、多播和广播br

    万次阅读 2011-10-11 16:22:03
    什么是单播、多播和广播  “单播”(Unicast)、“多”(Multicast)广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?且听下文分解。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,437
精华内容 5,774
关键字:

交换机单播和广播的过程