InfraLab

TCP / UDP プロトコル仕様

40 / 40 items

InfraLab Reference Series

Category: TCP / UDP

Updated: 2026-05-14

infralab.jp

tcp-udp

40 items

TCP / UDP プロトコル仕様

Abstract

TCP/UDP のヘッダ、フラグ、ステート遷移、MSS/MTU/PMTUD、UDP checksum、Linux チューニングと現場トラブルシュートをまとめた L4 仕様リファレンス。

Table of Contents

  1. 1. 概要 (RFC)3
  2. 2. TCP ヘッダ6
  3. 3. TCP フラグ7
  4. 4. TCP ステート遷移7
  5. 5. TCP オプション5
  6. 6. MSS / MTU / PMTUD4
  7. 7. UDP ヘッダ4
  8. 8. 運用・チューニング4
  9. 9. References23

1. 概要 (RFC)

1.1. TCP / UDP の位置づけ

TCP は信頼性・順序制御・輻輳制御を持つコネクション型 L4、UDP は最小限の多重化とチェックサムだけを提供するコネクションレス型 L4。

TCP: RFC 793 / RFC 9293。UDP: RFC 768。IP 基盤: RFC 791 (IPv4), RFC 8200 (IPv6)

1.2. 主要 RFC

古典 RFC と改訂版が併存するため、実装や試験では RFC 9293 を軸に RFC 793 / 1122 / 6691 / 7323 を参照する。

RFC 791, RFC 793, RFC 768, RFC 1122, RFC 6691 (MSS), RFC 7323 (High Performance), RFC 9293 (TCP 改訂)

1.3. DCCP / SCTP / QUIC との違い

DCCP は輻輳制御付きデータグラム、SCTP はメッセージ境界とマルチストリーム、QUIC は UDP 上に TLS 1.3 と信頼転送を統合する。

DCCP: IP proto 33 / SCTP: IP proto 132 / QUIC: UDP 443 + TLS 1.3

2. TCP ヘッダ

2.1. TCP ヘッダ

RFC 9293 の TCP ヘッダ全体。Data Offset 以降のフラグと Options の位置関係を確認するための基準図。

RFC 9293 ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |       Destination Port        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Sequence Number                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     Acknowledgment Number                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | DOff  | Res |N|C|E|U|A|P|R|S|F|            Window             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Checksum            |        Urgent Pointer         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                  Options ...                  |    Padding    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.2. TCP Source Port / Destination Port

送信元・宛先ポートでアプリケーションを多重化する。クライアント側は通常 ephemeral port を利用する。

0-1B Source Port (16bit), 2-3B Destination Port (16bit)

2.3. TCP Sequence Number

送信バイトストリームの位置を示す 32bit 番号。SYN と FIN はシーケンス空間を 1 消費する。

4-7B Sequence Number (32bit)。初期値 ISN は接続ごとに選択

2.4. TCP Acknowledgment Number

ACK フラグ有効時に、次に受信したいシーケンス番号を示す。累積 ACK が基本。

8-11B Acknowledgment Number (32bit)。ACK=1 のとき有効

2.5. TCP Data Offset / Reserved

Data Offset は TCP ヘッダ長を 32bit word 単位で表す。オプションなしは 5、最大ヘッダ長は 60B。

12B 上位 4bit Data Offset。Reserved は将来用で 0。ヘッダ長 20-60B

2.6. TCP Window / Checksum / Urgent Pointer

Window は受信可能量、Checksum は疑似ヘッダを含む誤り検出、Urgent Pointer は URG と組み合わせて緊急データ位置を示す。

14-15B Window, 16-17B Checksum, 18-19B Urgent Pointer。Checksum は IPv4/IPv6 とも TCP で必須

3. TCP フラグ

3.1. URG

Urgent Pointer が有効であることを示す。現在の一般的なアプリケーションではほぼ使われない。

URG=1: Urgent Pointer 有効。RFC 9293 では緊急データ機能として維持

3.2. ACK

Acknowledgment Number が有効であることを示す。SYN の最初の片方向送信以外では通常セットされる。

ACK=1: AckNo 有効。3-way handshake の 2 パケット目以降で使用

3.3. PSH

受信側 TCP にデータを速やかにアプリケーションへ渡すことを示唆する。対話型通信で見えることが多い。

PSH=1: Push function。配送保証や即時表示を強制するものではない

3.4. RST

接続を異常終了または存在しない接続を拒否する。ポート未待受やシーケンス不整合で送られる。

RST=1: Reset。受信後は接続状態を破棄

3.5. SYN

接続開始とシーケンス番号同期に使う。3-way handshake の 1、2 パケット目で利用される。

SYN=1: synchronize。SYN は Sequence Number を 1 消費

3.6. FIN

送信側がこれ以上データを送らないことを示す正常終了フラグ。半閉状態を作れる。

FIN=1: finish。FIN も Sequence Number を 1 消費

3.7. CWR / ECE / NS

ECN 関連フラグ。輻輳通知をパケットロスなしに伝えるため、IP ヘッダの ECN ビットと連携する。

CWR=Congestion Window Reduced, ECE=ECN Echo, NS=Nonce Sum (RFC 3540 系、現在は実用上ほぼ使われない)

4. TCP ステート遷移

4.1. CLOSED

接続が存在しない初期状態。アクティブオープンで SYN-SENT、パッシブオープンで LISTEN へ進む。

CLOSED -> LISTEN または SYN-SENT

4.2. LISTEN

サーバが接続要求 SYN を待つ状態。SYN 受信後に SYN-RECEIVED へ進む。

LISTEN -> SYN-RECEIVED。例: ss -ltn

4.3. SYN-SENT / SYN-RECEIVED

SYN-SENT はクライアント側の SYN 送信後、SYN-RECEIVED はサーバ側の SYN+ACK 送信後の状態。

3-way: SYN -> SYN+ACK -> ACK。成立後 ESTABLISHED

4.4. ESTABLISHED

双方向データ転送が可能な通常状態。FIN 送信で FIN-WAIT-1、FIN 受信で CLOSE-WAIT へ進む。

正常通信状態。ss -tan state established

4.5. FIN-WAIT-1 / FIN-WAIT-2

アクティブクローズ側の状態。自分の FIN に対する ACK を受けると FIN-WAIT-2 へ進む。

FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT。Linux tcp_fin_timeout は FIN-WAIT-2 系の上限に関係

4.6. CLOSE-WAIT / LAST-ACK

パッシブクローズ側の状態。アプリケーションが close しないと CLOSE-WAIT が残り続ける。

CLOSE-WAIT -> LAST-ACK -> CLOSED。CLOSE-WAIT 多発はアプリの close 漏れを疑う

4.7. TIME-WAIT

最後の ACK 送信後、重複セグメントが消えるのを待つ状態。高頻度短命接続ではポート消費の原因になる。

2*MSL。実装値は一般に 60-120s。Linux は固定的に約 60s、関連確認: ss -tan state time-wait

5. TCP オプション

5.1. MSS オプション

受信可能な最大 TCP ペイロード長を SYN で通知する。Path MTU より大きい値を避けるための基本要素。

Kind=2, Length=4, MSS 16bit。RFC 6691。通常 SYN/SYN+ACK のみ

RFC 6691 / RFC 9293 TCP option ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Kind=2     |   Length=4    |              MSS              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.2. Window Scale

16bit Window を左シフトして大きな帯域遅延積に対応する。両端が SYN で交渉した場合のみ有効。

Kind=3, Length=3, shift.cnt 0-14。RFC 7323

RFC 7323 TCP option ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Kind=3     |   Length=3    |     Shift     |      Pad      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.3. SACK Permitted / SACK

Selective ACK を使い、欠落部分以外を選択的に確認する。損失の多い回線で再送効率を上げる。

SACK Permitted: Kind=4 Length=2。SACK: Kind=5 可変長、left/right edge の 32bit 対

RFC 2018 TCP SACK option ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Kind=5     |    Length     |           Left Edge           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Left Edge           |          Right Edge           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Right Edge           |        More Blocks ...        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.4. Timestamps

RTT 計測と PAWS に使う高性能拡張。長時間・高速通信でシーケンス番号折り返し対策にもなる。

Kind=8, Length=10, TSval 32bit, TSecr 32bit。RFC 7323

RFC 7323 TCP Timestamps option ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Kind=8     |   Length=10   |             TSval             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             TSval             |             TSecr             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             TSecr             |            Padding            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.5. TCP Fast Open

TFO Cookie を使い、再接続時に SYN へデータを載せて RTT を削減する。中間装置やアプリ要件で無効化されることも多い。

RFC 7413。Linux: net.ipv4.tcp_fastopen

RFC 7413 TCP Fast Open option ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Kind=34    |    Length     |          Cookie ...           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                          Cookie ...                           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

6. MSS / MTU / PMTUD

6.1. MSS 計算式

MSS はリンク MTU から IP ヘッダと TCP ヘッダを引いた値。TCP オプションは MSS ではなく実データ量に影響する。

MSS = MTU - IP header - TCP header。Ethernet MTU 1500: IPv4 1460 / IPv6 1440 が典型

6.2. PMTUD

経路上の最小 MTU を ICMP で学習し、DF 付き IPv4 や IPv6 でフラグメントを避ける。

IPv4: ICMP Type 3 Code 4 Fragmentation Needed。IPv6: Packet Too Big Type 2

6.3. PMTUD Blackhole

ICMP Packet Too Big / Fragmentation Needed がフィルタされると大きな TCP セグメントだけ止まる。HTTPS だけ遅い/止まる症状になりやすい。

対策: ICMP 許可、tracepath、ping -M do -s、MSS clamping

6.4. MSS Clamping

PPPoE、IPsec、GRE、VXLAN などで実効 MTU が下がる場合、SYN の MSS を境界で書き換えてブラックホールを避ける。

Linux nft/iptables TCPMSS --clamp-mss-to-pmtu。例: iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

7. UDP ヘッダ

7.1. UDP ヘッダ

UDP は固定 8B ヘッダのみを持つ。順序、再送、輻輳制御はアプリケーションまたは上位プロトコルが担当する。

0-1B Source Port, 2-3B Destination Port, 4-5B Length, 6-7B Checksum。RFC 768

RFC 768 ASCII 図:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |       Destination Port        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Length             |           Checksum            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           Data ...                            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

7.2. UDP Length

UDP ヘッダとデータを含む長さ。最小値は 8B。IPv4 total length / IPv6 payload length と整合する必要がある。

Length 16bit。最小 8、最大は IP ペイロード制約に依存

7.3. UDP Checksum

IPv4 では 0 による未使用が許されるが、IPv6 では原則必須。トンネル用途には例外 RFC がある。

IPv4 UDP checksum optional、IPv6 UDP checksum mandatory。例外検討: RFC 6935 / RFC 6936

7.4. UDP の代表用途

DNS、NTP、DHCP、RTP、QUIC など、低遅延・アプリ側制御・マルチキャストが重要な用途で使われる。

DNS/53, NTP/123, DHCP/67-68, QUIC/443, VXLAN/4789

8. 運用・チューニング

8.1. 輻輳制御アルゴリズム

TCP の送信レートは輻輳制御で決まる。Linux では CUBIC が広く既定、低遅延・高帯域用途で BBR が使われる。

Reno / CUBIC / BBR。確認: sysctl net.ipv4.tcp_congestion_control。変更: sysctl -w net.ipv4.tcp_congestion_control=bbr

8.2. Linux TCP FIN 関連

FIN-WAIT-2 や短命接続の滞留を調査する際は、TIME-WAIT と tcp_fin_timeout を混同しない。

/proc/sys/net/ipv4/tcp_fin_timeout は orphaned FIN-WAIT-2 の timeout に関係。TIME-WAIT は別管理

8.3. ソケット確認コマンド

接続状態、キュー、タイマー、プロセスを確認するには ss が基本。古い netstat より詳細に見える。

ss -tanpi / ss -uapn / ss -tan state time-wait / nstat -az

8.4. 典型トラブルシュート

SYN 再送は経路・ACL・待受、RST はアプリ拒否、ゼロウィンドウは受信側詰まり、UDP loss はアプリ側再送やバッファを確認する。

tcpdump -nnvvv tcp or udp / ss -s / ip route get / tracepath / ethtool -S

9. References

  1. TCP
  2. UDP
  3. RFC 793
  4. RFC 9293
  5. RFC 768
  6. RFC 1122
  7. RFC 6691
  8. RFC 7323
  9. MSS
  10. MTU
  11. PMTUD
  12. ICMP
  13. TIME-WAIT
  14. SYN
  15. ACK
  16. RST
  17. FIN
  18. CUBIC
  19. BBR
  20. Reno
  21. 輻輳制御
  22. トランスポート
  23. チェックサム
Related