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. 概要 (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.32. 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-60B2.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-SENT4.2. LISTEN
サーバが接続要求 SYN を待つ状態。SYN 受信後に SYN-RECEIVED へ進む。
LISTEN -> SYN-RECEIVED。例: ss -ltn4.3. SYN-SENT / SYN-RECEIVED
SYN-SENT はクライアント側の SYN 送信後、SYN-RECEIVED はサーバ側の SYN+ACK 送信後の状態。
3-way: SYN -> SYN+ACK -> ACK。成立後 ESTABLISHED4.4. ESTABLISHED
双方向データ転送が可能な通常状態。FIN 送信で FIN-WAIT-1、FIN 受信で CLOSE-WAIT へ進む。
正常通信状態。ss -tan state established4.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-wait5. 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 26.3. PMTUD Blackhole
ICMP Packet Too Big / Fragmentation Needed がフィルタされると大きな TCP セグメントだけ止まる。HTTPS だけ遅い/止まる症状になりやすい。
対策: ICMP 許可、tracepath、ping -M do -s、MSS clamping6.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-pmtu7. 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 69367.4. UDP の代表用途
DNS、NTP、DHCP、RTP、QUIC など、低遅延・アプリ側制御・マルチキャストが重要な用途で使われる。
DNS/53, NTP/123, DHCP/67-68, QUIC/443, VXLAN/47898. 運用・チューニング
8.1. 輻輳制御アルゴリズム
TCP の送信レートは輻輳制御で決まる。Linux では CUBIC が広く既定、低遅延・高帯域用途で BBR が使われる。
Reno / CUBIC / BBR。確認: sysctl net.ipv4.tcp_congestion_control。変更: sysctl -w net.ipv4.tcp_congestion_control=bbr8.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 -az8.4. 典型トラブルシュート
SYN 再送は経路・ACL・待受、RST はアプリ拒否、ゼロウィンドウは受信側詰まり、UDP loss はアプリ側再送やバッファを確認する。
tcpdump -nnvvv tcp or udp / ss -s / ip route get / tracepath / ethtool -S9. References
- TCP
- UDP
- RFC 793
- RFC 9293
- RFC 768
- RFC 1122
- RFC 6691
- RFC 7323
- MSS
- MTU
- PMTUD
- ICMP
- TIME-WAIT
- SYN
- ACK
- RST
- FIN
- CUBIC
- BBR
- Reno
- 輻輳制御
- トランスポート
- チェックサム