ポート番号とは
OSI参照モデルにおけるトランスポート層では、ネットワーク層から転送されたパケットを受け取って次にどのアプリケーションにパケットを渡せばいいのか識別しなければならない役割がある。
IPからトランスポートプロトコルにデータを渡すときに、IPからのデータには、IPヘッダーがついている。そのヘッダーの中で、どのトランスポートプロトコルにデータを渡したらよいのかが記されてる。
それと同様、IPから受け取ったデータをトランスポートプロトコルであるTUD,UDPでも自分が運んでいるデータが次にどのアプリケーションに渡すのか識別するために、番号が定義されている。
それをポート番号と呼ぶ。
このおかげで、コンピュータで複数動いているアプリケーションを識別したり、アプリが同時に行う複数の通信を識別できる。
それぞれのアドレスのまとめ
それぞれの層ではアドレスを持っている。
層 | データリンク層 | ネットワーク層 | トランスポート層 | |
---|---|---|---|---|
アドレス | MACアドレス | IPアドレス | ポート番号 |
通信の処理
サーバーとクライアント
TCP/UDP においてアプリケーションプログラムは、クライアント/サーバーモデルで作られている。
情報を要求する側が、クライアント。情報を提供する側がサーバーと呼ばれる。
サーバーは、常にプログラムを起動していて、クライアントからの要求に備えていなければいけない。でないと、情報を要求されたときにデータを返すことができない。
デーモン
UNIXでは、サーバープログラムをデーモンと呼ぶ。
例えば、HTTPのサーバープログラムは、httpd(HTTPデーモン)とよばれる。
要求がどのデーモンつまりサーバーに向けられたかは、受信したパケットの宛先ポート番号を調べればわかる。
TCPのコネクションの要求のパケットを受信した場合、ポート番号が23番ならtelnetdで、80番ならhttpdにコネクションを確立する。
そしてそれ以降の通信の処理をデーモンが待つことになる。
TCP,UDPのトランスポートプロトコルは、受信したデータが誰宛てかをこのポート番号から判断している。
ポート番号の割り振り
通信を行う前にポート番号を決定する必要がある。決定方法は二つある。
標準で決められている
静的に決められていて、あらかじめよく使われるアプリケーション事に割り振られている。(主にサーバー側)
これらの番号をウェルノウンポート番号(well-known Port Number)と呼ばれている。
ウェルノウン番号は、0~1023まで割り当てられているので、この番号を他のアプリケーションで使うことはできない。
詳しくどのように割り当てられているか見たい方は以下をご覧ください。
他にも正式に登録されているポート番号があり、1024~49151まで登録されている。しかしこちらは、ウェルノウンと違い他のアプリケーションに使っても問題ない。
動的(ダイナミック)に割り当てる方法
サービスを受ける側(クライアント)は、ポート番号が決まっていないので、自分で番号を決定せずに、OSに任せることができる。
OSは、番号が重複しないようにポート番号を割り当てる。
これにより、同じクライアントプログラムから複数のTCPコネクションを確立した場合でも、識別可能になっている。
動的に割り当てるポート番号は、49152~65535までの番号が割り当てられている。しかし、多くのシステムでは、これを無視して1024以上の使われていないポート番号が順番に利用されている。
ポート番号とプロトコルの依存性
ポート番号はしようされるトランスポートプロトコルごとに決定される。
つまりTCPとUDPでは、同じポート番号をそれぞれ別の目的で使うことが可能。
データがIP層(ネットワーク層)に到達すると、IPヘッダ中のプロトコル番号がチェックされ、それぞれのプロトコルへ渡される。
TCPならTCPモジュール、UDPならUDPモジュールがポート番号を処理することになる。
プロトコルごとに独立した処理を行うため、プロトコルごとに同じポート番号を使用することができるということである。
ウェルノウン番号に関しては、プロトコルに関係なく設定されている。なので、80はHTTPとTCPもUDPでも決まっている。
まとめ
ポート番号とは、トランスポート層がどのアプリケーションにIP層から受け取ったデータを渡すかを識別するための番号である。
参考
マスタリングTCP/IP