インターネットの通信ってどうやってるの?ポート番号って何なの?ポート開放って何をすることなの?
という疑問を解決すべく、この記事を書きました。
どうやって通信を行っているか、ポート開放って何をすることなの?ということを、図を使ってわかりやすく、でも専門用語も学んでインターネットに強くなるように解説していきます。
当記事では、ルーターの役割について深堀りしたいと思います。
なお、当記事はIPv4を前提に書いており、IPv6ではそもそもNAPTを利用しません。
当記事を読んだ上でIPv6について書かれた以下の記事を読むことで理解が深まります。
通信先の決め方
ルーターとは?
まずは家のネットワークについて見ていきましょう。
家でインターネット(固定回線)を使っている人は、大抵プロバイダ(ISP インターネットを提供している事業者 NURO光やSo-netなど…)と契約しています。
そのような人は、設置工事をしてもらうとき、業者さんがこんな機械を置いていたと思います。
この機械をルーターと言います。
(無線LAN)ルーターの裏に書いてあるパスワードを見て、それをスマホ等に入力してインターネットに接続していますね。
家ではこのルーターにスマホやPCを接続して、インターネットを使っています。
光回線の光信号とデジタル信号を相互変換するONUというものがありますが、ONUは信号の変換だけ行っているので、今回の図以降は省略します。
ポート開放等においてもONUは気にする必要はありません。
このように家の中で構築されたネットワークをLAN(Local Area Network)と言います。
世界中の家庭や会社にはLANが構築されており、世界中のLANの集合をWAN(Wide Area Network)≒インターネットと言います。
従ってルーターから外のネットワークをWAN側と言います。
(以降は、単に外部をWAN(インターネット)として説明します。)
ですが、当記事ではWAN≒インターネット(世界中のLANを相互接続するネットワーク)として説明します。
ルーターはLAN内の各機器やWAN(側)との中継点であり、ネットワーク上の機器と通信する場合はルーターを経由します。
ちなみにルーターなしで直接コンピュータをWANに接続することもできますが、ルーターが無いと各家庭一台しかコンピュータを接続できないため、通常はルーターを利用します。
データの送信先を決める方法
世界中に張り巡らされているインターネットには沢山のLANが点在し、LAN内(家庭内)には複数の機器があります。
ですので、送信先を決めるには、機器それぞれに固有のIDや住所のようなものを割り当てる必要があります。
そのIDや住所にあたるのがIPアドレスです。
世界中にあるLAN(組織)を区別するIPアドレスを、グローバルIPアドレス、
LAN内で機器を区別するIPアドレスを、ローカル(プライベート)IPアドレスと言います。
(一般家庭のLANでは192.168.x.xです。)
インターネットでは、最終的にどのLANにデータを送信するかをグローバルIPアドレスで指定して、LAN内のどの機器にデータを送信するかをローカルIPアドレスで指定します。(詳細は後の「データを適切な端末に転送するNAPT」で説明)
ローカルIPアドレスは同一LAN内でしか通用しません。
つまり、外部(WAN)からローカルIPアドレスを指定して別のLANにある機器と通信することは不可能です。【緑色矢印】
ですが、内部(LAN)から、ローカルIPアドレスを指定して同一LAN内の機器と通信することはできます(経由する自宅のルーターはLAN内機器を認識しているから)【青色矢印】
だから、他の人にサーバーに入ってもらうときはグローバルIPアドレス、自分が入るときはローカルIPアドレスを指定するのですね。
上図ではA、Bさん宅LAN内機器のローカルIPアドレスがそれぞれ「192.168.1.x」、「192.168.10.x」と異なるアドレスになっていますが、ローカルIPアドレスは同一LAN内で固有であれば良いので別々のLANでローカルIPアドレスが重複しても問題ありません。
ポート番号とは?
PCやスマホを使って作業するとき、LINEで会話しながらゲームをすることがあると思います。
このようにインターネットを使うときは、様々な通信を同時に行っています。
その通信の種類(データをどのアプリケーションに送るのか)の区別は、ポート番号という番号を使って行っています。
LAN内での通信
データのやりとり
コンピューター同士の通信は、要求を送信すると、受信側は要求を処理して、場合によっては応答(要求の実行結果を返す)を行って通信しています。
この時、要求を出すコンピュータをクライアント、要求を処理するコンピュータをサーバーと言います
例としてWebサーバー(HTTP)を見てみましょう。
HTTPでは、クライアントが「〇〇ファイルをください(要求)」と送信して、サーバーがその要求を処理(データを探すなど)した後、応答(ファイル中身や実行結果を返す)します。
この要求-応答は、複数回行われることがあります。
IPアドレスとポート番号を使った通信
いきなり外部とのネットワーク通信について考えると頭が混乱するので、まずはLAN内での通信について考えます。
例としてサーバー(アドレス 192.168.1.2)でWebサーバーを起動して、同じLAN内のスマホ(アドレス 192.168.1.3)から接続するとします。
(実際は間にルーターが介在しますが、データの受け渡しをするだけなので省略します)
まずサーバー機でサーバーソフトウェアを80番で起動します(これを「80番ポートをリッスンする」と言います)
スマホでは、接続先を「192.168.1.2(:80)」としてサーバーに接続します。
(本来は、接続先は「IPアドレス:ポート番号」で指定しますが、HTTPでは通常80番で通信するので、その場合はポート番号の省略が可能です)
「http:」はHTTPというルールで通信すること、「example.com」はドメイン(IPアドレスと同等のものと考えて構いません)を意味します
ここでもポート番号が省略されていて、「http://example.com:80/」で接続しても同じサイトに繋がります。
マインクラフトJava版の25565番も省略することができます。
この時、意識しないですがスマホ(クライアント)が自動的にサーバーとの通信に使う一時的なポートをランダムに確保します(ここでは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)はLAN内の機器を個別に認識していません。(ローカルIPアドレスを使って通信できない)
(忘れちゃった場合は、もう一度「データの送信先を決める方法」を読んでください)
外部と通信するときは、グローバルIPアドレスとポート番号だけで通信します。
この時、グローバルIPアドレスとポート番号だけで、どのようにしてLAN内の適切な機器にデータを転送しているのでしょうか?
ルーターに来たデータを適切な端末へ転送する仕組みをNAPTと言います。
ちなみにポート開放というのは、静的NAPTというもの(後に説明)の設定をすることです
LAN内から通信を開始したとき
LAN内からWANに要求を送信し、応答を受け取るとき、動的NAPTという仕組みを利用します。
このようなLAN内から開始される通信を、外向き通信やアウトバウンド通信と言います。
逆に、外部から開始される通信を内向き通信(インバウンド通信)と言います。
内向き通信では静的NAPT(後述)を利用します。
ルーター(LAN)にグローバルIPアドレス200.200.200.200(ローカルIPアドレス 192.168.1.1)を割り当てられている人が、LAN内のクライアントPC(ローカルIPアドレス 192.168.1.2)から世界のどこかのWebサーバー(アドレス 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」(未使用の番号をランダム割当)に書き換えます(送信先はそのまま)
この機能を動的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に書き換えます。
するとルーターが受け取ったデータが、送信先「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」で送信します。
サーバー側ルーターが返信を受け取ると、同様に静的NAPTを参照して、送信元の「192.168.10.2:80」を「100.100.100.100:80」に変換して、クライアントへ返信します。
NAPTのまとめ
動的NAPTと静的NAPTの通信をまとめると、次のようになります
まとめ
今回は、ネットワーク機器同士がどうやって通信をしているのか?ということを、ルーターに注目して解説しました。
今記事の内容をまとめると以下の通りです
- ルーターを介して通信している
- IPアドレスによって、どこに送信するかを決めている
- ポート番号によって、どのプログラムの通信なのかを判断している
- LAN内の機器とWANの機器同士の通信は、NAPTという機能を使って、IPアドレスとポート番号を適切に変換して行っている
- ポート開放は、静的NAPTを設定する作業である
わからないことなどや、間違っている点があれば、コメント欄でどんどん意見をください!
コメント
I really like your blog.. very nice colors & theme. Siana Sebastien Mordecai
静的NAPTを使った通信のところで、「サーバー側のルーターが、送信元「200.200.200.200ポート番号12345」・送信先「100.100.100.100ポート番号25565」のデータを受け取ると、静的NAPTの設定を参照します。」とありますが、「100.100.100.100」は「200.200.200.200」ではないでしょうか?
実際にはルーターのグローバルIDを2個設定するのであれば100でも間違いではないような気がしますが。よろしくお願いします。
ご指摘ありがとうございます!
ミスを修正して、ページ全体を少し書き直しました。
分かりやすくて、素晴らしい!
気になったので確認させてください!
LAN外から通信を開始したとき > 静的NAPTを使った通信 > 「サーバー側ルーターが返信を受け取ると、先ほど「200.200.200.200 80番」を「192.168.10.2 80番」に変換していたので、送信元の「192.168.10.2 80番」を「200.200.200.200 80番」に変換して、クライアントへ返信します。」
の、200.200.200.200 は全て100.100.100.100 ではないでしょうか。
静的NAPTで変換したグローバルIPアドレスが100.100.100.100 だったので!
ご確認お願いしますー🙏
ご指摘ありがとうございます!修正しました