私はIPv6 UDPマルチキャストアドレスをテストするためにFedoraでnetcatを使用しています。コマンドは
echo hi | nc -6 -u ff02::777:777:777 7777
netcatは「引数が無効です」と応答します。
実行中のトレース結果
connect(3, {sa_family=AF_INET6, sin6_port=htons(7777), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "ff02::777:777:777", &sin6_addr), sin6_scope_id=0}, 28) = -1 EINVAL
IPv6なしで同様のコマンドを実行します。
echo hi | nc -u 192.168.255.255 7777
素晴らしい作品。
答え1
予備の説明:IPv4ネットワークは192.168.0.0/16に設定されていませんが、192.168.0.0/24または他の/ 24の範囲に設定されている可能性があります。したがって、192.168.255.255はブロードキャストではなく、そうでなければecho hi | nc -u 192.168.255.255 7777
失敗します。 IPv6ではサポートされておらず、IPv4でのみサポートされているブロードキャストの場合、アプリケーションはSO_BROADCAST
ソケットオプションを使用する必要があります。これは-b
netcatオプションによって達成されます。実際、ネットワーク192.168.0.0/24(/16ではない)にあると仮定すると、次のようになります。
nc -b -u 192.168.0.255 7777
ブロードキャストはマルチキャストではありません。
この問題について。フルレンジff02::/16
はローカルリンクマルチキャスト範囲。この範囲の場合、アドレスはインターフェイスが接続されている場合にのみ完全です。協会- ローカル範囲)。この範囲の有効なアドレスは、ff02::777:777:777
LANインターフェイスが呼び出されると仮定したときeth0
にff02::777:777:777%eth0
定義されているとおりに有効なアドレスにすることはできません。RFC 4007:
nc -6 -u ff02::777:777:777%eth0 7777
nc
これは、コマンド自体ではなくライブラリによって自動的に処理される可能性があります。インターフェイスが不要な範囲を使用すると、インターフェイスはアドレスの一部ではないため、通常失敗します。
このインターフェースを必要としない場合は、リンクローカル(またはノードローカル)の範囲を使用しないでください。 site-local:ff05に切り替えると、インターフェイスを指定せずに機能します。
nc -6 -u ff05::777:777:777 7777
Linuxでは、次のコマンドを使用してこれら2つのコマンドの違いを確認できますss
。
$ ss -aun dport == 7777
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 [2001:db8:900d:cafe:0:1:2:3]:58092 [ff05::777:777:777]:7777
ESTAB 0 0 [fe80::8c5f:87ff:fe50:d08a]%eth0:60937 [ff02::777:777:777]:7777
ここにグローバルアドレスがありますイーサネット0リンクローカルスコープではなく、そのアドレスがソースとして選択されます。リンク - ローカル範囲アドレスの場合、ソケットはインターフェイスにバインドされます。 Linuxの場合、IPV6_MULTICAST_IF
転送時(使用しない場合)のインターフェース選択に関する追加の考慮事項については、このQ / Aを参照してください。基本的なIPv6インターフェイスを設定する方法
最後の注意:次に切り替えることを検討する必要があります。ソカット比率があるインターネット猫、含むマルチキャストグループに参加IPv4の場合。 IPv6をサポートしているがIPv6マルチキャストを直接サポートするわけではありませんが、setsockopt(2)
IPv6マルチキャスト処理を含むサポートされていない機能を実装するためにランダムコールを使用できます。それでもこれより良いです。インターネット猫古いトラフィックからのマルチキャストトラフィックの受信をサポートしていません。インターネット猫注文する。
だからソカットこれは、少なくともamd64(x86_64)アーキテクチャを使用するLinuxで動作し、他の* nixでも動作できる例です。可能であれば、以下の値20と対応する置換(IPV6_ADD_MEMBERSHIP
/ IPV6_JOIN_GROUP
)を変更し、元のsetsockopt(2)
オプションを使用してインターフェイスを有効にしてから可能です。インデックス2(次の最初のインターフェイス)ルオ)、まず送信者インターネット猫注文する:
socat udp6-recv:7777,setsockopt-listen=41:20:xff020000000000000000077707770777i2 -
このオプションは以下を使用してデコードされますstrace
。
setsockopt(5, SOL_IPV6, IPV6_ADD_MEMBERSHIP, {inet_pton(AF_INET6, "ff02::777:777:777", &ipv6mr_multiaddr), ipv6mr_interface=if_nametoindex("eth0")}, 20) = 0
ここでは、いわゆる「dalan」形式を使用して任意のソケットオプションを渡します。ipv6_mreq構造:IPv6アドレス(x
16進値の場合は16バイトのIPv6アドレス)、その後にインターフェイスインデックス(i
整数)が続きます。