OSI 参照モデル | TCP/IP モデル | TCP/IP プロトコル | 実装 |
---|---|---|---|
アプリケーション層 | アプリケーション層 | HTTP, DNS, DHCP, SSH, MIME, TLS | アプリケーション プログラム |
プレゼンテーション層 | |||
セッション層 | |||
トランスポート層 | トランスポート層 | TCP, UDP | OS |
ネットワーク層 | インターネット層 | IP, ICMP, ARP, IPSec | |
データリンク層 | ネットワーク インターフェイス層 | イーサネット (有線) IEEE 802.11(Wi-Fi/無線) | デバイスドライバー Network Interface |
物理層 |
アプリケーションの識別には、ポート番号という識別番号を使います。
OSI 参照モデルと TCP/IP モデルのトランスポート層の違い
OSI 参照モデルにおけるトランスポート層の役割は、主に次の 6 つです。
- コネクション
- 順序制御
- 再送制御
- フロー制御
- 輻輳制御
- ポート番号 (アプリケーションの識別)
https://en.wikipedia.org/wiki/Transport_layer#Services
- Connection-oriented communication:
- Same order delivery:
- Reliability:
- Flow control:
- Congestion avoidance:
- Multiplexing: Ports ....
一方で、TCP/IP モデルにおけるトランスポート層の役割は通信アプリケーションを識別することだけです。
上5つの機能は TCP/IP モデルでは必須ではありません。 (TCP は実装されてますが、UDP は実装されていません)The transport layer provides end-to-end communication
https://datatracker.ietf.org/doc/html/rfc1122#page-9
services for applications.
TCP/IP プロトコルでは、TCP と UDP がトランスポート層に相当します。
ポート番号の種類
ポート番号は、次の 3 種類が存在します。
ポート番号 | ポート番号 | 用途 |
---|---|---|
システムポート (ウェルノウンポート) | 0 ~ 1023 | 著名なアプリケーションやプロトコルのポート 他のプロトコルで使用することは控えた方が良い |
ユーザーポート (レジスタードポート) | 1024 ~ 49151 | アプリケーションやプロトコルで利用するポート |
ダイナミックポート (プライベートポート /エフェメラルポート) | 49152 ~ 65535 | クライアントが一時的に利用するポート |
システムポート
システムポートのうち、特によく利用するポート番号は以下のとおりです。
ポート番号 | アプリケーションのプロトコル |
---|---|
22 | SSH |
53 | DNS |
80 | HTTP |
443 | HTTPS |
587 | submission(SMTP) |
UDP とは
UDP は、DNS や HTTP/3(Youtubeなど) で利用します。
UDP は、ポート番号以外の制御をアプリケーション側で行う場合に利用します。
UDPデータグラムのフォーマット
UDP データグラムのフォーマットは、以下のとおりです。
各フィールド | ビット数 | 各フィールドの説明 |
---|---|---|
送信元ポート番号 | 16 bit | 送信元のポート番号 |
送信先ポート番号 | 16 bit | 送信先のポート番号 |
データグラムサイズ | 16 bit | UDP データグラム (UDP ヘッダ + UDP ペイロード) のサイズ |
チェックサム | 16 bit | 誤り検出用 |
TCP とは
TCP は、メールや Web サイト (HTTP/2) などで利用します。
TCP は、ポート番号によるアプリケーションの識別する機能の他に、次の 6 つの信頼性を確保する機能も持ちます。
大きなデータを送信する場合、MSS 以下のサイズに分割して送信します。
順序制御では、受信したデータを元の順序に並び替えるために、シーケンス番号を利用します。
順序制御では、シーケンス番号の小さい順に、データの順序を並び替えます。
再送制御では、ACK 番号が返ってこない場合にデータを再送します。
再送タイムアウト (RTO) は、RFC 6298 の以下の値を使ってます
When the first RTT measurement R is made, the host MUST set
SRTT <- R
https://datatracker.ietf.org/doc/html/rfc6298
RTTVAR <- R/2
RTO <- SRTT + max (G, K*RTTVAR)
where K = 4.
セグメントごとに ACK を待っていると、待ち時間が長くなり、通信が遅くなります。
そのため、ウィンドウ制御では、ウィンドウサイズまでは ACK を待たずに次々と送信できます。
以下のように、頻繁に ACK が来るのでウィンドウサイズに余裕ができやすいです。
以下のようにウィンドウがスライドするため、スライディングウィンドウと呼ばれます。
受信ホストの負荷が高い場合、バッファに溜まったデータを処理しきれない場合があります。
この時、フロー制御では、ウィンドウサイズを利用して、通信量を制御します。
ウィンドウサイズが 0 のままでは、いつまで経ってもデータを送信できません。
そこで、送信ホストは RTO が経過するたびに、ウィンドウプローブを送信して、受信ホストの最新のウィンドウサイズを取得します。
輻輳 (回線やルーターのパンク) を防ぐためには、スロースタートアルゴリズムを利用します。
具体的には、以下の手順です。
- 輻輳が発生するまで、送信するセグメント数を増やす (ウィンドウサイズまで)
- 輻輳が発生すると送信するセグメント数を半分にし、1に戻る
通信条件とは、以下のような値のことです。
なお、コネクション (仮想的な通信路) は、物理的な通信路が変更されても切断されません。
※両端のホストは、別のルートを経由して、引き続き同じ通信条件で通信できます
コネクションは、ソケットを利用して制御します。
TCP ソケットは次のように状態遷移して、接続を制御します。(ss/netstat コマンドで確認可能)
ソケットの状態 | 説明 |
---|---|
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 待ち |
次にソケットを利用したコネクションの確立/終了方法を紹介します。
コネクションの確立 (ESTABLISHED)
コネクションの確立は、3ウェイハンドシェイクを利用して次のように確立します。
なお、シーケンス番号の初期値・ウィンドウサイズの初期値・MSS なども送信データに含めて、両端のホストで合意を取ります
コネクションの終了 (CLOSED)
コネクションの終了は、FIN-WAIT 状態で受信する TCP ヘッダによって、2つに分かれます。
TCP セグメントのフォーマット
TCP セグメントのフォーマットは以下のとおりです。
フィールドの名称 | ビット数 | 各フィールドの説明 |
---|---|---|
送信元ポート番号 | 16 bit | 送信元のポート番号 |
送信先ポート番号 | 16 bit | 送信先のポート番号 |
シーケンス番号 | 32 bit | 送信するデータの順番を表す番号 順序制御などで利用 |
ACK 番号 | 32 bit | どこまでのデータを受信したか送信側に通知する番号 再送制御などで利用 |
データオフセット | 4 bit | TCPヘッダの長さを表す |
予約 | 6 bit | 将来の拡張用 |
コントロールフラグ | 6 bit | 各 bit が先頭から順に以下の意味を持ちます。 (1の時コントロールフラグが有効) ・URG:「緊急ポインタ」フィールドが有効 ・ACK:「ACK 番号」フィールドが有効 ・PSH:flush 動作によって送信されたデータ ・RST:コネクションを強制的に終了 ・SYN:コネクションの確立の要求 ・FIN:コネクションを正常に終了 |
ウィンドウサイズ | 16 bit | ACK を待たずに送信できるサイズ (受信側のバッファサイズ) ウィンドウ制御やフロー制御で利用 |
チェックサム | 16 bit | TCP ヘッダとデータ部分のエラーチェックを行うために使用 再送制御(のエラーチェック)に利用 |
緊急ポインタ | 16 bit | 緊急データの開始位置を示す |
オプション | 可変長 | 上記以外の制御処理に使用 例えば、MSS を決定するために使用 |
パディング | 可変長 | オプションが 32bit の倍数じゃない場合 空データ 0 で埋める |
関連記事
L4/トランスポート層に関する説明は以上となります。
OSI 参照モデル | TCP/IP モデル | TCP/IP プロトコル | 実装 |
---|---|---|---|
アプリケーション層 | アプリケーション層 | HTTP, DNS, DHCP, SSH, MIME, TLS | アプリケーション プログラム |
プレゼンテーション層 | |||
セッション層 | |||
トランスポート層 | トランスポート層 | TCP, UDP | OS |
ネットワーク層 | インターネット層 | IP, ICMP, ARP, IPSec | |
データリンク層 | ネットワーク インターフェイス層 | イーサネット (有線) IEEE 802.11(Wi-Fi/無線) | デバイスドライバー Network Interface |
物理層 |