IPアドレスとポート番号を使った通信
いきなり外部とのネット通信について考えると頭が混乱するので、まずはLAN内での通信について考えます。
例としてサーバー(アドレス 192.168.1.2)でWebサーバーを起動して、同じLAN内のスマホ(アドレス 192.168.1.3)から接続するとします。
(ルーターはデータの受け渡しをするだけなので、省略します)
まずサーバー機でサーバーソフトウェアを80番で起動します(これを「80番ポートをリッスンする」と言います)
スマホでは、接続先を「192.168.1.2(:80)」としてサーバーに接続します。
(本来は、接続先は「IPアドレス:ポート番号」で指定しますが、HTTPでは通常80番で通信するので、その場合はポート番号の省略が可能です)
Webサイトを閲覧するときには、URL(接続先)に「http://example.com/」などを入力します(GoogleやYahooの検索を使っている場合でも、裏でURLが指定されています)
「http:」はHTTPというルールで通信すること、「example.com」はドメイン(IPアドレスと同等のものと考えて構いません)を意味します
ここでもポート番号が省略されていて、「http://example.com:80/」で接続しても同じサイトに繋がります。
この時、意識しないですがスマホ(クライアント)が自動的にサーバーとの通信に使う一時的なポートを開きます(ここでは50000番とします)
このようにして通信を開始すると、スマホ→サーバー(要求)では「送信元 192.168.1.3:50000」「送信先 192.168.1.2:80」、サーバー→スマホ(応答)では「送信元 192.168.1.2:80」「送信先 192.168.1.3:50000」でデータをやり取りします。
スマホが通信を切るとスマホの50000番ポートは閉じられますが(不要になるため)、サーバーの80番ポートは閉じられません(新しい接続を待機するためにリッスンし続けます)
遠く離れた人との通信
データを適切な端末に転送するNAPT
ルーターの下(LAN)では、スマホやPCなど、様々な機器が存在しています。
外部(WAN)と通信するとき、ルーターを経由することをチラっと説明しました。
また、WANからはLAN内の機器を認識しない(ローカルIPアドレスを使って通信できない)ことも説明しました。
(忘れちゃった場合は、もう一度「データの送信先を決める方法」を読んでください)
つまりルーターは外部との通信の際に、ローカルIPアドレスを使用せず、グローバルIPアドレスとポート番号だけで通信するわけです。
では、外部からデータを受け取ったとき、どうやってどのLAN内機器に送信するかを決めているのでしょうか?
ルーターに来たデータを適切な端末へ転送する仕組みをNAPTと言います。
ちなみにポート開放というのは、静的NAPTというもの(のちに説明)の設定をすることです
LAN内から通信を開始したとき
LAN内からWANに要求を送信し、応答を受け取るとき、動的NAPTという仕組みを利用します。
ルーターにグローバルIPアドレス200.200.200.200(ローカルIPアドレス 192.168.1.1)を割り当てられている人が、LAN内のクライアントPC(ローカルIPアドレス 192.168.1.2)から世界のどこかのサーバーPC(アドレス 100.100.100.100 ポート番号80)と通信するとします(サーバー側LANの通信については静的NAPTで説明をするので今回は簡略化して、WANに直接サーバー機がつながっているとします)
まずクライアントPCが50000番ポートを通信用に確保します。
データの送信元は「192.168.1.2 ポート番号50000」送信先は「100.100.100.100 ポート番号80」となります。
そのデータをLAN内(自宅)のルーターが受け取ると、送信元を「200.200.200.200 ポート番号12345」(未使用のポート番号)、送信先を「100.100.100.100 ポート番号80」に書き換えます。
この機能を動的NAPTと言います。
この機能のおかげで、グローバルIPアドレスを持っていないLAN内機器でも、外部のインターネットと通信することができます。
サーバーがそのデータを受け取って、処理をした後、自宅にあるルーターへと応答します(送信元「100.100.100.100 ポート番号80」・ 送信先「200.200.200.200 ポート番号12345」)
自宅にあるルーターがそのデータを受け取ると、先ほど192.168.1.2の50000番から来たデータを200.200.200.200の12345番に書き換えていたので、逆に200.200.200.200の12345番を192.168.1.2の50000番に書き換えます。
するとルーターが受け取ったデータが、送信元「100.100.100.100 ポート番号80」、送信先「192.168.1.2 ポート番号50000」に書き換えられ、クライアントPCへ無事送信されます。
LAN外から通信を開始したとき
ポート開放とは
WANから接続してもらうとき、通信するポートは決まっているので(httpなら80番、マイクラなら25565番など)、あらかじめ何番のポートをどのローカルIPアドレスの何番に転送するかを設定しておく必要があります(ランダムなポート番号だと、クライアントがどのポート番号と通信すればいいのかわからない)
その設定のことを静的NAPT設定、IPマスカレード設定、もしくはポート開放と言います。
ということは、本来ポート開放とは、「ルーターの〇番に来たデータを、ローカルIPアドレス○○.○○.○○.○○の〇番に転送するようにする設定すること」になりますね。
サーバーを外部に公開するときは、通信するポート番号を決める必要があるから、人が手動で設定する必要があるのですね。
(また、設定していない場合[ポート開放していない場合]、勝手にデータを送られても自動遮断してくれるので、そういう意味でもこの機能は役に立ちますね
このように人が手動で固定し、勝手に設定が変わらないため、静的と言われます。
(それに対し、動的NAPTは通信を開始するたびに設定が変わるため、動的と言われます、多分)
静的NAPTを使った通信
さて、WAN(他人)から通信を開始してもらうときの通信の仕方を見ていきましょう。
(前章で言えば、あいまいにしていた「サーバー側LAN」での通信ですね)
条件は前と同じで、サーバー側ではあらかじめポート開放(静的NAPT設定)をしているとします(ルーターの「80番」に来たデータを、サーバーPCの「192.168.10.2」の「80番」に転送する設定)
サーバー側のルーターが、送信元「200.200.200.200 ポート番号12345」・送信先「100.100.100.100 ポート番号80」のデータを受け取ると、NAPTを参照します。
もし、80番の設定がある場合、その設定をもとに転送します。
もし、80番の設定が無い場合、データは破棄されます。
今回は80番の設定があるので、送信先が「192.168.10.2 80番」に書き換えられて送信されます。
サーバー用PCがそのデータ(要求)を受け取ると、要求を処理して応答します。
応答するデータは送信元「192.168.10.2 80番」送信先「200.200.200.200 12345番」で送信します。
サーバー側ルーターが返信を受け取ると、先ほど「200.200.200.200 80番」を「192.168.10.2 80番」に変換していたので、送信元の「192.168.10.2 80番」を「200.200.200.200 80番」に変換して、クライアントへ返信します。
NAPTのまとめ
動的NAPTと静的NAPTの通信をまとめると、次のようになります
まとめ
今回は、ネットワーク機器同士がどうやって通信をしているのか?ということを、ルーターに注目して解説しました。
今記事の内容をまとめると以下の通りです
- ルーターを介して通信している
- IPアドレスによって、どこに送信するかを決めている
- ポート番号によって、どのプログラムの通信なのかを判断している
- LAN内の機器とWANの機器同士の通信は、NAPTという機能を使って、IPアドレスとポート番号を適切に変換して行っている
わからないことなどや、間違っている点があれば、コメント欄でどんどん意見をください!