第 14 章 多播与广播
14.1 多播
多播(Multicast)方式的数据传输是基于 UDP 完成的。因此,与 UDP 服务器端/客户端的实现方式非常接近。区别在于,UDP 数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机。换言之,采用多播方式时,可以同时向多个主机传递数据。
14.1.1 多播的数据传输方式及流量方面的优点
多播的数据传输特点可整理如下。
- 多播服务器端针对特定多播组,只发送 1 次数据。
- 即使只发送 1 次数据,但该组内的所有客户端都会接收数据
- 多播组数可在 IP 地址范围内任意增加
- 加入特定组即可接收发往该多播组的数据
多播组是 D 类 IP 地址(224.0.0.0 - 239.255.255.255),『加入多播组』可以理解为通过程序完成如下声明:
在 D 类 IP 地址中,我希望接收发往目标 239.234.218.234 的多播数据。
多播是基于 UDP 完成的,也就是说,多播数据包的格式与 UDP 数据包相同。只是与一般的 UDP 数据包不同,向网络传递 1 个多播数据包时,路由器将复制该数据包并传递到多个主机。像这样,多播需要借助路由器完成。
通过 TCP 或 UDP 向 1000个主机发送文件,则需要传递 1000 次。但此时若使用多播方式传输文件,则只需发送 1 次。这时由 1000 台主机构成的网络中的路由器负责复制文件并传递到主机。就因为这种特性,多播主要用于『多媒体数据的实时传输』。
不少路由器不支持多播,为了在不支持多播的路由器中完成多播通信,也会使用隧道技术(不需要程序开发人员考虑的问题)。我们只讨论支持多播服务的环境下的编程方法。
14.1.2 路由(Routing)和 TLL(Time to Live,生存时间),以及加入组的方法
为了传递多播数据包,必须设置 TTL。TTL 是 Time to Live 的简写,是决定『数据包传递距离』的主要因素。TTL 用整数表示,并且每经过 1 个路由器就减 1。TTL 变为 0 时,该数据包就无法再被传递,只能销毁。因此,TTL 的值设置过大将影响网络流量。当然,设置过小也会无法传递到目标。
接下来给出 TTL 设置方法。程序中的 TTL 设置是通过第 9 章的套接字可选项完成的。与设置 TTL 相关的协议层为 IPPROTO_IP,选项名为 IP_MULTICAST_TTL。因此,可以用如下代码把 TTL 设置为 64。
int send_sock;
int time_live = 64;
...
send_sock=socket(PF_INET,SOCK_DGRAM,