ネットワークインタフェース

IPv4 マルチキャストデータグラムの送信

マルチキャストデータグラムを送信するには、sendto(3SOCKET) 呼び出しで宛先アドレスとして 224.0.0.0 〜 239.255.255.255 の範囲の IP マルチキャストアドレスを指定します。

デフォルトでは、IP マルチキャストデータグラムは存続期間 (TTL) 1 で送信されます。この場合、単一のサブネットワーク外にデータグラムが転送されることはありません。ソケットオプション IP_MULTICAST_TTL を指定すると、後続のマルチキャストデータグラムの TTL を 0 〜 255 の範囲の任意の値に設定してマルチキャストの配信範囲を制御できます。

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

TTL 0 のマルチキャストデータグラムはいかなるサブネット上でも伝送されませんが、送信ホストが宛先グループに属しており、かつ送信側ソケットでマルチキャストループバックが無効になっていない場合は、ローカルに配信できます (下記を参照)。最初の配信先となるサブネットに 1 つ以上のマルチキャストルーターが接続されている場合は、1 を超える TTL を持つマルチキャストデータグラムを複数のサブネットに配信できます。意味のある配信範囲制御を提供するため、マルチキャストルーターは TTL に「しきい値」の概念をサポートします。この概念は、一定の TTL 未満のデータグラムが特定のサブネットを越えることを防止します。マルチキャストデータグラムの初期 TTL と、それらに対してしきい値が強制する規則を次に示します。

同じホストに制限される 

同じサブネットに制限される 

32 

同じサイトに制限される 

64 

同じ地域に制限される 

128 

同じ大陸に制限される 

255 

配信範囲内で制限されない 

「サイト」と「地域」は厳密には定義されません。サイトは、ローカルな事柄として、小さな管理単位にさらに分割できます。

アプリケーションは、上記の TTL 以外に初期 TTL を選択できます。たとえば、アプリケーションは、TTL シーケンス 0、1、2、4、8、16、32 を使用し、TTL 0 から開始して応答が得られるまでより大きな TTL のマルチキャスト照会を送ることによってネットワークリソースの「拡張リング検索」が行えます。

マルチキャストルーターは、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 を指定します。インタフェースのローカル IP アドレスは、SIOCGIFCONF ioctl を使用して取得します。インタフェースがマルチキャストをサポートするかどうかを確認するには、SIOCGIFFLAGS ioctl を使用してインタフェースフラグを取り出し、IFF_MULTICAST フラグが設定されているかどうかをテストしてください。このオプションは、インターネットトポロジと明確な関係があるマルチキャストルーターなどのシステムサービスを主な対象としています。

(発信インタフェース上で) 送信ホスト自体が属しているグループにマルチキャストデータグラムが送信されると、ローカル配信の IP 層によってデータグラムのコピーがデフォルトでループバックされます。後続のデータグラムがループバックされるかどうかにかかわらず、別のソケットオプションが送信側に明示的な制御を与えます。

    u_char loop;
    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop))  
このコードの loop の値は、ループバックを無効にする場合は 0、ループバックを有効にする場合は 1 です。単一のホストにインスタンスを 1 つしか持たないアプリケーション (ルーターやメールデーモンなど) では、このオプションを使用するとアプリケーション自体の伝送を受信するオーバーヘッドが排除されるため、パフォーマンスが向上します。このオプションは、単一のホストに複数のインスタンスを持つアプリケーション (会議システムプログラムなど) や送信側が宛先グループに属さないアプリケーション (時間照会プログラムなど) には通常使用しないでください。

送信ホストが別のインタフェースの宛先グループに属している場合、1 を超える TTL で送信されたマルチキャストデータグラムは、他方のインタフェース上の送信ホストに配信できます。このような配信には、ループバック制御オプションは何の効果もありません。