パソコン実習室
アドレスとポート
≪ previous  

V.ポート番号

 ホストは提供するサービス(ホームページ、メール等)に応じたアプリケーションが常時稼働していて、複数のアプリケーションが稼働しているホストもあります。

 宛先(最終目的のホスト)まで届いたパケットは、適切なアプリケーションに渡される必要があります。適切なアプリケーションを判断するための情報をポート番号と言い、パケットには必ずポート番号を記載することになっています。
 ポート番号はアプリケーション毎に割り当てられています。


V.1.ポート番号の種類

 パソコンやサーバーでは同時に複数のアプリケーションが稼働しています。ポート番号はそうした環境でアプリケーションを識別するために用いられます。

 ポート番号はパケットに記載される16ビットの整数値で 0番 から 65,535番まであり、番号によって次の3種類に分類されます。
  • 0番 〜 1,023番
    ウェルノウン ポート番号(well known port numbers)
    IANAが使用目的(対応するアプリケーション)を定めています。
  • 1,024番 〜 49,151番
    登録ポート番号(registered port numbers)
    使用目的の申請をIANAが受け付けて公表しています。
  • 49,152番 〜 65,535番
    動的ポート番号(dynamic/private port numbers)
    自由に使用できるポート番号として開放されています。
代表的なTCP(UDP)のウェルノウン ポート番号は次の通りです。
ポート番号適用
20ftp-data:ファイル転送データ
21ftp:ファイル転送コントロール
25smtp:メール送信
53 (udp)dns:ドメイン名問い合わせ
ポート番号適用
80http:webアクセス
110pop3:メール受信 ver.3
123ntp:時刻合わせ
443https:高セキュリティのhttp
◎ UDP(User Datagram Protocol)は速度優先の仕様で、データの信頼性はアプリケーションが担います。

ポート番号の一覧はIANAのサイトで見ることができます。

V.2.ポート番号による識別

 あるユーザーがサーバーのホームページを見ようとしています。要求パケットがサーバーに送られますが、もしこの時ポート番号がない状況だとしたら、サーバーではパケットの受取人が不明となる事態(パケットは破棄)になります。

 パケットの送受信を適格に行うには、パケットを処理するアプリケーションを双方で識別可能にする仕組みが必須です。サーバー側は公表されているウェルノウン ポート使用し、ユーザー側は動的ポートの中から選んだポート番号を要求の際に通知する方法が採用されています。
 TCP/IP通信で宛先を指定するには、IPアドレスとポート番号のセットが基本になります。

(1)ユーザー側が仮にポート番号として50000を選択した場合、次の情報を記載した要求パケットが送信されます。
  • 宛先ポート番号:80 (ウェルノウン ポート)
  • 待受ポート番号:50000 (動的ポートからランダムに選択)
(2)サーバーでは宛先ポート番号 80 を参照して、そのパケットのデータをHTTPを受け持つアプリケーション(httpd等)に渡します。
 httpdが処理・作成した応答データを基に、サーバーは宛先ポート番号が50000(要求パケットの送信元)の応答パケットを完成させて送信します。
 応答パケットを受け取ったユーザー側では宛先ポート番号 50000 を参照して要求元であるブラウザにデータが届けられます。
◎ ユーザーのパソコンで複数のアプリケーションが同時に通信を行っていても、それぞれ使用しているポート番号が異なるので受信したパケットは適切なアプリケーションに渡ります。

 IPアドレス、MACアドレス、ポート番号の関係は、
IPアドレスを会社の所在地、ポート番号を実務担当者、MACアドレスを荷物(パケット)の中継を行う物流ターミナルに例えると分かり易くなります。



 パソコンが選択する動的ポート番号の範囲は netsh コマンドで表示することができます。下記はTCPプロトコルの動的ポートの範囲を表示したものです(windows10の例)。
C:\>netsh int ipv4 show dynamicport tcp

プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート: 49152
ポート数: 16384
◎ UDPプロトコルの動的ポートの範囲も同様に表示できます。

 ウェルノウン ポートを必要とするのはサーバーです。クライアント(ユーザー)の要求を待ち受けるには公開されている情報(番号)を使う方が便利だからです。一方クライアントは待ち受けるポート番号を、要求パケットに記述してサーバーに知らせれば済むことなので、動的ポート番号の中からランダムに選んだ番号を使います。

 パソコンが使っているポート番号は netstat コマンドで知ることができます。
C:\>netstat -no

アクティブな接続

プロトコルローカル アドレス外部アドレス状態PID
TCP127.0.0.1:5354127.0.0.1:49681ESTABLISHED3496
TCP127.0.0.1:49681127.0.0.1:5354ESTABLISHED908
TCP192.168.1.2:50004  104.78.93.174:80CLOSE_WAIT3304
TCP192.168.1.2:50507219.103.130.73:80CLOSE_WAIT8580
◎ アドレスの末尾はポート番号。状態は、ESTABLISHED:使用中、CLOSE_WAIT:終了待ち。
◎ PIDはプロセスID。タスクマネージャー[詳細表示]-[詳細タブ]のPIDと対応しています。


V.3.ポート番号も変換 - NAPT

【 NATで対応できるのは1台だけ 】
 [T.4.LANの内と外を中継する]で、家庭用ルーターが備えているアドレス変換機能をNATであると説明しましたが訂正が必要です。
NATは、外部(グローバル)IPアドレスと、内部(プライベート)IPアドレスを1対1で変換する機能です。家庭用ルーターのインターネット側に設定した(割り当てを受けた)グローバルIPアドレスの数を超えるプライベートIPアドレスには対応できません。

 分かり難いので例え話で説明します。
 右の図ではグローバルIPアドレスが1つだけ割り当てられています。
ここで、NAT機能を備えた家庭用ルーターが、上記の制約を破って複数ユーザーのアドレス変換を行ってしまった場合を考えます。

 ユーザーAとユーザーBが同時にインターネットへアクセスすると、家庭用ルーターのNAT管理テーブルには下記のような内容が記録されます。
NAT管理テーブル
内部アドレス外部アドレス
192.168.1.2123.45.67.89
192.168.1.3123.45.67.89
 その後インターネット側から応答パケットが届くと(上図の赤矢印)、家庭用ルーターはパケットの宛先IPアドレス欄を内部アドレスに書き換える動作に入ります。
 宛先IPアドレス欄に書かれていた123.45.67.89(外部アドレス)をキーとしてNAT管理テーブルを検索し、対になっている内部アドレスに書き換えようとしますが、ここで困ったことが起こります。
 NAT管理テーブルが上記のような状態になっていると、宛先IPアドレス(123.45.67.89)の変換対象になる内部アドレスが2つ存在することになり、適切な変換処理ができなくなってしまうのです。
そこで機能を拡張したNAPTが登場します。

【 複数ユーザーにはNAPT 】
 実際の家庭用ルーターが備えているのはNAT機能を拡張したNAPT※1(Network Address Port Translation:ネットワークアドレスポート変換)と呼ばれる機能で、ポート番号も変換対象とすることで、1つのグローバルIPアドレスと複数のローカルIPアドレスの相互接続を仲介します。

※1 NAPTの技術はこの外にIPマスカレード、アドバンスドNAT等々様々な名称で呼ばれます。特にIPマスカレードはLinuxに実装されて広まった経緯から広く浸透しています。
家庭用ルーターはNAPTの機能を備えています。NATとNAPTは本来別物ですが、説明書等に書かれているNATの記述は、NAPTを指している場合がほとんどです。

 家庭用ルーターがパケット内のIPアドレスとポート番号が書き変えることで、複数ユーザーのインターネット通信を可能にしている様子は概ね次のようになります。
◎ 家庭用ルーターに割り当てられているグローバルIPアドレスは 123.45.67.89 と仮定します。
◎ LAN内を行き交うデータは本来フレーム(MACアドレスを使用)になりますが、ここでは省略しています。

(1) ユーザーAがwebサーバー(IPアドレス:219.103.130.3)のホームページ閲覧を始めました。OSは空いている動的ポート番号(51111)をブラウザのポートとして選択し、通信文(ホームページの要求)と制御情報(IPアドレス、ポート番号等)をパケットに書き込んで送出します。webページ アクセスなので宛先ポート番号は 80 です。
◎ webサーバーのURLからIPアドレスを検索する方法は「アドレス検索-DNSの話」を参照して下さい。
(2) 家庭用ルーターは要求パケットの送信元IPアドレス(192.168.1.2)と送信元ポート番号(51111)をピックアップして、NAPT管理テーブルの内部IPアドレス・内部ポート番号と比較※2します。同じ内容の組み合わせが無ければ新規の通信と判断、外部通信用に動的ポート番号を選択(60001)して割り当て、インターネット側のIPアドレス(123.45.67.89)と共に管理テーブルに記録※3します。
(3) 家庭用ルーターは要求パケットの送信元IPアドレスと送信元ポート番号を外部通信用(123.45.67.89と60001)に書き換えてインターネット側へ送信します。
◎ 前項(2)の検査で同一内容の記録を検出した時は、一致したレコードの外部IPアドレス・ポート番号を
  適用して書き換えます。
(4) ユーザーBはメール受信を始めました。ユーザーBが使うメール サーバーのIPアドレスは 99.100.11.22 です。OSは空きポート番号(52222)をメール アプリケーション用に選択し、通信文(メール受信要求)と制御情報(IPアドレス、ポート等)をパケットに書き込んで送出します。メール受信なので宛先ポート番号は 110 です。
◎ メール サーバーのURLからIPアドレスを検索する方法は「アドレス検索-DNSの話」を参照して
  下さい。
(5) 家庭用ルーターは要求パケットの送信元IPアドレス(192.168.1.3)と送信元ポート番号(52222)をピックアップし、NAPT管理テーブルの内部IPアドレス・内部ポート番号と比較します。同じ内容の組み合わせが無ければ新規の通信と判断して外部通信用に動的ポート番号を選択(60002)して割り当て、インターネット側のIPアドレス(123.45.67.89)と共に管理テーブルに記録します。
(6) 家庭用ルーターは要求パケットの送信元IPアドレスと送信元ポート番号を外部通信用(123.45.67.89と60002)に書き換えてインターネット側へ送信します。
◎ 前項(5)の検査で同一内容の記録を検出した時は、一致したレコードの外部IPアドレス・ポート番号を
  適用して書き換えます。

 要求パケットを受信したサーバーは要求内容に応じて処理を実行し、その結果を応答パケットにして送り返します。下図はwebサーバーが応答パケットを返した時の概略です。
(7) webサーバーは要求されたホームページのデータを応答パケットにして送り返します。この時、応答パケットの宛先IPアドレスと宛先ポート番号には、要求パケットに記述されていた送信元のIPアドレス(123.45.67.89)とポート番号(60001)がそのまま入ります。
◎ webサーバーは応答パケットを家庭用ルーターあてに送ります。
(8) インターネット側からパケットを受信した家庭用ルーターは、受信したパケットの宛先IPアドレス(123.45.67.89)と宛先ポート番号(60001)をピックアップし、NAPT管理テーブルの外部IPアドレス・外部ポート番号と比較※4検出します。同じ内容の組み合わせがあれば正規な応答として処理を続行、検出されなければ不正アクセス※5と判断してそのパケットは破棄します。
(9) 家庭用ルーターは比較・検出したレコードの内部IPアドレス(192.168.1.2)と内部ポート番号(51111)をピックアップし、その値で応答パケットの宛先IPアドレスと宛先ポート番号を書き換えてLAN側へ送信します。
(10) 応答パケットを受信したユーザーAのOSは、宛先ポート番号(51111)参照して要求元のアプリケーションを判別し、パケットの本文(ホームページのデータ)をブラウザに渡します。※6

※2 比較検査の対象となる項目はこの2項目以外に、プロトコル種類(TCP or UDP)、宛先のアドレスやポート番号等があってメーカーや製品ごとに異なるようです。
※3 NAPT管理テーブルに記録する項目候補は上記説明図の4件の外に、プロトコル種類(TCP or UDP)、宛先IPアドレス、宛先ポート番号等があります。実際に記録する項目はメーカーや製品ごとに異なるようです。
NAPT管理テーブル リストの1行をここではレコードと呼んでいます。
レコードにも有効期限があって有効期限を過ぎたレコードは削除されます。有効期限は数十秒〜数日のようです。
※4 比較検査の対象となる項目はこの2項目以外に、プロトコル種類(TCP or UDP)、送信元のアドレスやポート番号等があってメーカーや製品ごとに異なるようです。
※5 外部からのアクセスを許可できる家庭用ルーターもあります。LAN内部に公開用のサーバーを設置した場合などに、条件を決めて内部へのアクセスを許可します。
※6 同一パソコン内で複数のブラウザやアプリケーションが同時に通信を行っていても、それぞれ割り当てられているポート番号が異なるので受信データの受け渡しは適切に行われます。





≪ previous [[ アドレスとポート ]]