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

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

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

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

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

(なお、IPv4とIPv6では通信の仕方が多少異なるため、この話の一部はIPv6の場合には当てはまりません。)

IPv4とIPv6の違いについて
(少しややこしい話なので、読み飛ばしていただいても構いません)
IPv4では、LAN(家庭内のネットワーク)の機器にはグローバルIPアドレス(世界中のネットワーク上にある機器を識別するための住所)が割り当てられませんが、IPv6ではインターネットにつながっている全ての機器にグローバルなIPアドレスを割り当てられます。
なので、IPv6では今記事で説明するNAPTを利用する必要が無くて、ポート開放も不要です。
代わりにパケットフィルタリング設定(データを許可するかしないかの設定)をする必要があります。

通信先の決め方

ルーターとは?

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

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

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

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

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

ONUについて
ルーターと外部のインターネットは、最近は光回線で結ばれています。
光回線の信号を変換するONUというものがありますが、ONUは信号の変換だけ行っているので、今回の図以降は省略します
ポート開放等においてもONUはあまり気にする必要はありません

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

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

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

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

世界中にいる人(ルーター)を区別するIPアドレスを、グローバルIPアドレス
LAN内で機器を区別する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アドレスはLAN内機器に割り当てられない
グローバルIPアドレスはルーターにのみ付与されて、LAN内の機器には割り当てられません(IPアドレスの不足を抑制するためです)
つまり、世界中のインターネットと直接つながっているのはルーターだけです。
したがって、LAN内の機器が外のインターネットと通信する場合、必ずルーターを経由します。

インターネットでは、どのルーターにデータを送信するかをグローバルIPアドレスで指定して、LAN内のどの機器にデータを送信するかをローカルIPアドレスで指定します(詳細は「データを適切な端末に転送するNAPT」)

外部(WAN)から、ローカルIPアドレスを指定して送信することは不可能です(WANからはLAN内の機器が認識されないから)【緑色矢印】
ですが、内部(LAN)から、ローカルIPアドレスを指定して同じLAN内の機器に送信することはできます(経由する自宅のルーターはLAN内機器を認識しているから)【青色矢印】

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

(黒色がローカルIPアドレス、赤色がグローバル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/」で接続しても同じサイトに繋がります。

この時、意識しないですがスマホ(クライアント)が自動的にサーバーとの通信に使う一時的なポートを開きます(ここでは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番」に書き換えられて送信されます

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

サーバー用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アドレスとポート番号を適切に変換して行っている

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