コンピュータネットワークにおいて、ポートとは通信のエンドポイントです。オペレーティングシステム内のソフトウェアレベルでは、ポートは特定のプロセスまたはネットワークサービスの種類を識別する論理的な構成要素です。ポートは、トランスポートプロトコルとネットワークIPアドレスの組み合わせに関連付けられたポート番号という番号によって一意に識別されます。ポート番号は16ビットの符号なし整数です。
ポート番号を使用する最も一般的なトランスポートプロトコルは、伝送制御プロトコル(TCP)とユーザーデータグラムプロトコル(UDP)です。ポート番号は、ホスト内のメッセージの宛先アドレスと送信元アドレスを補完し、オペレーティングシステムのプロセスを指すようにします。
特定のサービスを識別するために、特定のポート番号が予約されています。これにより、到着したパケットを実行中のアプリケーションに容易に転送できます。この目的のために、1024未満のポート番号は、従来から最も一般的に使用されてきたサービスを識別し、「よく知られたポート番号」と呼ばれます。それより大きい番号のポートは、アプリケーションが一般的に使用するために利用可能で、「一時ポート」と呼ばれます。
ポートは、1つのネットワークアドレス上で複数のサービスまたは複数の通信セッションを多重化するサービスを提供します。クライアント/サーバ型のアプリケーションアーキテクチャでは、同じサービスに対して複数の通信セッションが同時に開始される可能性があります。
TCP と UDP の場合、ポート番号は 16 ビットの符号なし整数で、0 から 65535 までの範囲です。TCP の場合、ポート番号 0 は予約されており使用できませんが、UDP の場合、送信元ポートはオプションで、値がゼロの場合はポートなしを意味します。プロセスは、トランスポート プロトコル、 IP アドレスなどのネットワークアドレス、およびポート番号に関連付けられたファイル ディスクリプタの一種であるインターネット ソケットを介して、入力チャネルまたは出力チャネルを関連付けます。これはバインディングと呼ばれます。ソケットは、プロセスがネットワーク経由でデータを送受信するために使用されます。オペレーティングシステムのネットワーク ソフトウェアは、すべてのアプリケーション ポートからの送信データをネットワークに送信し、到着したネットワーク パケットを、パケットの IP アドレスとポート番号をソケットに一致させることでプロセスに転送するタスクを持っています。TCP の場合、特定の IP アドレスとポートの組み合わせにバインドできるプロセスは 1 つだけです。複数のプログラムが同じプロトコルで同じ IP アドレスの同じポート番号を使用しようとすると、ポート競合と呼ばれる一般的なアプリケーションの障害が発生します。
共通サービスを実装するアプリケーションは、クライアントからのサービス要求を受信するために、よく予約された既知のポート番号を使用することがよくあります。このプロセスはリスニングと呼ばれ、このリスニングポートを使用して、既知のポートで要求を受信し、場合によってはサーバーとクライアント間の1対1の対話を確立します。他のクライアントが同時に同じリスニングポートに接続することもできます。これは、TCP接続がローカルアドレス、ローカルポート、リモートアドレス、リモートポートからなるタプルによって識別されるためです。 [ 1 ] 既知のポートは、インターネット割り当て番号機関(IANA)が管理する慣例によって定義されています。多くのオペレーティングシステムでは、これらのポートはIPネットワークの動作に不可欠とみなされることが多いため、アプリケーションがこれらのポートにバインドするには特別な権限が必要です。逆に、接続のクライアント側は通常、短期間の使用のために割り当てられた高いポート番号を使用するため、一時ポートと呼ばれます。
IANAは、DNSルート、IPアドレス、その他のプロトコルリソースのグローバルな調整を担当しています。これには、よく知られたインターネットサービスで使用されるTCPおよびUDPポート番号の登録も含まれます。
ポート番号は、よく知られているポート、登録済みのポート、および動的ポートまたはプライベートポートの3つの範囲に分けられます。
よく知られているポート(システムポートとも呼ばれる)は、0から1023までの番号が付けられているポートです。この範囲での新規割り当ての要件は、他の登録よりも厳しくなっています。[ 2 ]
登録されているポートは1024から49151までです。IANAは、よく知られている登録済みのポート範囲の公式リストを管理しています。[ 3 ]
動的ポートまたはプライベートポートは、49152から65535までのポートです。この範囲の一般的な用途の1つは、一時的なポートです。
トランスポート層プロトコル(TCPやUDPなど)は、プロトコルデータユニット(PDU)を使用してデータを転送します。TCPの場合、PDUはセグメントであり、UDPの場合はデータグラムです。どちらのプロトコルも、送信元ポート番号と宛先ポート番号を示すためにヘッダーフィールドを使用します。ポート番号はトランスポートプロトコルパケットヘッダーにエンコードされており、送信側と受信側のホストだけでなく、ネットワークインフラストラクチャの他のコンポーネントでも容易に解釈できます。特に、ファイアウォールは、送信元ポート番号または宛先ポート番号に基づいてパケットを区別するように一般的に構成されています。ポートフォワーディングは、この例の一つです。
単一ホスト上の複数のポートに順番に接続を試みる行為は、一般的にポートスキャンと呼ばれます。これは通常、悪意のあるクラッキング攻撃、またはネットワーク管理者がそのような攻撃を防ぐために潜在的な脆弱性を探す行為に関連しています。ポート接続の試みは、ホストによって頻繁に監視され、ログに記録されます。ポートノッキングという手法では、クライアントコンピュータから一連のポート接続試行(ノック)を行い、サーバー上のポートを開いて接続を確立します。
ポートの使用例として、電子メールの配信が挙げられます。電子メールの送受信に使用されるサーバーは、通常2つのサービスを必要とします。1つ目のサービスは、他のサーバーとの間で電子メールを転送するために使用されます。これは、Simple Mail Transfer Protocol(SMTP)によって実現されます。標準的なSMTPサービスアプリケーションは、TCPポート25で受信要求を待ち受けます。2つ目のサービスは通常、Post Office Protocol(POP)またはInternet Message Access Protocol(IMAP)のいずれかであり、ユーザーのパーソナルコンピュータ上の電子メールクライアントアプリケーションがサーバーから電子メールメッセージを取得するために使用されます。POPサービスはTCPポート番号110で待ち受けます。両方のサービスが同じホストコンピュータ上で実行されている場合、ポート番号によって、リモートコンピュータ(ユーザーのコンピュータまたは別のメールサーバー)から要求されたサービスが区別されます。
サーバーのリスニングポート番号は明確に定義されていますが(IANAではこれをウェルノウンポートと呼んでいます)、クライアントのポート番号は多くの場合、動的ポート範囲から選択されます(下記参照)。アプリケーションによっては、クライアントとサーバーがそれぞれIANAによって割り当てられた特定のポート番号を使用する場合があります。その良い例がDHCPで、クライアントは常にUDPポート68を使用し、サーバーは常にUDPポート67を使用します。
ポート番号は、Webサイトやその他のURL( Uniform Resource Locator )の構成要素ですが、ほとんどの場合省略されます。デフォルトでは、HTTPはポート80を、HTTPSはポート443を使用しますが、URLによっては、デフォルト値ではなくHTTPサーバーのポート8080に接続するようhttp://www.example.com:8080/path/に指定できます。
ポート番号の概念は、ARPANETの初期開発者たちがソフトウェア作成者とシステム管理者の非公式な協力のもとで確立しました。ポート番号という用語はまだ使われていませんでした。ネットワークの初期開発段階では、ソケット番号という用語が使われていました。リモート ホストのソケット番号は 40 ビットの値でした。 [ 4 ]最初の 32 ビットは今日のIPv4アドレスに似ていましたが、当時は最上位 8 ビットがホスト番号でした。ソケット番号の最下位部分 (33 ビット目から 40 ビット目) は、 Another Eightbit Number (略称 AEN) と呼ばれるエンティティでした。[ 5 ]今日では、ネットワーク ソケットは、関連するものの異なる概念、つまりノード内でのみ使用されるエンドポイントの内部アドレスを指します。
1972 年 3 月 26 日、Vint CerfとJon Postel は、RFC 322 で当時の使用状況を文書化し、ソケット番号カタログを確立することを提唱しました。ネットワーク管理者は、「各ホストのネットワーク サービス プログラムの機能とソケット番号を説明する」メモを提出するか、電話をかけるよう求められました。[ 6 ]このカタログはその後 1972 年 12 月に RFC 433 として公開され、ホストとそのポート番号、およびネットワーク内の各ホストで使用されている対応する機能のリストが含まれていました。この最初のレジストリ機能は、主に使用状況の文書化として機能し、「有用な公共サービス」のために一部のホスト間でポート番号の使用が競合していることを示しました。[ 5 ]この文書は、Postel が 1972 年 5 月に RFC 349 で公開した標準に基づいて競合を解決することを約束しました。この標準では、ネットワーク サービスへのポート番号の公式割り当てを初めて提案し、レジストリを維持するための専用の管理機能 (彼がczarと呼んだもの) を提案しました。 [ 7 ] AENの256個の値は、以下の範囲に分けられました。
Telnetサービスは、値 1 の最初の公式割り当てを受けました。詳細には、最初の割り当てセットは次のとおりです。[ 7 ]
初期のARPANETでは、AENはソケット名とも呼ばれ[ 8 ] 、ネットワーク制御プロトコル(NCP)の構成要素である初期接続プロトコル(ICP)で使用されていました[ 9 ] 。NCPは現代のインターネットプロトコルの先駆けでした。今日でも、サービス名という用語はポート番号と密接に関連しており、前者は数値ポート番号を表すために一部のネットワーク機能で使用されるテキスト文字列です。