この記事はYouTubeで紹介したNATに関する以下の動画についての補足解説となります。
動画を先に見ていただくと理解しやすいと思います。
https://youtu.be/jCaITiLbew4
上記の動画を作製するに際し、任天堂SWITCHにてすべてのNATタイプ(A,B,C,D,F)の再現を行いました。その結果は以下の通りです。
タイプFについてはルーターにてUDP通信を抑止することで再現可能です。
本記事では動画で説明しきれなかった部分を補足します。
SWITCHでゲームに支障がないNATタイプであるAもしくはBを実現する条件は以下になります。
SWITCHが同じプライベートIPおよびポート番号を使用する限りは、NATにて同じグローバルIPアドレスとポート番号を引き当てる。(endpoint independent mapping)
この条件は非常に重要です。この特性を利用することにより、STUNサーバーはP2P通信をする二つのノードに通信相手のグローバルIPアドレスとポート番号を通知することができます。STUNサーバーは自分に対して使用されているグローバルIPアドレスとポート番号を知ることできるのでそれを通知することになります。
endpoint independent mapping を行っているNATタイプAとBではSTUN方式の通信が成立し、P2P通信が実現可能です。
なお、NATの他の実装においては通信相手先のIPアドレスもしくはIPアドレス+ポート番号が変更になった場合に、新たなポート番号を割り当てるNATがあり、その場合は原則としてSTUN方式の通信は成立しません。
タイプCとDでは原則としてSTUN方式は成立しないのですが、Cでは不安定ながら成立する可能性があります。NATの標準的な実装では新たなポート番号を割り当てる際に、直前に割り当てたポート番号の次の番号を割り当てます。これは自然な実装で、私がプログラムを書けと言われればこのような実装にします。
この実装になっているとわかれば、STUNサーバーは自身と通信する際に利用されたポート番号に1をたして、通信相手に通知すればよいことになります。これがNATタイプCとなります。また、次に使われるポート番号が予測不能な際はタイプDとなりSTUN方式の通信は成立しないことになります。
- 今回のSymmetric NATによる二重ルーター構造で表記の検証結果となった理由
- タイプAであったDS-Liteでの接続がSymmetric NATによる二重ルーター構造でDまで落ちた理由
これはv6コネクトによるDS-LiteのNAT実装によるものとなります。私は以前、v6コネクトのポート番号取得形式を解析しています。以下の動画をご覧ください。
https://www.youtube.com/watch?v=C1PsZrxID58
7:40以降をみていただくと、DS-Liteで使用されているルーターに実装されているNATは不連続なポート番号取得をしていることが分かります。つまり、「次のポート番号」は予測不能となるわけです。このため、Symmetric NATによりP2P通信に使用するポート番号がSTUNサーバとの通信に利用したポート番号と異なることとなると、タイプAだったものがタイプDに一気に落ちることになります。
- タイプBであったPPPoE@Atermでの接続がSymmetric NATによる二重ルーター構造でCとなった理由、そしてまれにDになる形で揺れる理由
Atermの実装は標準的なもので、ポート番号の割当は順番に前回取得の番号に1を足して付与していく方式と思われます。このためにタイプCとなります。まれにDになる理由としては以下が想定されます。- 次に付与しようとしたポート番号が使用中であったため、+2を足したポート番号を付与した。
割り当てられたポート番号は設定された時間の間に通信が発生しなければ解放され、「利用可能」となります。しかし、散発的に通信が続いていた場合は解放されず、「使用中」の状態が継続します。私の家には50個を超える端末があり、様々な通信が行われています。次に割当予定のポート番号がたまたま使用中だとタイプDとなります。
- ポート番号が順番に割り当てられるかテストした際に、たまたま他の機器から新たな通信が発生した。
タイプCに該当するか検証するために、タイプテストの際は任天堂のサーバーに向けて通信を二回発生させて、順番にポート番号が採番されるか検証します。その二回の通信の間にたまたま別のノードが通信を行うと、次の番号がそのノードにとられてしまいタイプDとなります。
- ポート割当帯域の末尾にきて、帯域の先頭に割り当てが戻り順序性が崩れた。
発生頻度は低いのですがこれもあり得ます。NATにおけるポート番号の割当に際しては、ポート番号の幅を持っています。例えば40,000からの55,000が幅として設定されていた場合、55,000番の次は55,001番ではなく40,000となります。たまたまこの順番にぶつかった場合はタイプDとなります。この形態の発生頻度は極小かとおもわれますが、MAP-Eの場合は注意が必要です。MAP-Eでは連続した16個のポート番号が15セットで合計240ポートが割り当てられます。重要なのは連続しているは16個のみということです。つまりこの場合、タイプCであっても、16回に一回はタイプDとなることが想定されます。
MAP-Eであっても、NATタイプが適切であればタイプAもしくはBとなります。上記の話はあくまでも、タイプA,Bの条件を外れてしまった場合に高頻度でCとDの間で不安定になるということです。
- 次に付与しようとしたポート番号が使用中であったため、+2を足したポート番号を付与した。
- タイプAであったDS-Liteでの接続がSymmetric NATによる二重ルーター構造でDまで落ちた理由