Pict2.ポート番号でプログラムを識別する
Pict2.ポート番号でプログラムを識別する
[画像のクリックで拡大表示]
Pict3.シンプルなUDPヘッダー
Pict3.シンプルなUDPヘッダー
[画像のクリックで拡大表示]

 TCPとUDPのヘッダーでパケットをどのプログラムに渡すかを識別するために使う情報がポート番号です(pict.2[拡大表示])。TCPとUDPのヘッダーでは,ポート番号用にあて先と送信元のそれぞれ16ビットが割り当られています。10進数で表すと0~65535までの数値を指定できます。ポート番号は,0~1023,1024~49151,49152~635535の三つの範囲に分けて使われています。

ポート番号でアプリケーションを識別する

 送信元コンピュータのアプリケーション・プログラムは,届けてほしいアプリケーションのポート番号をあて先ポートに指定してパケットを送ります。パケットを受け取ったコンピュータではあて先ポート番号に対応するアプリケーションにパケットを渡します。つまりTCPやUDPでは,送信者は受信者のポート番号をパケットにセットして送信するわけです。

 こうした方式なので,送信者は最初のパケットを送信する前に,どの番号に送れば目的のプログラムに届くかを知っておく必要があります。通信の始まる前に何らかの方法で通知してもらう方法もありますが,Webサーバーやメール・サーバーのように不特定多数の利用者からアクセスされるサーバー・プログラム(サービス)で,通信前に利用するポート番号をいちいち通知するのは手間がかかりすぎます。

 そこで,利用頻度の高いサービスはあらかじめ使うポート番号を決めてあります。これを周知ポート(Well-Known Port(ウエルノウンポート))と呼び,0~1023までの番号がTCPとUDPそれぞれで予約されています。例えば,Webサーバーのポート番号はTCPの80番,メール・サーバーにメールの送付を依頼するときはTCPの25番,DNS(domain name system)サーバーの問い合わせに使うのはUDPの53番といった具合です。これに加え,1024~49151までのポート番号もいろいろなアプリケーションで利用すると了解されています。

 なお,最初にアプリケーション・プログラムがサービスに対してパケットを送るとき,ほかの通信と重複しない適当な番号を送信元ポート番号に付けて送ります。こうすれば,相手がそのポート番号あてにパケットを返信できるからです。サーバーのプログラムは受け取ったパケットの送信ポート番号をあて先ポート番号に指定して返信パケットを送ることで,元のアプリケーションに届きます。このときの送信元ポート番号には49152~65535が使われます。

UDPのヘッダーはシンプル

 最後にTCPとUDPのパケットのヘッダー構造をみてみましょう(pict.3[拡大表示])。UDPヘッダーはとてもシンプルです。あて先と送信元のポート番号,UDPパケットのサイズ,そしてチェックサムのフィールドがあり,それぞれに16ビットが割り当てられています。UDPヘッダー全体では64ビット,つまり8バイトになります。

 あて先と送信元のポート番号の使い方はこれまで説明しましたので,残りのフィールドの機能を簡単に説明しましょう。UDPパケットのサイズとチェックサムは,あて先に届いたUDPパケットに途中で失われたり,ビット誤りが混じっていないか確認するための情報です。

 チェックサムでは2進数でマイナスの数を表現する「1の補数」という考え方を使って計算した値が書き込まれています。受信側では,ヘッダーを含むパケット全体を16ビットずつ区切り,それを次々と足していきます。ビット誤りがなく正しくデータが届いていれば,答えが「0」になるしくみになっています。

 TCPのヘッダーはUDPに比べると複雑です。送信元とあて先ポート番号,チェックサムといったフィールドの働きはUDPの場合と同じです。これ以外のフィールドは,おもに通信の信頼性を確保するために使われます。TCPヘッダーのフィールドがどのような機能を果たすかについては,次回から詳しく説明しましょう。


●筆者:水野 忠則(みずの ただのり)氏
静岡大学創造科学技術大学院 大学院長・教授。情報処理学会フェロー,監事。現在の研究分野はモバイル&ユビキタス・コンピューティング,情報ネットワークなど。
●筆者:佐藤 文明(さとうふみあき)氏
東邦大学理学部情報科学科教授。東北大学大学院工学研究科修了。現在の専門分野は通信ソフトウエアの開発方法,分散処理システムなど。
●イラストレータ:なかがわ みさこ
日経NETWORK誌掲載のイラストを,創刊号以来担当している。ホームページはhttp://creator-m.com/misako/