Matter 03 · IPv6 の基礎 — Matter は IPv6 の上にしか存在しない

Chapter 03

IPv6 の基礎 — Matter は IPv6 の上にしか存在しない

この章がなぜ必要なのか——「機器が見つからない」の原因の多くはここにある.

Matter は IPv6 必須である。IPv4 は一切使わない。 これは設計上の妥協ではなく、明確な選択である。

そして開発現場で最も多いトラブルの 1 つが 「コミッショニングはできたのに、その後つながらない」—— その原因の大半は IPv6 のアドレス・ルーティング・マルチキャストにある。

この章では、Matter に必要な範囲に絞って IPv6 を整理する。 IPv6 に詳しい人も、マルチキャストと ULA の節だけは目を通してほしい。

この章で使う既出の用語(定義は各リンク先). Matter(01 章 3 節)、コミッショニング(01 章 3 節)、ネットワーク(01 章 3 節)、ローカル制御(01 章 2 節)、ACL(02 章 4 節)、IPv6(02 章 1 節)、リンク(02 章 1 節)

1. なぜ IPv6 なのか

理由内容
アドレスが枯渇しない家庭内に数百のセンサーがあっても NAT が要らない
NAT がない端末どうしが直接通信できる。ローカル制御の前提
リンクローカルが標準設定なしで同一リンク内の通信ができる
マルチキャストが標準機能mDNS による探索が素直に書ける(IPv4 のブロードキャストと違い階層化されている)
6LoWPAN との親和性Thread が IPv6 前提で設計されている
アドレス自動設定 (SLAAC)DHCP サーバなしでアドレスが決まる

決定的なのは NAT がないことである. IPv4 + NAT の世界では、家庭内の機器どうしが直接通信するのに UPnP や STUN のような回避策が必要だった。 IPv6 ではすべての機器がグローバルに一意なアドレスを持てるので、 「スマホから電球へ直接パケットを送る」が素直に書ける。 Matter のローカル制御は、この性質の上に成り立っている。

2. アドレスの形

2001:0db8:0000:0000:0000:8a2e:0370:7334
└──────────┬──────────┘└──────────┬─────┘
      ネットワーク部            インタフェース ID
      (通常 64 bit)             (通常 64 bit)

128 bit を 16 bit ずつ 8 グループに区切り、16 進で書く。省略規則:

規則例
各グループの先頭 0 は省略0db8 → db8
連続する 0 グループを :: に(1 回だけ)2001:db8:0:0:0:0:0:1 → 2001:db8::1

3. アドレスの種類 — ここを取り違えると詰まる

Matter の開発では、同じ機器が複数の IPv6 アドレスを同時に持つのが普通である。 どれを使うべきかを知らないと、通信できない。

種類プレフィックス到達範囲Matter での用途
リンクローカル (LLA)fe80::/10同一リンク内のみ近隣探索、同一リンク内の通信
ユニークローカル (ULA)fc00::/7(実質 fd00::/8)サイト内(家庭内)Matter の主戦場
グローバル (GUA)2000::/3インターネット全体ISP から配られていれば使える
マルチキャストff00::/8指定スコープmDNS、グループ制御
ループバック::1自ノード—

リンクローカルアドレス (LLA)

すべての IPv6 インタフェースが必ず持つ。fe80:: + インタフェース ID。

重要な性質: LLA はルータを越えない. だから「Wi-Fi の機器と Thread の機器」のように別リンクにいる相手には LLA では届かない。

また LLA を使うときはスコープ ID(インタフェース指定)が必須である。 ping6 fe80::1 は失敗し、ping6 fe80::1%eth0 が必要になる。 複数インタフェースがあると、どこへ送るか決まらないからだ。

ユニークローカルアドレス (ULA)

fd + 40 bit のランダムなグローバル ID + 16 bit のサブネット ID + 64 bit のインタフェース ID。

fd11:2233:4455:0001:0011:2233:4455:6677
└┬┘└──────┬─────┘└─┬┘└──────────┬───────┘
 fd  グローバルID  サブネット   インタフェースID
     (ランダム)

家庭内で閉じた、しかしリンクを越えられるアドレス。 Matter が最も頼りにする種類である。

Thread の Mesh-Local プレフィックスは ULA である(fd<random>/64)。 Thread ネットワークの内部通信に使われる。

さらに Border Router は OMR プレフィックス(Off-Mesh-Routable、これも通常 ULA)を Thread ネットワークに配布し、Wi-Fi 側からも到達できるアドレスを機器に持たせる。 「Thread の電球にスマホから届く」のは、この OMR アドレスのおかげである(04 章)。

グローバルユニキャストアドレス (GUA)

ISP から IPv6 プレフィックスが配られていれば、機器はこれも持つ。 Matter の動作に必須ではないが、あれば使われる。

GUA があると外から直接届いてしまうのでは? 到達可能性とアクセス許可は別である。 Matter の通信は必ず暗号化・認証されている(11 章)ので、 鍵を持たない相手はセッションを張れない。 とはいえ、家庭用ルータは通常デフォルトで外部からの着信を遮断する設定になっている。

4. マルチキャスト — 探索の要

IPv6 にはブロードキャストがなく、マルチキャストで代替する。

ff  0  2      ...      :fb
│   │  │
│   │  └─ スコープ(2 = リンクローカル、5 = サイト)
│   └──── フラグ
└──────── マルチキャスト識別

Matter に関係する主なアドレス:

アドレス用途
ff02::1リンク内の全ノード
ff02::2リンク内の全ルータ
ff02::fbmDNS(リンクローカルスコープ)
ff03::fbmDNS(サイトローカルスコープ、Thread で使う)
ff02::1:ffXX:XXXXSolicited-node(近隣探索用)

mDNS のスコープが実務で最大の落とし穴である.

Wi-Fi 側の機器は ff02::fb(リンクローカル)で mDNS を出す。 Thread 側の機器はメッシュ全体に届く必要があるので ff03::fb(サイトローカル)を使う。

この 2 つは自動では繋がらない。 Thread Border Router が両者を中継することで、初めて 「スマホ(Wi-Fi)が Thread の電球を見つけられる」状態になる。

「Thread の機器がスマホから見えない」というトラブルの多くは、 Border Router の mDNS 中継(あるいは SRP サーバ)が正しく動いていないことに起因する。

マルチキャストが届かない環境

環境問題
企業ネットワークマルチキャストが遮断されていることが多い
ゲスト用 Wi-Fi端末間通信(クライアント分離)が禁止されている
メッシュ Wi-Fi中継機を跨ぐとマルチキャストが落ちることがある
VLAN 分割IoT 用 VLAN を分けると mDNS が越えられない

開発中は必ず、素直なフラットなネットワークで検証すること。 高機能なルータほど、IoT の探索を妨げる機能が有効になっている。

5. 近隣探索 (NDP) とアドレス自動設定

IPv6 では ARP の代わりに NDP(Neighbor Discovery Protocol、ICMPv6 ベース)を使う。

メッセージ役割
Router Solicitation (RS)「ルータはいますか」
Router Advertisement (RA)「私がルータです。プレフィックスはこれです」
Neighbor Solicitation (NS)「このアドレスの人、MAC は?」(ARP 相当)
Neighbor Advertisement (NA)「私です」

SLAAC(ステートレスアドレス自動設定)

  1. 機器が LLA を自分で作る(インタフェース ID から)
  2. DAD(重複検出)で NS を送り、誰も応答しなければ確定
  3. RS を送る → ルータが RA でプレフィックスを教える
  4. プレフィックス + インタフェース ID で GUA / ULA を生成

DHCP サーバが要らないのが IPv6 の大きな利点である。

DAD の遅延に注意. アドレスが使えるようになるまで、DAD の待ち時間(通常 1 秒程度)がかかる。 起動直後にすぐ通信しようとして失敗する実装バグは実際に存在する。 「アドレスが確定してから通信を開始する」を守ること。

6. MTU とフラグメンテーション

ネットワーク実効ペイロード
Ethernet / Wi-Fi1500 bytes(IPv6 の最小 MTU は 1280)
Thread (802.15.4)物理フレーム 127 bytes。ヘッダ圧縮後の実効ペイロードは 数十バイト

これが Matter の設計を大きく規定している.

フラグメントは高価である。 802.15.4 上で 1 パケットが 5 フラグメントに割れると、 1 つ落ちるだけで全部再送になり、電池も食う。

実装上の含意: 属性を一度に大量に読まない。 ワイルドカード読み出し(09 章)で数百の属性を一気に取ると、 Thread デバイスでは応答が巨大になり、失敗率が跳ね上がる。

7. 開発でよく使う確認コマンド

# インタフェースの IPv6 アドレスを全部見る
ip -6 addr show            # Linux
ifconfig | grep inet6      # macOS

# リンクローカルへの ping(スコープ必須)
ping6 fe80::1234:5678:9abc:def0%en0

# 全ノードマルチキャストで生存確認(同一リンクの IPv6 機器が一覧できる)
ping6 -I en0 ff02::1

# 近隣キャッシュ
ip -6 neigh                # Linux
ndp -an                    # macOS

# 経路
ip -6 route                # Linux
netstat -rn -f inet6       # macOS

# mDNS で Matter の機器を探す
dns-sd -B _matter._tcp             # macOS(運用中の機器)
dns-sd -B _matterc._udp            # macOS(コミッショニング待ちの機器)
avahi-browse -r _matter._tcp       # Linux

ping6 ff02::1 は最初にやるべき確認である. 同一リンクにいる IPv6 対応機器が全部応答する。 ここに目的の機器が出てこなければ、Matter 以前にネットワークの問題である。

8. よくあるトラブルと切り分け

症状疑うべきこと
機器が発見できないmDNS がブロックされている。マルチキャストが通っていない
Thread 機器だけ見えないBorder Router の中継。OMR プレフィックスが配られているか
コミッショニング後に繋がらない運用アドレスが変わった。DNS-SD の再登録(SRP)が失敗している
一部の機器だけ不安定Wi-Fi の省電力設定でマルチキャストが取りこぼされている
大きな読み出しだけ失敗MTU / フラグメント(Thread で顕著)
ルータ再起動後につながらないプレフィックスが変わり、機器が古いアドレスのまま

切り分けの順序

1. ping6 ff02::1 で相手が見えるか
       ↓ 見えない → リンク層・IPv6 の問題(Matter 以前)
2. dns-sd / avahi でサービスが見えるか
       ↓ 見えない → mDNS・マルチキャスト・SRP の問題
3. アドレスへ直接 ping6 が通るか
       ↓ 通らない → ルーティング・プレフィックスの問題
4. Matter のログでセッション確立を確認
       ↓ 失敗 → 証明書・鍵・ACL の問題([12 章](12_デバイス認証と証明書.md)〜[14 章](14_運用時のセキュリティ.md))

この順序を守ると、原因の特定が劇的に速くなる. 逆に、いきなり Matter のログを読み始めると、 実はネットワークの問題だったというケースで大量の時間を失う。

9. まとめ