单播、多播和广播
- 单播:信息的接受和传递只在两个节点之间进行,点对点通信。网络上绝大部分数据是以单播的形式传输的,例如在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。
- 多播:也可以称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。网上视频会议、视频点播比较时候使用多播。因为如果用单播,逐个节点传输,有多少个目标节点就会有多少次传送过程,这样显然效率极低,是不可取的;如果采用不区分目标,全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。**采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。**IP网络的多播一般通过多播IP来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:
- 局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
- 预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
- 管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
- 广播:“广播”在网络中应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。广播用于一个主机对整个子网上所有主机进行通信,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。例如一个会长所有人都用麦克风发言就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一个会场内传播一样。因此在大中型局域网中,一般进行子网划分,以达到隔离广播风暴的目的。在IP网络中,广播地址用IP地地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。
只有UDP套接字允许广播或多播。
单播的优点:
- 服务器及时响应客户机的请求
- 服务器针对每个客户不同的请求发送不同的数据,容易实现个性化服务。
单播的缺点:
- 服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。
广播的优点:
- 网络设备简单,维护简单,布网成本低廉
- 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
广播的缺点:
- 无法针对每个客户的要求和时间及时提供个性化服务。
- 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
- 广播禁止在Internet宽带网上传输。
组播的优点:
- 具有同种业务的主机加入同一数据流,共享同一通道,节省了带宽和服务器的负载,具有广播的优点而又没有广播所需要的带宽。
- 服务器的总带宽不受客户端带宽的限制。由于组播协议由接收者的需求来确定是否进行数据流的转发,所以服务器端的带宽是常量,与客户端的数量无关。
- 与单播一样,多播是允许在广域网即Internet上进行传输的,而广播仅仅在同一局域网上才能进行。
组播的缺点:
- 多播与单播相比没有纠错机制,当发生错误的时候难以弥补,但是可以在应用层来实现此种功能。
- 现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。
多播的程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的,其选项值和含义参见下表所示。
**getsockopt()/setsockopt()**的选项 |
含义 |
IP_MULTICAST_TTL |
设置多播组数据的TTL值 |
IP_ADD_MEMBERSHIP |
在指定接口上加入组播组 |
IP_DROP_MEMBERSHIP |
退出组播组 |
IP_MULTICAST_IF |
获取默认接口或设置接口 |
IP_MULTICAST_LOOP |
禁止组播数据回送 |
在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,每当有路由器转发该报文时,TTL减1,知道减为0时,生命周期结束,报文即时没有到达目的地,也立即宣布死亡。当然在Java中,ttl并不是十分准确的,曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。
## 多播程序设计的框架
要进行多播的编程,需要遵从一定的编程框架。多播程序框架主要包含套接字初始化、设置多播超时时间、加入多播组、发送数据、接收数据以及从多播组中离开几个方面。其步骤如下:
- 建立一个socket。
- 然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。
- 加入多播组。
- 发送和接收数据。
- 从多播组离开。