Nintendo Switch の「スマートフォンへ送る」を支える技術

最近は趣味でネットワークの勉強をちょっとしているのですが、その過程で Nintendo Switch のある機能の中身が少し分かって面白いなーと思ったので、勉強がてら書いてみます。
ここの記述おかしいんじゃない？みたいな話があれば、コメントで指摘くだされば幸いです。

## Switch の「スマートフォンへ送る」機能

もう1年くらい前になりますが、Switch に新しい機能が追加されて、**QRコードを読み取るだけでスクショを直接スマホに無線通信で送れる**ようになりました。
この機能が実装されるまでは、画像をスマホに送るには SD カードを Switch から移すか、あるいは Twitter で一度画像付きツイートをしてから保存するしかなかったと思うので、だいぶ便利になったなーと感じました。

https://twitter.com/nintendo_cs/status/1334342165607026688

この画像転送機能の流れは

1. QRコードを読み取る
1. QRコードをもう一度読み取る
1. `http://192.168.0.1/index.html` というアドレスのサイトが開き、このサイトに送りたい画像が貼られているので、これを保存する

というものです。（詳しくは以下の記事をご参照ください）

- [Switchからスマートフォンに画面写真（スクショ）や動画を送る手順と、つながらないときの対処法【神アプデ】](https://ushigyu.net/2020/12/02/nintendo-switch-smartphone-picture/)

これがどうして上手くいくのか前までよく分かっていなかったのですが、最近ネットワークについて勉強するようになって、ようやく飲み込めるようになりました。
以下、簡単に説明していきたいと思います。

## アクセスポイント(AP)とルーター

多くの家でもそうだと思いますが、わが家には Wi-Fi ルーターがあります。Wi-Fi ルーターは **アクセスポイント(AP)** と **ルーター** の機能を兼ね備えています。

アクセスポイントとは、無線通信（IEEE802.11、通称 Wi-Fi）において、機器同士を無線でつなげるときの親機のことです。
一方ルーターは、ネットワークを外部のインターネットと接続するための機器です。
私の家のネットワークを図にすると以下のようになります。

![スクリーンショット 2021-12-23 0.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/ae64f876-a007-81f9-1248-fffa7909948b.png)



赤い数字は**プライベートIPアドレス**です（あくまで私の家の機器の数値であり、Switch だから 192.168.10.3 というわけではないことに注意してください）。また「/24」の部分は**サブネット**と呼ばれる数値です。サブネットの上位N（今回はN=24）ビットが同じであることを、同じネットワーク内にいることとみなします。
 192.168.10.1 も 192.168.10.3 も 192.168.10.5 も、2進数で表記すると上位24ビットは同じ値なので、同じネットワークだという意味です。
なお、サブネットは、上位Nビットを1で並べたものを10進数表記に戻して「255.255.255.0」というように書くこともありますね。

アクセスポイントとルーターの両方のおかげで、PCでもスマホでも Switch でもインターネットを楽しむことができます。

例えば PC で `https://google.com` にアクセスした時、どのようなことが起こるでしょう？
この場合、まず DNS サーバーに問い合わせて google.com の IP アドレス（`172.217.161.78` など）を得ます。これは PC の IP アドレス 192.168.10.5 とは上位 24 ビットが違うので、外部のネットワークにあるとわかります。
IPパケットを送るときは、まず **ARP** プロトコルで IP アドレスから MAC アドレスを割り出そうとします。内部のネットワークであれば、ARP を送って返信をもらうことで（あるいはキャッシュされた経路表を参照することで）、どこに IP パケットを送ればいいかがわかります。一方 google.com のサーバーのような外部ネットワークの機器の場合、どの経路で送ればいいのかはわかりません。このような場合、とりあえず PC はルーターに IP パケットを放り込みます。このように、経路が分からないのでとりあえず放り込む先を **デフォルトゲートウェイ** と呼びます。
ルーターもまたより大きなネットワークに所属していますが、そのネットワークの中に google.com のサーバーは当然無いはずので、ルータにとってのデフォルトゲートウェイである ISP（ネットワークプロバイダ）サーバーに IP パケットを放り込んで、さらに大きなネットワーク内で調べます。
こうした IPパケットの「たらい回し」を続けることで、やがて google.com のサーバーにいつか到達することになるのです。

この様子は

```
traceroute google.com
```

で確認することができます。（ちなみに `traceroute` は内部的には ICMP というプロトコルのパケットを送るコマンドで、他には `ping` も ICMP です）

## DHCP

ここまでの説明で、人によっては

- Switch に 192.168.10.3 みたいなアドレスを設定した覚えは無いけど、なんでそんなものが勝手に割り当てられるの？
- DNS サーバーに問い合わせて google.com の IP アドレスを得るって書いてあるけど、どこに DNS サーバー があるって PC は知ってるの？
- MAC アドレスって IP アドレス とは何が違うの？

という疑問が出てきたかもしれません。ここら辺の伏線回収をするために、DHCP の話をしておきます。

まず MAC アドレスと IP アドレスの違いについて説明しましょう。
MAC アドレスは機器固有ですが、IPアドレスはお引越しすることができます。また、MAC アドレスは最初から機器に割り当たっていますが、**IP アドレスは後から獲得する必要があります**。
通信という面においては、 MAC アドレスはネットワーク内部で機器を通信する時に宛先として使えますが、外部のネットワークには使えません。外部のネットワークにも伝えたい時（≒インターネットをしたい時）には必ず IP アドレスが必要になります。
別の言い方をすると、**MACアドレスはデータリンク層(L2)のアドレスで、IPアドレスはそれより一個上のレイヤーのネットワーク層(L3)のアドレスです**。

IP アドレスの獲得方法について、静的 IP アドレス割り当てと **DHCP** を使った割り当てがあります。普通の機器の設定では DHCP を使うと思うので、ここではそれに絞って説明します。
DHCP は DHCPDISCOVER, DHCPOFFER, DHCPREQUEST, DHCPACK の流れで行われます。以下のようなイメージです。

![スクリーンショット 2021-12-23 1.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/52f5be06-c9ec-b5a7-0055-ada3a1111556.png)

DHCP は PC 上の [Wireshark](https://www.wireshark.org/download.html) のようなパケットトレーサーでも確認することができます。

![スクリーンショット 2021-12-22 20.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/9a808058-0083-3b0e-543c-56addcf38f2b.png)

Switch とルーター同士のやり取りなのになんで PC が勝手に見れてるんだ！と思うかもしれませんが、DHCP はブロードキャストで行われるので、パケットはネットワーク内の全端末に届くのです（教科書的には DHCPDISCOVER と DHCPREQUEST だけがブロードキャストだと教わるのですが、実際にはルーターの設定によってこのように DHCPOFFER と DHCPACK もブロードキャストになることがあります）。

なお、Wi-Fiルーターの場合、DHCPOFFER の際に **デフォルトゲートウェイやDNSサーバーの場所** のような情報も教えてくれるので、DHCP さえ済ませればすぐにインターネットができる状態になるということですね。（これが先程の「どこに DNS サーバー があるって PC は知ってるの？」に対する答えになります）

ちなみに、DHCPACK が完了したああと、Switch 側が "ARP Announcement for 192.168.0.3" なるパケットを出しています。これは Switch 自身に割り当てられた 192.168.10.3 という IP アドレスについて、誤って他の機器にも既に割当たっていないか検証するための特殊な ARP で、**Gratuitous ARP (GARP)** と呼ばれます（普通 ARP はパケット送信相手の IP アドレスから MAC アドレスを調べるために使うので、自分自身の IP アドレスを送信相手にするという使い方が特殊、ということです）。

## Switch の無線通信

やや話が脱線気味になりましたが、本題の Switch のスクショ転送について説明しましょう。
Switch で「スマートフォンへ送る」を選択したとき、Switch はそれ自身が新たなアクセスポイントとして無線通信を開始します。スマホが Switch の画面から読み取る 2 つの QR コードのうち 1 つ目は、**Switch をアクセスポイントとした無線通信にスマホが接続する** 機能を果たします。QR コードの中身が Wi-Fi のSSIDとパスワードになっているのですね。
Switch が無線通信を開始すると下図のようになります。

![スクリーンショット 2021-12-23 1.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/b564274b-dec3-b098-b45b-444fbd4c6284.png)

1つ目の QR コードを読み取った時点で、スマホは **赤色のネットワークから青色のネットワークに切り替わります**。この際、スマホは DHCP により、新たな「192.168.0.2/24」というプライベート IP アドレスが与えられます。これは赤色のネットワークのアドレスとは **無関係** です。

2つ目の QR コードは `http://192.168.0.1/index.html` をブラウザで開く機能を担っています。192.168.0.1 は青色の Switch のネットワークにおける Switch のアドレスに対応します。ちなみに、このアドレスが開けるということは、Switch 側のサーバーのポートが HTTP プロトコルの 80 番を開いていることになるので、面白いですね。

なお、Switch 自体にルーター機能はないので、**Switch のネットワークはインターネットに接続されていない** こともわかります。実際、スマホを機内モードにした状態でこの画像転送機能を使うと、確かに `http://192.168.0.1/index.html` には接続できるが `https://google.com` や `http://172.217.161.78` にはアクセスできないようになっています。

ちなみに、Switch の無線通信は暗号化通信方式として **AES** を採用しており、これは一定の強度を持つ標準的な方式です。残念ながら私の家の Wi-Fi ルーターの設定は **TKIP** という脆弱性のある方式を使っているので、Switch は家の Wi-Fi ルーターよりもセキュアだということになります。


## おわりに

この記事では、Nintendo Switch の「スマートフォンへ送る」機能を題材に、最近勉強したネットワークのよもやま話について書いてみました。
ネットワークの仕組みを理解すると、普段何気なく使っているインターネットに対する解像度が上がるので、オススメです。