【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. ...
https://docs.oracle.com/cd/E19253-01/819-0380/ipov-19/index.html
エンドツーエンド対策で「つながらない」「遅い」を解消する
「通信がつながらない」「表示が遅い」といった課題を解決するのに有効な「エンドツーエンド」の考え方やその対策について解説します。