こんにちは!
AIの登場により「低レイヤー技術をしっかり学び直さないといけない!」と焦り散らかしているものです。
ただいま絶賛、5年前くらいに買って放置していた「マスタリングTCP/IP 入門編」を読み直しております。
かなり自己満な内容ですが、どなたかの役にたってくれたら幸いです。
IPマルチキャストとは
CCNAとかで勉強したような気がしてましたが、すっかりIPマルチキャストという概念を忘れていました。
IPマルチキャストとは複数のホストとの通信を効率的に行うための通信手法です。複数のホストとの通信を実現する手法には、ブロードキャストがあります。ただしブロードキャストは同一ネットワーク上の全てのホストと通信するためのものであり、また異なるネットワークを跨ぐことができません。(異なるネットワークへブロードキャストするダイレクトブロードキャストという仕組みがあるのですが、セキュリティの関係で基本的には許可されないようになっています)
IPマルチキャストにより、同一ネットワークおよび異なるネットワークにいる複数のホストに対して通信を行えるようになります。
ここではIPマルチキャストアドレスというアドレス群が利用されます。
224.0.0.0から239.255.255.255までがIPマルチキャストアドレスです。
すでに用途が決められている代表的なマルチキャストアドレスがあり、例として以下のマルチキャストアドレスがあります。
| アドレス | 内容 |
|---|---|
| 224.0.0.1 | サブネット内のすべてのホスト |
| 224.0.0.2 | サブネット内のすべてのルーター |
| 224.0.0.5 | OSPFルーター |
| 224.0.0.9 | RIP2ルーター |
| 224.0.0.10 | EIGRPルーター |
224.0.0.1は実質同一ネットワーク内でのブロードキャストと同じですが、全てのホストにおいて利用されるアドレスです。224.0.0.1宛に送信されたパケットは同じネットワークの同一ホスト内に送信されます。
ちなみに「224.0.0.0~224.0.0.255」の範囲のアドレスは「リンクローカルマルチキャストアドレス」と呼ばれます。この範囲のアドレス宛のパケットは、「ルーターを越えて転送してはならない」というルールが定められています(TTLが1に設定されている)。
あれ?じゃあifconfigとかすれば224.0.0.1ってアドレスが表示されるはずでは?
と短絡的に考えてしまった人は私だけではないはず。
気になってすぐにmacのターミナルでifconfigを実行しましたが、224.0.0.1のアドレスなんて表示されません。(ifconfigの結果を載せるまでもない)
なんでifconfigに表示されないの?
結論から言うと224.0.0.1は端末に割り当てられているものではないからです。
ifconfig が表示するもの
ifconfig(windowsならipconfig)では、そのネットワークインターフェースに恒久的に(またはDHCPによって一時的に)割り当てられたアドレス(すなわち端末固有のユニキャストアドレス)を表示します。
224.0.0.1は端末に割り当てられるユニキャストアドレスではありません。割り当てられているのではなく、IPネットワークに参加するすべてのノードは、「224.0.0.1というチャンネルをListenする」ように、OSのネットワーク機能(TCP/IPスタック)が標準でプログラムされているのです。
つまり、端末は224.0.0.1宛のパケットを受信する準備はしていますが、224.0.0.1を自らのIPアドレスとして名乗っているわけではないのです。
これがifconfigで表示されない理由となります。
(結局私はifconfigコマンドについてもちゃんと理解してなかったということです。。。)
リッスンマルチキャストアドレスを確認する方法
macではnetstat -gコマンドで確認できます。
❯ netstat -g
IPv4 Multicast Group Memberships
Group Link-layer Address Netif
224.0.0.251 <none> lo0
224.0.0.1 <none> lo0
224.0.0.251 X:0:5e:1:1:fb en0
224.0.0.1 X:0:5e:1:1:1 en0
224.0.0.1 <none> utun0
224.0.0.251 <none> utun0
(MACアドレスはぼかしてます)
「マルチキャスト224.0.0.1」と「ブロードキャスト」の違い
先ほどマルチキャスト224.0.0.1とブロードキャストは等しいと言うような記述をしましたが、正確には以下のような違いがあります。
- ブロードキャスト: 「全員に無理やり送りつける」方式。スイッチは受信ポート以外の全ポートにパケットを転送する。
- マルチキャスト: 「聞きたい人だけ聞く(購読する)」方式。ホストはIGMPというプロトコルを使い、「私は224.0.0.1というグループの通信を聞きたいです」とルーターやスイッチに意思表示する。IGMPスヌーピング対応スイッチであれば、その意思表示をしたホストがいるポートにだけパケットを転送する。
最後に
まあ自己満です。
IPマルチキャストについても、ifconfigなどのコマンドについても理解が足りていませんでした。
AIの奴隷にならないためにも、低レイヤーの勉強頑張ります。