マルチキャストの基礎の基礎をRustで学ぶ
以下をやってみるだけのスレ
まずは、マルチキャストとは何かの解説から
IPでは4つのパケットの送信形式がある
- ユニキャスト:1 to 1 のパケット送信 (TCP, UDP)
- 1 to 1だからと言って、送信中のセキュリティを保証するものではない
- TLSやDLTS (UDPのためのTLS) を使う必要はある
- ブロードキャスト:多 to 多のパケット送信 (UDP)
- ネットワーク内の最後のアドレスを使って送信するプロトコル
- 例) 198.51.100/24 の場合 198.51.100.255
- IPv4 でしか利用することができない
- ネットワーク内の最後のアドレスを使って送信するプロトコル
- エニーキャスト:1 to 多 のパケット送信 (TCP*, UDP)
- DNSなどの地理的にサーバーを分散させたい時などに利用する
- TCPでも可能だが、技術的には非常に難しい
- マルチキャスト:多 to 多のパケット送信 (UDP, *RTP)
- ブロードキャストは、既存のあるサブネット内のすべてのホストに送信する
- マルチキャストは、アドレスに紐づいた全ホストにパケットを受信する
- RTP (real time protocol)
- 主に音声や映像の配信のためにUDP上に実装された新しいプロトコル
- WebRTCが主な使用例
マルチキャストの使い所としては、同じデータを多くの宛先に配信する必要がある場合とのこと。
Trust DNS
コードの書き方が基本的に古いので、コードは Mutex や once_cell を使って書き直してみる
IPv4 の 0.0.0.0
は、ローカルマシーン上のすべてのIPアドレスのことを指す。仕様としては、0.0.0.0
の宛先は使えない (無効)なものであるが、OSが気を効かせて 127.0.0.1
にルーティングさせている
join_multicast_v4, set_multicast_if_v4 などの interface がしっくりきてなかったけど、multicast のグループに所属させる Network Interface (IPアドレス) のことか。要は、multicast でパケットを受け取りたいホストのIPアドレスを登録するイメージで理解した。
That output claims that for our test address FF02::123 we have three routes defined, so we should have a route. Please send me feedback if you see an obvious problem with my methods here, and have a solution. In any case, a workaround is to use ifconfig -v to get the index of the interface you want to use for IPv6. Then you can add this flag specific for multicast delivery:
IPv6 で使いたいインターフェイスを ifconfig -v
で探してという話なんだけど、探し方がわからない
あー、 IPv6のアドレスを持っているインターフェイス (つまり IPv6 でインターネットに接続しているインターフェイス) の index を探せばいいのか。inet6
と inet
の値がそれっぽい index を set_multicast_if_v6
に渡したらテストが通った