【OSI 参照モデル L4 トランスポート層】TCP/UDP とは

OSI 参照モデルTCP/IP モデルTCP/IP プロトコル実装
アプリケーション層アプリケーション層HTTP, DNS, DHCP,
SSH, MIME, TLS
アプリケーション
プログラム
プレゼンテーション層
セッション層
トランスポート層トランスポート層TCP, UDPOS
ネットワーク層インターネット層IP, ICMP, ARP, IPSec
物理層
OSI 参照モデルTCP/IP モデルは完全に 1:1 ではない。ARPデータリンク層ネットワーク層の間 (詳しくはここ)。
トランスポート層トランスポート層とは、通信するアプリケーションを識別する層です。

アプリケーションの識別には、ポート番号という識別番号を使います。

ポートはプロセス単位。同じアプリケーションでも違うプロセスとして起動した場合は、違うポート番号が割り当てられる

OSI 参照モデルTCP/IP モデルのトランスポート層の違い

OSI 参照モデルにおけるトランスポート層の役割は、主に次の 6 つです。

  • コネクション
  • 順序制御
  • 再送制御
  • フロー制御
  • 輻輳制御
  • ポート番号 (アプリケーションの識別)
  • Connection-oriented communication:
  • Same order delivery:
  • Reliability:
  • Flow control:
  • Congestion avoidance:
  • Multiplexing: Ports ....
https://en.wikipedia.org/wiki/Transport_layer#Services

一方で、TCP/IP モデルにおけるトランスポート層の役割は通信アプリケーションを識別することだけです。

上5つの機能は TCP/IP モデルでは必須ではありません。 (TCP は実装されてますが、UDP は実装されていません)

The transport layer provides end-to-end communication
services for applications.

https://datatracker.ietf.org/doc/html/rfc1122#page-9

TCP/IP プロトコルでは、TCP と UDP がトランスポート層に相当します。

UDP(User Datagram Protocol)UDP とは、信頼性の低い代わりに高速で、コネクションレス型のプロトコルです。
TCP(Transmission Control Protocol)TCP とは、信頼性の高い代わりに低速で、コネクション型のプロトコルです。
スポンサーリンク

ポート番号の種類

ポート番号は、次の 3 種類が存在します。

ポート番号ポート番号用途
システムポート
(ウェルノウンポート)
0 ~ 1023著名なアプリケーションプロトコルのポート
他のプロトコルで使用することは控えた方が良い
ユーザーポート
(レジスタードポート)
1024 ~ 49151アプリケーションプロトコルで利用するポート
ダイナミックポート
(プライベートポート
/エフェメラルポート)
49152 ~ 65535クライアントが一時的に利用するポート

システムポート

システムポートのうち、特によく利用するポート番号は以下のとおりです。

ポート番号アプリケーションプロトコル
22SSH
53DNS
80HTTP
443HTTPS
587submission(SMTP)
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
スポンサーリンク

UDP とは

UDP(User Datagram Protocol)UDP とは、信頼性の低い代わりに、高速で、コネクションレス型のプロトコルです。

UDP は、DNSHTTP/3(Youtubeなど) で利用します。

UDP は、ポート番号以外の制御をアプリケーション側で行う場合に利用します。

UDPデータグラムのフォーマット

UDP データグラムのフォーマットは、以下のとおりです。

各フィールドビット数各フィールドの説明
送信元ポート番号16 bit送信元のポート番号
送信先ポート番号16 bit送信先のポート番号
データグラムサイズ16 bitUDP データグラム (UDP ヘッダ + UDP ペイロード) のサイズ
チェックサム16 bit誤り検出用
スポンサーリンク

TCP とは

TCP(Transmission Control Protocol)TCP とは、信頼性の高い代わりに低速で、コネクション型のプロトコルです。

TCP は、メールや Web サイト (HTTP/2) などで利用します。

TCP は、ポート番号によるアプリケーションの識別する機能の他に、次の 6 つの信頼性を確保する機能も持ちます。

順序制御

順序制御とは、受信ホストが受け取ったデータを元の順番で並び替える制御です。

MSS(Maximum Segment Size)

MSSとは、一回で受信できる最大のセグメント (データ) サイズです。(TCP ヘッダを除く)
※通常、MSS = MTU(1500) - IP ヘッダ(20) - TCP ヘッダ(20) = 1460 Bytes

大きなデータを送信する場合、MSS 以下のサイズに分割して送信します。

ネットワークの混雑など、データの破損など、様々な要因で順番にデータが届かない場合がある

順序制御では、受信したデータを元の順序に並び替えるために、シーケンス番号を利用します。

シーケンス番号

シーケンス番号とは、送信するデータの順番を表す番号です。
シーケンス番号の初期値はランダム (1 固定ではない)

順序制御では、シーケンス番号の小さい順に、データの順序を並び替えます。

再送制御

再送制御とは、データが破損、喪失した場合に再送することです。

ACK(ACKnowledgement)

ACKとは、確認応答の (OK を表す) TCP ヘッダです。

ACK 番号(確認応答番号)

ACK 番号とは、どこまでのデータを受信したか送信側に通知する番号です。

再送制御では、ACK 番号が返ってこない場合にデータを再送します。

確認応答番号 = シーケンス番号 + 受信したデータサイズ
なお、破損時も確認応答番号を返しません
破損確認は、TCP ヘッダのチェックサムを利用します

再送タイムアウト (Retransmission TimeOut)

再送タイムアウトとは、送信側が ACK の返答を待つ秒数のことです。

再送タイムアウト (RTO) は、RFC 6298 の以下の値を使ってます

When the first RTT measurement R is made, the host MUST set

SRTT <- R
RTTVAR <- R/2
RTO <- SRTT + max (G, K*RTTVAR)
where K = 4.

https://datatracker.ietf.org/doc/html/rfc6298

ウィンドウ制御

ウィンドウ制御とは、ACK を待たずに送信するデータを制御することです。

ウィンドウサイズ

ウィンドウサイズとは、ACK を待たずに送信できるサイズ (受信側のバッファサイズ) です。

セグメントごとに ACK を待っていると、待ち時間が長くなり、通信が遅くなります。

そのため、ウィンドウ制御では、ウィンドウサイズまでは ACK を待たずに次々と送信できます。

ウィンドウサイズが 2920 の場合

スライディングウィンドウ

スライディングウィンドウとは、データを受信する度に ACK を送信する方法です。

以下のように、頻繁に ACK が来るのでウィンドウサイズに余裕ができやすいです。

ウィンドウサイズ = 2920Bytes
ウィンドウサイズ = 2920Bytes

以下のようにウィンドウがスライドするため、スライディングウィンドウと呼ばれます。

ACK を受け取ってない送信済みデータは、再送信に備えて送信側のバッファに残しておく

フロー制御

フロー制御とは、受信ホストのバッファが溢れないように、通信量を制御することです

受信ホストの負荷が高い場合、バッファに溜まったデータを処理しきれない場合があります。

この時、フロー制御では、ウィンドウサイズを利用して、通信量を制御します。

受信ホストの処理能力に余裕がある時は、ウィンドウサイズを増やしても良い

ウィンドウプローブ

ウィンドウプローブとは、最新のウィンドウサイズを取得する通知です。

ウィンドウサイズが 0 のままでは、いつまで経ってもデータを送信できません。

そこで、送信ホストは RTO が経過するたびに、ウィンドウプローブを送信して、受信ホストの最新のウィンドウサイズを取得します。

輻輳制御

輻輳制御とは、回線やルーターの許容量を上回らないように通信量を制御することです。

輻輳 (回線やルーターのパンク) を防ぐためには、スロースタートアルゴリズムを利用します。

スロースタートアルゴリズム

スロースタートアルゴリズムとは、一度に送信するセグメントの数を徐々に増やしていくことで、輻輳が発生するしきい値を探る方法です。

具体的には、以下の手順です。

  1. 輻輳が発生するまで、送信するセグメント数を増やす (ウィンドウサイズまで)
  2. 輻輳が発生すると送信するセグメント数を半分にし、1に戻る
http://www5e.biglobe.ne.jp/aji/3min/42.html

コネクション

コネクションとは、仮想的な通信路を確立 (両端のホストで通信条件を合意) することです。

通信条件とは、以下のような値のことです。

なお、コネクション (仮想的な通信路) は、物理的な通信路が変更されても切断されません。
※両端のホストは、別のルートを経由して、引き続き同じ通信条件で通信できます

別ルートで迂回
トランスポート層はルーターで制御されません
つまり、両端のホストでのみ TCP ヘッダを使用

コネクションは、ソケットを利用して制御します。

ソケット

ソケットとは、アプリケーションがトランスポート層/ネットワーク層と情報をやりとりするためのインターフェイス (API) です。

TCP ソケットは次のように状態遷移して、接続を制御します。(ss/netstat コマンドで確認可能)

https://datatracker.ietf.org/doc/html/rfc793#page-23
SYN(SYNchronize)
SYNとは、TCP コネクションを確立の開始を通知する TCP ヘッダです。
FIN(FINish Packet)
FINとは、コネクションの終了を通知する TCP ヘッダです。
FIN(FINish Packet)
FINとは、コネクションの終了を通知する TCP ヘッダです。
ソケットの状態説明
CLOSEDソケットは使用されていない。パッシブオープンは LISTEN に遷移
LISTEN相手からの SYN 待ちの状態。
SYN_SENT自分から SYN を送信。ソケットはコネクションを確立しようと試みている
SYN_RECV相手から SYN を受信し、自分から SYN/ACK を返した。
ESTABLISHEDソケットはコネクションを確立している
FIN_WAIT1ソケットがクローズされ、コネクションを停止中
FIN_WAIT2コネクションがクローズされ、ソケットは相手側の停止待ち
TIME_WAITソケットはクローズした後、ACK の再送が不要になるまで待機
(すぐに CLOSED に移行すると、再送先がわからなくなるため)
CLOSEDソケットは使用されていない
CLOSE_WAIT相手側は停止しており、自分のソケットのクローズ待ち
LAST_ACK相手側は停止しており、自分のソケットがクローズされる
相手からの ACK を待ち
CLOSING両方のソケットが停止しているが、相手からの ACK 待ち
https://linux.die.net/man/8/netstat

次にソケットを利用したコネクションの確立/終了方法を紹介します。

コネクションの確立 (ESTABLISHED)

3ウェイハンドシェイク

3ウェイハンドシェイクとは、コネクションを確立するための手順です。

コネクションの確立は、3ウェイハンドシェイクを利用して次のように確立します。

静止画版はこちら
アクティブオープン: 自分から SYN を送る (= 左側の PC)
パッシブオープン: 相手からの SYN を待ち受ける (= 右側の PC)
対応するソケットの状態遷移

なお、シーケンス番号の初期値・ウィンドウサイズの初期値・MSS なども送信データに含めて、両端のホストで合意を取ります

コネクションの終了 (CLOSED)

コネクションの終了は、FIN-WAIT 状態で受信する TCP ヘッダによって、2つに分かれます。

FIN-WAIT 状態で ACK を受信
静止版はこちら
アクティブクローズ: 自分から FIN を送る (= 左側の PC)
パッシブクローズ: 相手からの FIN を待ち受ける (= 右側の PC)
FIN-WAIT 状態で FIN を受信
静止画版はこちら
アクティブクローズ: 自分から FIN を送る (= 両方の PC)
対応するソケットの状態遷移

TCP セグメントのフォーマット

TCP セグメントのフォーマットは以下のとおりです。

フィールドの名称ビット数各フィールドの説明
送信元ポート番号16 bit送信元のポート番号
送信先ポート番号16 bit送信先のポート番号
シーケンス番号32 bit送信するデータの順番を表す番号
順序制御などで利用
ACK 番号32 bitどこまでのデータを受信したか送信側に通知する番号
再送制御などで利用
データオフセット4 bitTCPヘッダの長さを表す
予約6 bit将来の拡張用
コントロールフラグ6 bit各 bit が先頭から順に以下の意味を持ちます。
(1の時コントロールフラグが有効)
・URG:「緊急ポインタ」フィールドが有効
・ACK:「ACK 番号」フィールドが有効
・PSH:flush 動作によって送信されたデータ
・RST:コネクションを強制的に終了
・SYN:コネクションの確立の要求
・FIN:コネクションを正常に終了
ウィンドウサイズ16 bitACK を待たずに送信できるサイズ (受信側のバッファサイズ)
ウィンドウ制御やフロー制御で利用
チェックサム16 bitTCP ヘッダとデータ部分のエラーチェックを行うために使用
再送制御(のエラーチェック)に利用
緊急ポインタ16 bit緊急データの開始位置を示す
オプション可変長上記以外の制御処理に使用
例えば、MSS を決定するために使用
パディング可変長オプションが 32bit の倍数じゃない場合 空データ 0 で埋める

関連記事

L4/トランスポート層に関する説明は以上となります。

OSI 参照モデルTCP/IP モデルTCP/IP プロトコル実装
アプリケーション層アプリケーション層HTTP, DNS, DHCP,
SSH, MIME, TLS
アプリケーション
プログラム
プレゼンテーション層
セッション層
トランスポート層トランスポート層TCP, UDPOS
ネットワーク層インターネット層IP, ICMP, ARP, IPSec
物理層
OSI 参照モデルTCP/IP モデルは完全に 1:1 ではない。ARPデータリンク層ネットワーク層の間 (詳しくはここ)。

参考記事

3 Minutes Networking
ネットワークエンジニアとして
ネットワークエンジニアに必要なネットワーク技術とCisco・Juniper・F5製品の技術解説。NWエンジニアの仕事内容や年収を紹介。ネットワークスペシャリスト、CCNA/CCNP/CCIEの情報発信。
TCPの状態遷移 - Qiita
TCPの状態一覧LISTEN(聴取)TCPモジュールはリモートホストからのコネクション要求を待っている。パッシブオープンの後で入る状態と同じ。SYN-SENT(SYN送信済み)TCPモジュー…
The TCP/IP Guide - TCP Connection Termination
IBM Documentation
Sockets are commonly used for client and server interaction. Typical system configuration places the server on one machine, with the clients on other machines. ...