基于局域网的多播通信系统的设计
吴应桦 郭胜国
摘要:由于管理和日常工作的需要,网络管理员经常需要发送某条消息或者信号给一组用户,将满足某种条件的用户编为一组,假如每个用户单独的发送,虽然可行,但是操作相对过于繁琐,并且也会出现一些漏发重发的情况。所以多播技术(也称之为多播技术)也就应运而生,专门为了更加有效的应对这种多重发送的情况,是_种基于IP层的通信技术。多播是一种在一个发送者和多个接收者之间进行通信的方法。与任播(anycast)和单播(unicast)一起,多播也是一种IPv6的包传送方式。多播在CDPD技术中的无线数据网络中也可以使用。文章采用多播技术,不但可以一次将通信信息传送给多人,还可有效减轻网络通信的负担,避免资源的浪费,弥补了广播通信的不足。
关键词:多播;广播;套接字
1.设计原理
IP多播技术,其实是一种可以让若干台主机,一次性的同时发送数据包到多台主机的一个基于TCP/IP协议的网络技术。而多播通信作为一种一对多的通信方式,在节约网络带宽方面效果明显,行之有效。现在的网络环境中,音频和视频已经占据了相当的地位,虽然现在的带宽比几年前有了长足的进步,但是在应对一个信号发送点,若干个信号接收点的时候,之前的重复点对点通信以及广播的方式,都会严重的浪费带宽资源,所以通常情况下,多播通信是一种很合适的选择。多播的作用是能够把一个或者多个多播源的数据包发送给某个多播组,而只有满足某个条件的主机才能够被加入这个分组,当然条件的设置也是可以由发射端来控制或者提前预置。
IP多播技术的依托则是IP地址,在IPv4的体系中是一个D类的IP地址,由预留多播地址,局部链接多播地址和管理权限多播地址3部分构成,范围是从224.0.0.0239.255.255.255如表1所示。
上述的,则是根据相同的IP多播地址来分类的,所有的相同的IP多播地址的主机一起构成了一个主机组,也可以称之为多播组。并且多播组中的主机的数量是动态的,随着具体情况的不同而变化的,任意一台主机无论地理位置和现有的多播组中的主机的数量的多少有什么分别,只要满足条件都可以随时加入该多播组,并且也可以随时离开,并且一台主机还可以分属于若干个不同的主机组,具有很强的灵活性。
下面具体区别下广播和多播的方式的异同点,首先广播是把数据无差别的发送到某个网段或者网络的每一个地址,不管对方需要不需要这些数据,所以对网络带宽资源的消耗相对较高。而和广播不同的是,多播则是针对性的发送到需要这些数据的地址中,如果需要接收到多播的数据包,则需要加入一个多播组才可以实现。在这里因为自己本身也是多播组中的一员,所以也会同样收到一份自己所发送的多播的数据包,用这个功能也可以实现一些其他的操作,同样这个功能也是广播方式所不具备的。
2.实现方法
在TCP/IP协议中,采用D类地址来支持多播技术,所以一共有28位可以用来分组作为标记,28位则可以同时支持做多大约25亿个多播组,所以在用量环节不用担心没有地址用来分组或者不够用来分组。所以当一个进程通过一个D类地址来发送多播的数据包的时候,则会尽最大努力的将其发送到,但是不保证送到。通过这个能够看得出来这个传输模式数据包是类似于UDP的不可靠协议,而不是TCP的可靠协议。当这些地址全部加入多播组之后,源主机发送的任何数据都会完全的复制出来一份,发送给组内包括原始源节点在内的所有地址。D类地址的IP范围在244.0.0.0-239.255.255.255。分为永久地址和临时地址2类,其中永久地址主要保留下来以作为特殊用途,比如244.0.0.0没有使用,244.0.0.1代表子网内所有主机,244.0.0.2则代表了所有的路由器。而临时主机在使用前要先创建一个多播组,通过进程来控制主机加入或者退出某一个组,而每一个主机都要实时的记录其进程所归属的组。
多播是由多播路由器实现,普通路由器也可以经过设置而具备多播路由器的功能。多播路由器则发送信息给位于子网上的主机,而主机则向多播路由器回复报告进程在当前所述的分组,而各个主机则把相关的D类地址返回。这里面使用到了IGMP协议,一种类似于ICMP,一种格式相对简单只有询问和相应的2种分组功能的协议。
3.设计方法和步骤
3.1初始化winsock资源并创建套接字
在使用windows的套接字之前,必须首先初始化windows sockets DLL,这里通过调用WSAStartuo()函数来实现,可以让应用程序制定API要求的版本。可以随时根据情况需要加入所需要加入的多播组,而且发送数据方式还是多方面的,并且创建的套接字还具有重叠性。
3.2设置多播套接字的模式
对于WSAIoct1()的函数来说,命令码SIO MULTICASTLOOP的作用是用来开启或者禁止多播消息发送时候产生的通信数据数量能否在同一个套接字上收到回执。并且在最初的windows的版本中,就是win2000之前的版本,都是默认允许多播返回,并且不能取消禁止;而在win2000之后的版本中,才可以设置禁止功能多播返回。
多播传播的范围是通过WSAloctl()函数中的s10MULTICAST SCOPE来设置实现的,也就是所谓的生存时间TTL。TTL的工作原理是这样的,TTL有一个初始值存在于数据包中,每次多播路由器转发一次该数据包时,TTL则执行n=rrl操作,然后再次进行多播发送,而一旦当该数据包中的TTL数值减少到0的时候,则不再对该数据包进行传递。所以由此可知,例如TTL的数值如果为0,则只能在本地主机上传播,甚至无法发送出去;而TTL的如果数值为1的话,则只能传递到第一个路由器,不能传递出本地网络之外。
3.3加入一个多播组并向多播组发送数据
函数WSAJoinLeaf()的功能是在加入_个多播组的同时并指定特定的主机来作为发送或者接受。在调用该参数时,dwFlags则指定一个套接字JL SENDERONLY或者儿RECEIVER-ONLY,分别是发送和接受,或者是JL-BOTH,该选项表示两者功能兼具。函数调用之后则有一个返回值,然后再调用closesocket()来关闭并且离开该多播组。
调用sendto()函数,可在指定的UDP套接字上向指定的多播组发送多播数据。调用时,参数to应指向多播组的IP地址。值得注意的是,若一个应用程序只是打算给多播组发送数据,便不必加入一个多播组。
3.4从多播组接收数据随后关闭并释放资源
函数reevfrom()的功能很简单,在多播通信结束后,则调用closesocket()来关闭整个套接字体系,然后释放资源。
4.结语
多播作为一种行之有效的节约网络带宽的一对多的通信方式,在现在的网络中有着广泛的使用。在网络中需要将节点信号发送到到多个节点的情况下,重复点对点和广播方式都会浪费带宽,所以多播有了广阔的适用范围。