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

2020年8月29日

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

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

今記事では、家のネットワーク(LAN)サーバー(通信先)へデータが届いた後の処理(データの返信など)を重点的に話していきたいと思います。

なお、IPv4(ポート開放が必要なネットワーク)とIPv6(すべての端末にそれぞれグローバルな住所を割り当てられるネットワーク)では通信の仕方が異なるため、この話の一部はIPv6の場合には当てはまりません(特にルーター絡みの通信)

通信先の決め方

ルーターとは?

まずは家のネットワークについて見ていきましょう。
家のネットワーク?家にインターネットができているの?どういうこと?と思われるかもしれませんが、焦らず焦らず…

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

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

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

ルーターの裏とかに書いてあるパスワードを見て、それを入力して接続していますね。
家ではこのルーターにスマホやPCを接続して、インターネットを使っています。
(ルーターと世界中のネットの間を結ぶモデム[ONU]というものがありますが、モデムは複数の端末を接続することを想定しておらず、通常モデムは通信の橋渡し的な役割しかしないので、省略します)

皆さんはAndroid派?それともiOS派?ちなみに筆者はAndroid派です

このように家の中で構築されたネットワークをLAN(Local Area Network)と言います。
反対に、ルーター(家庭)から外のネットワークをWAN(Wide Area Network)と言います。

データの送信先を決める方法

全世界のインターネット上には、たくさんの人がいます。
そして、家庭内でもルーターに様々な機器が接続されています。

なので、送信先を決めるには、機器それぞれにIDや住所のようなものを割り当てる必要があります。
そのIDや住所にあたるのがIPアドレスです。

世界中にいる人(ルーター)を区別するIPアドレスを、グローバルIPアドレス
家庭内で機器を区別するIPアドレスを、ローカルIPアドレスと言います。
(ローカルIPアドレスは、10.0.0.0〜10.255.255.255、172.16.0.0〜172.31.255.255、192.168.0.0〜192.168.255.255 の範囲と決まっています。普通の家庭では192.168.x.xです。)

インターネットでは、どのルータにデータを送信するかをグローバルIPアドレスで指定して、ルーターからどの機器にデータを送信するかをローカルIPアドレスで指定します。
ルータの外(WAN)から、ローカルIPアドレスを指定して送信することは不可能です(どのルーターに転送すればよいのかわからないため)
ですが、ルーターの内(LAN)から、ローカルIPアドレスを指定して送信することはできます。

だから、他の人にサーバーに入ってもらうときはグローバルIPアドレス、自分が入るときはローカルIPアドレスを指定するのですね。

また、IPアドレスのほかにもポート番号(のちに解説)もセットで指定します。

(茶色はグローバルIPアドレス、黄緑はローカルIPアドレス、矢印は経路を表している)
(ポート番号は省略しています)

このようにWANからはローカルIPアドレス(192.168.1.3)がわからない
PCからデータを送信するとき、自宅のルーターを経由するので、自宅ルーターにつながっている192.168.1.3を認識できる。

※外部からルーターの通信を受け取った後、どのローカルIPアドレスに転送するのかは、ポート番号で判断します(のちに解説)

ポート番号とは?

PCやスマホを使って作業するとき、ブラウザで音楽を流しながら、ゲームをしたりすると思います。
このようにインターネットを使うときは、様々な通信を同時に行っています。

その通信の種類(データをどのプログラムに送るのか)の区別は、ポート番号という番号を使って行っています。

LAN内での通信

データのやりとり

コンピューター同士の通信は、依頼(要求を出す)を受け取ると、要求を処理して、場合によっては返信(要求の実行結果を返す)を行って通信しています。

手紙に例えると、Aさんが送ったラブレター(要求を出す)を、受け取ったBさんが中身を読んで付き合うかどうかを決めて(要求を処理)、場合によっては付き合うかどうかを返信する(要求の実行結果を返す)という感じです。

こうしてまた一つのカップルが生まれるのであった…ふざけるな

この時、要求を出すAさんをクライアント、要求を処理するBさんをサーバーと言います(P2P方式という通信では、両方ともピアと呼ぶ)

IPアドレスとポート番号を使った通信

いきなり世界中とのネット通信について考えると頭が混乱するので、まずはLAN内での通信について考えます。

例としてマイクラサーバーをPC2(アドレス 192.168.1.3)で起動して、同じLAN内のPC1(アドレス 192.168.1.2 クライアント)から接続するとします。

まず、PC2でサーバーを25565番ポートで起動しますね。
PC1では、接続先を「192.168.1.3(:25565)」としてサーバーに接続します。
(本来は、接続先は「IPアドレス:ポート番号」で指定しますが、マイクラは通常25565番で開くので、その場合はポート番号の省略が可能です)

この時、意識しないですがPC1ではサーバーとの通信に使う一時的なポート50000番を開きます。
この一時的なポートを短命ポートと言い、接続するたびにランダムな空き番号が割り当てられます

このようにして通信を開始すると、PC1→PC2では「送信元 192.168.1.2:50000」「送信先 192.168.1.3:25565」、PC2→PC1では「送信元 192.168.1.3:25565」「送信先 192.168.1.2:50000」でデータをやり取りします。

PC1が通信を切るとPC1の50000番ポートは閉じられますが(不要になるため)、PC2の25565番ポートは閉じられません(接続を待機しないといけないため)

遠く離れた人との通信

データを適切な端末に転送するNAPT

ルーターの下(LAN内)では、スマホやPCなど、様々な機器が存在しています。
外部からデータを受け取るとき、ルーターを介して受け取っていること(ローカルIPアドレスを使って直接通信できないこと)をチラっと説明しました。
外部と通信するとき、IPアドレスとポート番号を指定してルーター同士が通信しますが、外部からデータを受け取るとき、どうやってどの端末に送信するかを決めているのでしょうか?

ルーターに来たデータを適切な端末へ転送する仕組みをNAPT(またはIPマスカレード)と言います(少し意味が違いますが、初心者向けにわかりやすく説明しています)
ちなみにポート開放というのは、静的NAPTというもの(のちに説明)の設定をすることです

LAN内から通信を開始したとき

外部に要求を送信し、要求の処理結果を受け取るとき、動的NAPTという仕組みを利用します。

グローバルIPアドレス200.200.200.200を持っている人が、自宅内のクライアントPC(アドレス 192.168.1.2)から世界のどこかのサーバーPC(アドレス 100.100.100.100 ポート番号25565)と通信するとします(サーバー側のルーターが通信を受け取った後の通信は次に説明します)

まずクライアントPCが短命ポート50000番を通信用に確保します。
データの送信元は「192.168.1.2 ポート番号50000」で、送信先は「100.100.100.100 ポート番号25565」となります。

そのデータをLAN内(自宅)のルーターが受け取ると、送信元を「200.200.200.200 ポート番号12345」(ポート番号は接続するたびに変わります)、送信先を「100.100.100.100 ポート番号25565」に書き換えます。
この機能を動的NAPTと言います。

サーバーがそのデータを受け取って、処理をした後、自宅にあるルーターへと返信します(送信元「100.100.100.100 ポート番号25565」・ 送信先「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 ポート番号25565」・ 送信先「192.168.1.2 ポート番号50000」に書き換えられ、クライアントPCへ送信されます。

そうすると無事、クライアントPCへとデータが返ってきました。

LAN外から通信を開始したとき

ポート開放とは

LAN外から接続してもらうとき、通信するポートは決まっているので(マイクラなら25565番、httpなら80番など)、あらかじめ何番のポートをどのローカルIPアドレスの何番に転送するかを設定しておく必要があります(もしポート番号が色々だと、どのポート番号と通信すればいいのかわからないから)

その設定のことを静的NAPT設定、IPマスカレード設定、もしくはポート開放と言います。
ということは、本来ポート開放とは、「ルーターの〇番に来たデータを、ローカルIPアドレス○○.○○.○○.○○の〇番に転送するようにする設定すること」ということになりますね。
サーバーを公開するときは、通信するポート番号を決める必要があるから、人が手動で設定する必要があるのですね。
(また、設定していない場合[ポート開放していない場合]、勝手にデータを送られても自動遮断してくれるので、そういう意味でもこの機能は役に立ちますね)

このように人が手動で固定し、勝手に設定が変わらないため、静的と言われます。
(それに対し、動的NAPTは通信を開始するたびに設定が変わるため、動的と言われます)

静的NAPTを使った通信

さて、本題に戻ってLAN外(他人)から通信を開始してもらうときの通信の仕方を見ていきましょう。
(前セクションで言えば、あいまいにしていた「サーバー」での通信ですね)

条件は前と同じで、サーバー側ではあらかじめポート開放(静的NAPT設定)をしているとします(ルーターの「25565番」に来たデータを、サーバーPCの「192.168.10.2」の「25565番」に転送する設定)

サーバー側のルーターが、送信元「200.200.200.200 ポート番号12345」・送信先「100.100.100.100 ポート番号25565」のデータを受け取ると、静的NAPTの設定を参照します。
もし、25565番の設定がある場合、その設定をもとに転送します。
もし、25565番の設定が無い場合、データは破棄されます。
今回は25565番の設定があるので、データが送信先「192.168.10.2 25565番」に書き換えられて送信されます

サーバー用PCがそのデータ(要求)を取得すると、要求を処理して、場合によっては返信します。
返信する場合、返信するデータは送信元「192.168.10.2 25565番」送信先「200.200.200.200 12345番」で送信します。

サーバー側ルーターが返信を受け取ると、先ほど「200.200.200.200 25565番」を「192.168.10.2 25565番」に変換していたので、送信元の「192.168.10.2 25565番」を「200.200.200.200 25565番」に変換して、クライアントへ返信します。

まとめ

今回は、ネットワーク機器同士がどうやって通信をしているのか?ということを、IPアドレスやポート番号に着目しながら疑問を解決していきました。

今記事の内容をまとめると以下の通りです

  • 通常は、ルーターを介して通信している
  • IPアドレスによって、どこに送信するかを決めている
  • ポート番号によって、どのプログラムの通信なのかを判断している
  • LAN内の機器とWANの機器同士の通信は、NAPTという機能を使って、IPアドレスとポート番号を適切に変換して行っている

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




<NPサーバー>

マインクラフトサーバーを運営しています!

  1. 統合版、Java版どちらでも参加できます!
  2. 経済、サバイバル、PvP(実装中)など、様々な遊び方があります。
  3. 年齢は問いません!

是非ご参加ください!!
https://novablog.work/minecraft-server/

にほんブログ村

ブログランキング・にほんブログ村へ