動機:ゲームで「NAT越えの失敗」による通信エラーが起こったため。
参考
NATとは
Network Address Translation(ネットワークアドレス変換)の略。
ルーターや無線LANのアクセスポイントで利用されているIPアドレスの変換技術のこと。
プライベートネットワーク下の機器は、そのプライベートIPアドレスだけではインターネットに接続できない。 ゆえに、インターネットに接続する際はプライベートIPアドレスをグローバルIPアドレスに変換する必要がある。 それを行うのがNAT。
また、IPアドレスに加えてポート番号も変換するものをNAPT(Network Address Port Translation:ネットワークアドレス・ポート変換、またはIPマスカレード)という。 必要なグローバルIPアドレスの数を減らすという点でNAPTの方が都合がよく、現在「NAT」と言うときはこちらを指すことが多い。
おそらく、当初のインターネットでは全ての機器が1つずつグローバルIPアドレスを持っていて、そのままでは遅かれ早かれ新しいアドレスを用意できなくなってしまうという話になった。
NATとルーターを使えば常時必要なグローバルIPアドレスの数を節約でき、
NAPTではさらに同時接続時に必要なグローバルIPアドレスの数を節約できるということ(?)
NAT越え(NAT traversal)
同じルーターに接続している端末のグローバルIPアドレスは、全て同じものとして扱われる。
したがって、プライベートネットワーク下の機器に宛てて情報を送信しようとすると、そのグローバルIPアドレスだけではルーターまでしか辿り着けない。
そこで、何らかの方法によってルーターの先にある目的の端末を特定する必要がある。
ただし、NATの機能が標準化されていないため、標準的なNAT越え技術も存在せず、多くの種類がある。
Nintendo Switchにおける例
Switch AとSwitch Bがインターネット通信を行う場合の手順
A、Bがそれぞれマッチングサーバーにパケットを送る。その際、ルーターによって端末のアドレス情報(グローバルIPアドレス・ポート番号)がパケットに付与される。
マッチングサーバーから、自身のアドレス情報を取得する。
マッチングサーバーから、通信相手のアドレス情報を取得する。
取得した相手のアドレスに向けてパケットを送信すれば、相手のNAT(ルーター)を越えて通信できる。
(2で取得した自分の情報をどこで使うのかはよく分からなかった。)
ルーターのアクセス制御方式の種類
フルコーンNAT(タイプA):宛先(グローバルIP+ポート番号)さえ指定されれば、全てNAT越えする。
アドレス制御コーンNAT(タイプB):通信したことのあるグローバルIPからのパケットであればNAT越えする。
ポート制御コーンNAT(タイプB):通信したことのあるグローバルIP&ポート番号からのパケットであればNAT越えする。
対象NAT(タイプC or D):通信したことのあるグローバルIP&ポート番号に対して専用ポートを用意し、その相手のみNAT越えする。サーバーも対象になりうる。