Linux IPv4スタックでUDPマルチキャストリスニングソケットがユニキャストパケットを受信できますか?または、UDPユニキャストソケットはマルチキャストパケットを受信できますか?

Linux IPv4スタックでUDPマルチキャストリスニングソケットがユニキャストパケットを受信できますか?または、UDPユニキャストソケットはマルチキャストパケットを受信できますか?

私が理解したように、ソケットがローカルアドレスにバインドされていない(またはバインドされているINADDR_ANY)場合、リモートアドレス/ポート設定を呼び出さないconnect()

  1. インターフェイスが1つのコンピュータでは、デフォルトのIPアドレスはIP_ADDRです。
  2. ソケットAはUDPマルチキャストアドレスMULTICAST_IP_Aを受信し、ポート番号はPORT_Aです。
  3. ソケットBはPORT_BからUDPユニキャストを受信します。

それでは、次の文は正しいですか?

  1. グループアドレスMULTICAST_IP_A(ポート番号PORT_B)に送信されたマルチキャストパケットはソケットBに転送されます。
  2. IP_ADDR:PORT_Aに送信されたユニキャストパケットはソケットAに転送されます。

LinuxのIPv4ソースコードを見てみると、これまでに上記の2つのシナリオが発生しているようです。たとえば、次のようになります。__udp_is_mcast_sock()true空でも返されますinet->mc_listinet_create()inet->mc_allしかし、私は専門家で1はなく、誰かがこれらの主張を確認/無効化し、いくつかのコードポインタを提供することを聞きたいと思います。ありがとうございます!

ベストアンサー1

ローカルアドレスがマルチキャストでない場合、udp_is_mcast_sock()はfalseを返します(参照)。ip_mc_sf_allow)。

両方の質問についてこの記事が役に立つかもしれません。マルチキャスト(UDP)ソケットをバインドすることはどういう意味ですか?

ケース1の場合。

  • マルチキャストパケットはグループアドレスMULTICAST_IP_Aに送信され、ポート番号はPORT_Bです。〜しないだろうソケットBに送信

ケース2の場合。

  • IP_ADDR:PORT_Aに送信されたユニキャストパケット〜するソケットAに渡されます。 UDPマルチキャストソケットは0.0.0.0にバインドされています。これがまさにその理由です。netstat -aunすでにポート5353(avahi / mdns)にサーバーがある可能性がありますが、サーバーを起動して確認できます。

Pythonマルチキャストクライアント/サーバープログラムを使用して、このケースとは異なるケースを確認できます。この投稿。ユニキャストクライアント/サーバーの動作をシミュレートするには、nc(netcat)を使用できます。

おすすめ記事