TCP-IP下的组播编程基础

上传人:ths****59 文档编号:45264145 上传时间:2018-06-15 格式:DOC 页数:13 大小:138KB
返回 下载 相关 举报
TCP-IP下的组播编程基础_第1页
第1页 / 共13页
TCP-IP下的组播编程基础_第2页
第2页 / 共13页
TCP-IP下的组播编程基础_第3页
第3页 / 共13页
TCP-IP下的组播编程基础_第4页
第4页 / 共13页
TCP-IP下的组播编程基础_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《TCP-IP下的组播编程基础》由会员分享,可在线阅读,更多相关《TCP-IP下的组播编程基础(13页珍藏版)》请在金锄头文库上搜索。

1、本文讨论基于 TCP/IP 下的组播编程基础。所有的例子都可以 Windows 下台运行。本文不会涉及到组播协议的实现,只是讨论组播编程需要的环境及 API 函数。关于组播的实现和需要的协议笔者将会另写文章讨论。 组播描述组播描述组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台 server 对应多台接收者的高效数据传送。对其形象的比喻就是类似于广播电台和电视台节目的发送。电台或电视台向特定频道发送他们的节目,而接收者可以根据自己的喜好选择频道来收听或收看节目。传统网络的通信方式单播(Unicast)在许多场合下并不合适,如果强行采于单

2、播方式只是会增加网络上传送的报文,还会影响 server 端的运行效率,如网络游戏,网络视频会议等。这些场合下由于接收者需要的是同样的数据,如果有个接收者,那么 server 就需要把这份数据做成 N 个报文分别发送给接收者,这样当接收者增多的情况下,server 端发送的报文也同样需要增多,server 端承受这样的通信量肯定有一个极值,当接收者到一定程度的时候,不单单是网络流量增大的问题了,server 面临的只有当机。组播在这种场合下就有了用武之地了。Server 端需要做的就是向特写的Group 发送一个报文,当网络的多个接收者对这个报文感兴趣的时候,他们可以自由复制得到这个报文。这样

3、的情况下,无论接收者增加多少人,Server 需要做的只是发送一个报文,而网络上传送的是只是一份报文。单播图例:多播图例:组播相关组播相关组播地址组播地址32 位的 IP 地址被分成了 A, B, C, D, E 五种类型,前三种是我们日常生活常见的,由一个权威部分统一分配。而类地址我们需要的多播地址,前三种地址我们可以形象的认为是一个点,而一个类多播地址可以认为是一个频道。这样对多播的理解可以形象一点。关于 IP 地址的图例就免了,请查阅相关 IP 分类的相关资料,只要记住多播地址是从 224.0.0.0239.255.255.255 就行了。224 开头的为保留地址,239 开头的为实验用

4、地址。这些地址不能随便使用,它们也是有权威部门(IANA)管理,类似于,的保留端口。常见多播保留地址 地址用途介绍224.0.0.1本网段所有的主机(All Hosts)RFC 1112, JBP 224.0.0.2相邻的所有的路由器(All Multicast Routers)JBP224.0.0.5传送 OSPF 协议用(OSPF Routers)RFC 1583, JXM1 224.0.0.6OSPF Designated RoutersRFC 1583, JXM1 224.0.0.9RIP2 RoutersRFC 1723, SM11 224.0.0.12 DHCP Server/Re

5、lay AgentRFC 1884 224.0.0.13 All PIM RoutersFarinacci实验实验:可在主机上执行 ping 224.0.0.1,看看有多少主机有回应。J IP 组播地址到链路层地址的转换组播地址到链路层地址的转换IP 多播地址的有效位为 28 位,是不是可以把这位都可以影射到链路层地址,如以太网,FDDI,Token ring(我们常见的为以太网地址,就是大部分计算机上的 Rj45 接口的网卡所拥有的地址)。以太网地址为 48 位,IANA组织把 00- 00- 5e 开始的地址分配了用于多播的地址,以太网多播地址的最高二位必须为 01,也就变成了 01- 0

6、0- 5e,以太网用于多播地址的范围也就变成了 01- 00 5e 00 00 - 00 到 01 00 5e ff ff ff。也就是剩下了 24 位地址,这 24 位最高位必须为,只剩下了 23 位(L 不知道为什么要这么麻烦)。问题出现了,IP 多播地址的 28 位有效位如何影射到以太网的 23 位 L,现在解决的方法是只影射 IP 多播地址的后 23 位,也就是 IP 剩下了 5 位不太影射,所以出现了多个 IP 多播地址(最多 32 个)影射一个以太网地址的情况。好像有点跑题了 L 组播主机需要的环境组播主机需要的环境如果要在一台主机上运行多播程序,这台主机支持 IGMP 协议。此协

7、议用于加入一个多播组,离开一个多播组等而向路由器发送命令。现在的 IGMP 协议最高版本为 v3(rfc3376),现在有很少数的实现了,WindowXp 己实现。大部分主机,路由器实现的版本为 v2(rfc2236),而 v1 版本(rfc1112)的运行是从 v2 中可以实现。V2 与 v1 的区别就是把 V版本中的位版本字段跟位操作类型字段合并成了位操作类型,在中不用使用的位字段在中被称之为最大响应时间。用写的 IGMP 结构即为:struct igmpu_char igmp_type;u_char igmp_code;u_char igmp_cksum;struct in_addr i

8、gmp_addr; 我记得第二个字段(Max Resp Time)在TCP/IP 详解卷 2中被写成了igmp_code,今天下午刚刚看的,不太清楚了,也不知道为什么起这么一个名字,明天再看看:) 可以看得出 IGMP 报文为定长的(个字节)。可能这是最简单的协议结构了(什么,也简单?再想想)。 组播需要的网络环境组播需要的网络环境如果主机想获得多播报文,相邻的路由器也必须支持 IGMP,如果想获得 Internet 上的多播报文,主机到 Server 的这个路径中所遇到的路由器必须全部支持 IGMP,路由器还必须支持源发现协议,如 MSDP,PIM_DM,PIM_SM 等。组播的等级组播的等

9、级Level 0 不支持 IP 多播Level 1 只支持向多播组发送数据而不能接收多播组的数据Level 2 IP 多播全支持对这三个等级的理解应该从 SOCKET 上。建立了一个 SOCKET 以后可以对它进行设置,看它需求什么。一般现在存在的网络程序就就是 Level0 了,因为它们不支持多播,如用于连接服务器获取网页内容的那个 SOCKET 就应该属于 Level0。一个演唱会现场网络直播,由于采用了多播,服务器要向一个多播组发送报文,因为他不需要获取接收者的报文,所以可以建立一个 SOCKET 只向特定的多播组发送数据就可以了,这个 SOCKET 应该就是 Level 1一个网络会议

10、的例子,由于会议是有多个人参加的,每个人都需要接收其它人的报文,所以建立了一个 SOCKET,首先把这个 SOCKET 加入到一个多播组,使其能接收多播组的数据,然后它也可以用这个 SOCKET 向自己加入的多播组发送自己的状态。这个 SOCKET 就应该是 Level 2 了 组播编程相关的组播编程相关的 socket 结构和函数结构和函数int setsockopt(SOCKET s, int level, int optname, const char FAR * optval, int optlen);int getsockopt(SOCKET s, int level, int op

11、tname, char FAR * optval, int FAR * optlen);level 必须为必须为 IPPROTO_IP。不要问为什么。这两个函数在组播干什么呢?获取系。不要问为什么。这两个函数在组播干什么呢?获取系统对组播的设置(如),加入一个多播组,离开一个多播组就用这两个函数的其中统对组播的设置(如),加入一个多播组,离开一个多播组就用这两个函数的其中一个,哪果你要问是哪个?就不要往下看了一个,哪果你要问是哪个?就不要往下看了 Loptname 就是在组播起到最主要作用的一个字段,与组播相关的可取值就是在组播起到最主要作用的一个字段,与组播相关的可取值可取值可取值setso

12、ckoptgetsockoptIP_MULTICAST_LOOP支持支持支持支持IP_MULTICAST_TTL支持支持支持支持IP_MULTICAST_IF支持支持支持支持IP_ADD_MEMBERSHIP支持支持不支持不支持IP_DROP_MEMBERSHIP支持支持不支持不支持1. IP_MULTICAST_LOOP当接收者加入到一个多播组以后,再向这个多播组发送数据,这个字段的设置是是当接收者加入到一个多播组以后,再向这个多播组发送数据,这个字段的设置是是否允许再返回到本身。否允许再返回到本身。2. IP_MULTICAST_TTL默认情况下,多播报文的被设置成了,也就是说到这个报文在

13、网络传送的默认情况下,多播报文的被设置成了,也就是说到这个报文在网络传送的时候,它只能在自己所在的网络传送,当要向外发送的时候,路由器把减时候,它只能在自己所在的网络传送,当要向外发送的时候,路由器把减以后以后变成了,这个报文就已经被变成了,这个报文就已经被 Discard 了。例了。例:char ttl;ttl = 2;setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)ttl, sizeof(ttl);3. IP_MULTICAST_IF发送多播报文时用的本地接口,默认情况下被设置成了本地接口的第一个地址。发送多播报文时用的本地接口,默认情

14、况下被设置成了本地接口的第一个地址。未完未完4. IP_ADD_MEMBERSHIP这个这个 option 和下面的和下面的 option 是实现多播必不可少的,它用于加入一个多播组,例:是实现多播必不可少的,它用于加入一个多播组,例:struct ip_mreq ipmr;ipmr.imr_interface.s_addr = htonl(INADDR_ANY);ipmr.imr_multiaddr.s_addr = inet_addr(“234.5.6.7“);setsockopt(s, IPPROTO_IP, IP_ADDR_MEMBERSHIP, (char*)5. IP_DROP_M

15、EMBERSHIP用于离开一个多播组,使用方法同用于离开一个多播组,使用方法同 IP_ADDR_MEMBERSHIP。struct ip_mreq ipmr;int len;setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)向一个特定的多播组发送数据向一个特定的多播组发送数据向多播组发送数据最简单了,多播只支持没有说吧?不知道在什么地方写向多播组发送数据最简单了,多播只支持没有说吧?不知道在什么地方写L,下一版改过来,下一版改过来 J,发送数据不需要先加入这个多播组。只是简单的把目的地址设成多播,发送数据不需要先加入这个多播组。只是简单的

16、把目的地址设成多播地址就可以了,如:地址就可以了,如:SOCKET s;SOCKADDR_IN multiaddr;s = socket(.);/*不需要不需要 bind*/*添充结构,向添充结构,向 234.5.6.7 多播组发送数据多播组发送数据*/.multiaddr.sin_addr.s_addr = inet_addr(“234.5.6.7”);./*发送发送 buf 就可以了就可以了*/sendto(s, buf, len, 0, 从一个多播组接收数据从一个多播组接收数据SOCKET s;SOCKADDR_IN multiaddr;s = socket(.);/*bind 的目的就是要指定一个本地接口

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号