MoNoQLoREATOR さんが書きました:
最近ネットワークの仕組みについて学習しております。
そこでふと、全ての通信はNAPT対応ルータを介しているのではないか?という仮説が浮かんできました。
そうでなければ、絶対的にグローバルIPアドレスの数が足りません。
しかし仮にそうであるならば、ネットゲームをするにはポートフォワーディングを行う必要があります。
それにも関わらず私は生まれてこのかたそんなことをしたことがありません。
どうもその仮説が間違っているような気がします。
どうなのでしょうか?
もし仮説が間違っているのなら、世界中のインターネット同時接続人数がグローバルIPアドレスの限界を超えていないだけだということでしょうか?
IPv4だと、グローパルIPアドレスの数は少ないから通信は全てNAPTで変換されながら行われているのはないか?、みたいな話でしょうか?
逆に考えると分かりますが、公開できるサービスは使用可能なグローバルIPアドレス × トランスポートプロトコル × ポート番号の数を超えることはできません。
なので、超えるということはないです。
また、一般家庭のクライアントからの接続数も使用可能なグローバルIPアドレス × トランスポートプロトコル × ポート番号の数を超えることはできません。
なので、こちらも超えるということはないです。
グローバルIPアドレスはインターネットで使用されています。
企業内および家庭内ではプライベートIPアドレスが使用されており、インターネットとの間の変換にNAPTやポートフォワードが使用されています。
言えることは、数の限界を超えた接続は試みることもできないし、行えないということです。
現状、全て許容範囲内で運用されています。逆に言えば、数を超えた運用はやろうとしてもすることができないとも言えます。
あと、NAPTとポートフォワードを同一と思われているようなので、使用目的の観点からポートフォワードについて説明しておきます。
クライアントとサーバでは状況が異なります。
インターネットというのは、接続する側が接続される側のアプリケーションを指定できれば良く、データを送りたいアプリケーションを指定するためにポート番号が使用されています。
また、接続する側は最初に、データを送ってきて欲しいポート番号を接続開始のタイミングで接続される側に教えてあげます。
こうすることで、接続される側から接続する側のアプリケーションにデータを送信することができるようになります。
この際、接続する側のポート番号はそのタイミングで使用されていない番号であれば何でも構いません。
特定の(決められた)ポート番号が必要になるのは、接続される側です。
何故なら、接続する側は接続しに行くときに自分から使って欲しいポート番号を自己申告で相手に教えることができますが、逆に接続される側は接続しに行かないので相手に教えるタイミングがありません。
そのため、接続される側は固定である必要がある訳です。
(※以下、IPアドレス、トランスポートプロトコルも含めた説明は割愛します)
端的な話をすると、NAPTはデフォルトでは特定の(静的な)ポート番号への変換を提供しません。
サーバを公開する方は、ルータの(パケットフィルタリングにより受信パケットをルータが捨てないように)ポート解放を行いますが、そのときに設定しているのはポートフォワードの設定に他なりません。
ルータにアクセスしてきた特定の接続を特定のアプリケーションで待ち受けるために
ルータで受信したパケットの送信先グローバルIP&ポート番号を特定のローカルIP&特定のポート番号へ変換されるように、変換先のローカルIP&ポート番号を(静的に)固定で指定している訳です。
NAPTは基本動的で、接続する側専門です。
ポートフォワードは基本静的で、接続される側専門です。常に固定で変換先を指定します。
ルータに特定のポートフォワード先を登録することで受信時の固定の変換先を指定することができます。
簡単な話をすると、通信開始の段階でルータの動作は通常、接続する側は動的変換(NAPT)、接続される側は固定変換(ポートフォワード)ということです。
ポートフォワード先が設定されていないルータは、基本外部から接続しにきた全てのバケットを受け渡し先が見つからないとしてパケットフィルタリングにより棄てます。
つまり、ルータはポートフォワードをパケットフィルタリングの抜け道として使用していることになります。
とりあえず、使用目的の時点で NAPT = ポートフォワード ではない、ということです。
また、ネットゲームにおいてもマッチングサーバが用意されていないP2Pオンリーの場合はホストとなるPCを用意する必要があるのでポートフォワードを必要とします。
MoNoQLoREATOR さんが書きました:
また、NAPTのシステム自体にも疑問を感じます。
もし同じNAPT対応ルータを利用する複数のパーソナルコンピュータが同じポート番号を使用して通信を始めたら破たんするのではないでしょうか?
それとも、誰かの通信が完了するまで他の人は待たされることになるのでしょうか?
NAPTとポートフォワードの使用目的が理解できれば、この疑問自体が乖離的で破たんしていることが分かると思います。
また、socketプログラミングをすれば分かりますが、TCPサーバの場合バックログというものが存在します。
サーバで待ち受けている同じグローバルIP&ポート番号でTCPの接続自体はaccept前に複数同時に受け付けることが可能で、acceptを呼び出す時には同時に複数接続が接続確立済みの状態で順番待ちをしている状態です。
acceptを連続で呼び出して同時に複数接続に対しアプリケーションで通信処理ができるかどうかは、同期処理、非同期処理のどちらで実装しているかで変わります。
このへんは質問する前にsocketプログラミングで経験を積んで自分で勉強すれば分かることなので、がんばってください。