编程接口指南

发送 IPv4 多点传送数据报

要发送多点传送数据报,请在 224.0.0.0 到 239.255.255.255 的范围中指定一个 IP 多点传送地址作为 sendto(3SOCKET) 调用的目标地址。

缺省情况下,发送 IP 多点传送数据报时其生存时间 (time-to-live, TTL) 值为 1。此值可以阻止将数据报转发到单个子网之外。使用套接字选项 IP_MULTICAST_TTL,可以将后续多点传送数据报的 TTL 设置为 0 到 255 之间的任何值。此功能用于控制多点传送的范围。

    u_char ttl;

    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,sizeof(ttl))

TTL 为 0 的多点传送数据报不能在任何子网中传输,但是在发送主机属于目标组并且发送套接字上未禁用多点传送回送的情况下可以进行本地传送。 如果有一个或多个多点传送路由器连接到第一跃点子网,则 TTL 大于 1 的多点传送数据报可以传送到多个子网。 为了提供有意义的范围控制,多点传送路由器应支持 TTL 阈值概念。这些阈值会阻止低于特定 TTL 值的数据报遍历某些子网。 这些阈值将针对具有以下初始 TTL 值的多点传送数据报强制实施相应约定:

0

限定在同一主机

1

限定在同一子网

32

限定在同一站点

64

限定在同一地区

128

限定在同一洲

255

范围不受限制

站点和地区并未严格定义,站点可以根据实际情况再分为更小的管理单元。

应用程序可以选择以上列出的 TTL 值以外的初始 TTL 值。例如,应用程序可以通过发送多点传送查询来对网络资源执行扩展环搜索,即第一个 TTL 值为 0,然后逐渐增大 TTL 的值,直到收到回复为止。

多点传送路由器不转发任何目标地址在 224.0.0.0 与 224.0.0.255(包括 224.0.0.0 和 224.0.0.255)范围之间的多点传送数据报,而不管其 TTL 值是多少。 此地址范围是为使用路由协议以及其他低级拓扑搜索或维护协议(如网关搜索和组成员关系报告)而保留的。

即使主机拥有多个具有多点传送功能的接口,每个多点传送传输也是通过单个网络接口发送的。 如果主机还用作多点传送路由器且 TTL 值大于 1,则多点传送可以转发到源接口之外的接口。 套接字选项可以覆盖来自给定套接字的后续传输的缺省设置:

    struct in_addr addr;

    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr))

其中,addr 是所需传出接口的本地 IP 地址。通过指定地址 INADDR_ANY 恢复到缺省接口。使用 SIOCGIFCONF ioctl 获取接口的本地 IP 地址。 要确定接口是否支持多点传送,请使用 SIOCGIFFLAGS ioctl 提取接口标志并测试是否设置了 IFF_MULTICAST 标志。此选项主要用于多点传送路由器以及其他专门针对 Internet 拓扑的系统服务。

如果将多点传送数据报发送到发送主机本身所属的组,则缺省情况下,本地传送的 IP 层将回送此数据报的副本。 另一套接字选项可为发送主机提供针对是否回送后续数据报的显式控制:

    u_char loop;

    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop))  

其中,loop 为 0 即为禁用回送,为 1 即为启用回送。此选项通过消除因接收应用程序自己的传输内容而产生的开销,可提高单台主机上只有一个实例的应用程序的性能。对于可以在一台主机上具有多个实例或者其发送主机不属于目标组的应用程序,不应使用此选项。

如果发送主机属于其他接口的目标组,则发送初始 TTL 值大于 1 的多点传送数据报可以传送到其他接口上的发送主机。 回送控制选项不会影响此类传送。