今日のインターネットの根幹をなすTCP/IPプロトコルスタックのうち、トランスポート層のプロトコルであるTCPとUDPについての基本的な知識を説明する。

本記事は研究室の輪講で「マスタリングTCP/IP 入門編」を読んだことがきっかけの第2回。 前回はTCP/IPプロトコルスタック全体についての概要を書いた。

  • 参考文献: マスタリングTCP/IP入門編 第6章 pp219-246

もくじ

  • トランスポートプロトコルの役割
  • ポート番号
  • TCP と UDP
  • TCP の様々な制御

トランスポートプロトコルの役割

トランスポート層の役割は主に3つある。

  1. End-to-End の通信を実現すること。
  2. アプリケーションプログラム間での通信を可能にすること
  3. (TCP では) 信頼性のある通信を実現すること

これらの役割を、他層との関係とともに説明する。 参考として、TCP/IPプロトコルの階層モデルを示す。

OSI参照モデルとTCP/IP階層モデル

1. End-to-End の通信を実現すること。

トランスポート層は、End-to-End の通信を実現する。

トランスポート層の下位に位置するインターネット層では、IP を中心に hop-by-hopでパケットをバケツリレーのように渡し続けながら通信する。

トランスポート層はこれを隠して、ユーザが中継のルータなどを意識せず済むよう、 End-to-End で通信しているようにみせる。

2. アプリケーションプログラム間での通信を可能にすること

通信ホストは、複数のアプリケーションを用いて同時に異なる通信する。

トランスポート層ではポート番号という識別子を用いて、アプリケーション (実際にはプロセス) ごとに通信を識別し、各アプリケーションが他のアプリケーションの通信を意識せずに使えるようにする。

3. (TCP では) 信頼性のある通信を実現すること

TCP を用いると、パケットを再送することをはじめとして様々な制御を行ってくれる。 これによって上位のアプリケーション層からは、特に意識せずとも信頼性のある通信を行える。

ポート番号

端末内で通信するプロセスを指定するために用いられる識別子。 IP アドレスと合わせて使われる。

ポート番号を含む次の5つが全て揃うことで通信を識別する。

  • 宛先 IP アドレス
  • 送信元 IP アドレス
  • 宛先ポート番号
  • 送信元ポート番号
  • トランスポートプロトコルの種類 (IP ヘッダのプロトコル番号フィールド)

ポート番号の通信例

例えば、私の PC で、次の2つのWebページを同時に閲覧することを考える。

このとき、私の PC から、埼玉大学の Web サーバへ通信が発生する。つまり同じ送信元から同じ宛先へ別々の通信が発生する。

ページ 宛先IPアドレス 宛先ポート番号 送信元IPアドレス 送信元ポート番号 プロトコル
A 153.127.197.67 80 203.0.113.1 49152 TCP
B 153.127.197.67 80 203.0.113.1 49153 TCP

ページを開く要求をしたときに、ブラウザのタブごとに(=プロセスごとに)違うポート番号を使えば、別々の通信を識別できるというわけだ。 (実際には、送信元に帰ってきたパケットがどのプロセス宛のものであるかを、OS がポート番号で識別し、プロセスに処理が渡る。)

ポート番号の割当

(0-1023) Well-known Port Number

ポート番号には事前に予約された Well-known Port Number というものがある。

上位レイヤーのプロトコルのうち一般的なものが使うポート番号を 0-1023 番に定めている。 例えば HTTP は 80 番, HTTPS は 443 番, SSH は 22 番, 等。

Well-known Port Number を他の用途に用いることもできるが、混乱を避けるために避けるのが無難。

参考: Well-known Port Number の割当 - IANA

(1024-49151) その他の登録済みポート番号

Well-known Port Number 以外にも登録されたポート番号がある。 ただしこちらは他の用途に使ってもそれほど問題が起きにくい。

(49152-65535) 動的割当のポート番号

前節では用途が決まったポート番号であった。 これらは一般に、サーバ側のポート番号として使われる。1 何故なら、クライアント側からどのポートに繋げば良いのか事前に知っている必要があるからだ。 例えば Web ページを見るときはふつう、Web サーバは 80 番 (HTTP) か 443 番 (HTTPS) で待ち受けていることを前提に通信を開始する。

一方クライアントは特にポート番号が定まっている必要はない。 特に値が重要でない場合は、ポート番号の管理を OS に委ねることができる。 このような動的な割当は 49152-65535 の範囲で割り当てられるのが一般的だ。

TCP と UDP

トランスポートプロトコルの代表的な2つのプロトコル、TCP と UDP の違いについて説明する。

TCP (Transmission Control Protocol)

TCPは次のような特徴を持つ

  • 伝送、送信、通信を制御する
  • コネクション型2
  • 信頼性のある通信をするために様々な制御を含む含む

TCPを使うと、アプリケーションは様々な制御から開放される。 ただしコネクションの確立/切断にコストがかかる。 よって、信頼性を要求し大容量のデータを交換する多くの通信に向くが、全ての通信に適しているわけではない。

UDP (User Datagram Protocol)

UDP は次のような特徴を持つ

  • 複雑な制御をしない
  • コネクションレス型
  • いつでもデータを送信可能
  • 高速に動作する

同報性が要求されたり、アプリケーションが細かい制御を行う通信はUDPで行うのが好ましい。 次のような用途に用いられている。

  • 総パケット数の少ない通信。 (DNS, SNMP)
  • 動画や音声などのマルチメディア通信 (即時性を求める通信)
  • ブロードキャストやマルチキャストの通信。 (1対Nの通信)

TCP の様々な機能

TCP には信頼性を保証するために次のような機能を持つ。

  • コネクションの管理 ... (通信相手がいるかどうかの確認)
  • 再送制御 ... (パケットが喪失した際に必要)
  • 重複制御 ... (パケットが2十二届いた際に必要)
  • 順序制御 ... (パケットの順序が入れ替わった際に必要)
  • フロー制御 ... (受信能力に合わせた送信を行う)
  • 輻輳 (ふくそう) 制御 ... (ネットワークの混雑を避ける)

これらの実現のために必要な仕組みとして、次のような技術を説明する

  • コネクションの確立/切断
  • 確認応答
  • シーケンス番号 (再送制御, 重複制御, 順序制御に用いられる)
  • ウィンドウ (ネットワークの効率を高め, フロー制御や輻輳制御にも用いられる概念)

コネクションの確立/切断

確認応答

シーケンス番号

ウィンドウ

まとめ

トランスポートプロトコルの役割は次の3つであった。

  1. End-to-End の通信を実現すること。
  2. アプリケーションプログラム間での通信を可能にすること
  3. (TCP では) 信頼性のある通信を実現すること

2を実現するためにポート番号があり、3を実現するために様々な制御があることを紹介した。

以上。


追記: (2020/10/04) 前回記事へのリンクを相対リンクへ修正

Footnotes

  1. TCP/IP ではクライアント-サーバモデルの通信が多い。

  2. コネクションとは、二者間で専用して使用できる仮想的な回線のこと。