このページの目次
TCP/IP プロトコルスタック
カバー範囲: IPv4/IPv6 送受信パス → TCP 状態マシン → 輻輳制御 (CUBIC/BBR) → フロー制御 (スライドウィンドウ) → ソケットバッファ (sk_wmem/sk_rmem) → TCP ファストパス カーネルバージョン: 2.6 ~ 6.x
概要
Linux TCP/IP スタックは、カーネル内で最も最適化が進んでいるサブシステムの1つです。高速パス(確立済みソケット、順序どおり到着するパケット)では、1パケットあたりの処理は数十命令程度です。本稿では、TCP の受信高速パスと輻輳制御に焦点を当てます。
IPv4 送受信
ip_rcv → ip_local_deliver(受信)
// net/ipv4/ip_input.c
├─ 検証: version==4, チェックサム OK, 長さ妥当
├─ netfilter
└─
├─ ルーティングテーブル参照: → dst_entry
│ → RTN_LOCAL: ローカル宛 →
│ → RTN_UNICAST: フォワーディング →
└─
├─ netfilter
└─
└─ ipprot->handler → /
ip_queue_xmit(送信)
// net/ipv4/ip_output.c
├─ ルーティング参照: → dst_entry + ソースIP
├─ IP ヘッダ構築: プロトコル, TTL, DFフラグ, ...
├─ netfilter NF_INET_LOCAL_OUT
└─
├─ netfilter NF_INET_POST_ROUTING
└─ → QoS qdisc → NIC ドライバ
TCP 高速パス: tcp_rcv_established
// net/ipv4/tcp_input.c
// TCP 受信の最もホットなパス(確立済みソケット、順序どおり到着するパケット)
// fast path(90%以上のパケットがここを通る):
├─ ヘッダ予測チェック:
│ ├─ PSHビット? → スキップ
│ ├─ 順序どおり到着? ✓
│ ├─ ウィンドウが非ゼロ? ✓
│ └─ URG/RST/SYN? → スキップ
│
├─ データを受信キューにコピー:
│ └─ → ユーザーバッファへ直接?
│
├─ rcv_nxt とウィンドウ告知を更新
│
└─ データがキューに到着済みなら → → epoll/read をウェイクアップ
// slow path:
└─ OOO(順序不同)/ SACK / ウィンドウ満杯 / FIN / RST →
TCP 状態マシン
輻輳制御
// net/ipv4/tcp_cong.c
// プラグイン可能な輻輳制御モジュール:
;
// CUBIC (デフォルト):
// cwnd = C * (t - K)^3 + W_max
// K = cube_root(W_max * beta / C)
// 利点: 高速な回復, 公平性, 高速リンクでのパフォーマンス
// BBR (Bottleneck Bandwidth and RTT, Google):
// パケット損失に依存せず、BDP (Bandwidth-Delay Product) に基づく
// 測定: 最大 BW (直近10ラウンド) と最小 RTT (直近10秒)
// 目標: inflight ≈ BDP を維持
// 利点: バッファ膨張 (bufferbloat) があるリンクで CUBIC より大幅に優れる
TCP ソケットバッファのチューニング
# 送信バッファ (デフォルト 16KB, 最大値まで自動拡張)
# 受信バッファ
# 自動チューニング (デフォルト有効):
# sk_wmem と sk_rmem は RTT と帯域幅の探査に基づき自動拡張される
# → 高 BDP リンクでは手動で大きなバッファを設定する必要はない
デバッグ
# TCP 接続状態
# 輻輳制御
# パケット損失/再送統計
|
|
# TCP 状態のトレース
参考
- ソースコード:
net/ipv4/tcp_input.c,net/ipv4/tcp_output.c,net/ipv4/tcp_cong.c,net/ipv4/tcp_cubic.c,net/ipv4/tcp_bbr.c - RFC: RFC 793 (TCP), RFC 5681 (Congestion Control), RFC 8312 (CUBIC)
- LWN: "TCP fast path", "BBR congestion control"
キーワード: tcp_rcv_established, fast path, CUBIC, BBR, congestion control, socket buffer, TCP state machine