【図解でわかる】IPアドレス、ポート番号と通信の仕組み

IPアドレス・ポート番号と通信の仕組み インターネット

インターネットの通信ってどうやってるの?ポート番号って何なの?ポート開放って何をすることなの?
という疑問を解決すべく、この記事を書きました。

どうやって通信を行っているか、ポート開放って何をすることなの?ということを、図を使ってわかりやすく、でも専門用語も学んでインターネットに強くなるように解説していきます。

当記事では、ルーターの役割について深堀りしたいと思います。

なお、当記事はIPv4を前提に書いており、IPv6ではそもそもNAPTを利用しません。
当記事を読んだ上でIPv6について書かれた以下の記事を読むことで理解が深まります。

通信先の決め方

ルーターとは?

まずは家のネットワークについて見ていきましょう。

家でインターネット(固定回線)を使っている人は、大抵プロバイダ(ISP インターネットを提供している事業者 NURO光やSo-netなど…)と契約しています。
そのような人は、設置工事をしてもらうとき、業者さんがこんな機械を置いていたと思います。

https://www.photo-ac.com/main/detail/1070638

この機械をルーターと言います。

(無線LAN)ルーターの裏に書いてあるパスワードを見て、それをスマホ等に入力してインターネットに接続していますね。
家ではこのルーターにスマホやPCを接続して、インターネットを使っています。

ONUについて
ルーターと外部のインターネットは、近年は光回線で結ばれています。
光回線の光信号とデジタル信号を相互変換するONUというものがありますが、ONUは信号の変換だけ行っているので、今回の図以降は省略します。
ポート開放等においてもONUは気にする必要はありません。
厳密的にはLANはインターネット(WAN)の一部だが、外部のネットワーク(WAN側)をインターネット(WAN)と表記する。

このように家の中で構築されたネットワークをLAN(Local Area Network)と言います。
世界中の家庭や会社にはLANが構築されており、世界中のLANの集合をWAN(Wide Area Network)≒インターネットと言います。
従ってルーターから外のネットワークをWAN側と言います。
(以降は、単に外部をWAN(インターネット)として説明します。)

WANの定義
WANは狭義的には会社の複数支社や大学の複数キャンパスのLANを繋ぐ中規模のネットワークのことを指し、世界規模のインターネットとは別であると説明されることがあります。
ですが、当記事では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アドレスを指定するのですね。

(黒色がローカル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番で通信するので、その場合はポート番号の省略が可能です)

ポート番号の省略
Webサイトを閲覧するときには、URL(接続先)に「http://example.com/」などを入力します(GoogleやYahooの検索を使っている場合でも、裏でURLが指定されています)
「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」に書き換えられて送信されます

(クライアント側LANを省略しています)

サーバー用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を設定する作業である

わからないことなどや、間違っている点があれば、コメント欄でどんどん意見をください!

コメント

  1. bursa esco より:

    I really like your blog.. very nice colors & theme. Siana Sebastien Mordecai

  2. USHIRODA H より:

    静的NAPTを使った通信のところで、「サーバー側のルーターが、送信元「200.200.200.200ポート番号12345」・送信先「100.100.100.100ポート番号25565」のデータを受け取ると、静的NAPTの設定を参照します。」とありますが、「100.100.100.100」は「200.200.200.200」ではないでしょうか?
    実際にはルーターのグローバルIDを2個設定するのであれば100でも間違いではないような気がしますが。よろしくお願いします。

    • nova nova より:

      ご指摘ありがとうございます!
      ミスを修正して、ページ全体を少し書き直しました。

  3. Jack より:

    分かりやすくて、素晴らしい!

  4. のら より:

    気になったので確認させてください!

    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 だったので!
    ご確認お願いしますー🙏

タイトルとURLをコピーしました