TCPコネクションの状態管理とカーネルパラメータ最適化

TCP状態遷移の概要

TCPの3ウェイハンドシェイクおよび4ウェイクローズ処理において、接続は様々な状態を遷移します。これらの状態はネットワークコマンドで確認可能です:

# netstatによる状態確認例
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 45
ESTABLISHED 128
TIME_WAIT 32

主要なTCP状態

  • LISTEN: サーバーが接続要求を待機している状態
  • SYN_SENT: クライアントがSYNパケット送信後の状態
  • SYN_RECV: サーバーがSYN+ACK送信後の状態
  • ESTABLISHED: 接続確立後のデータ転送可能状態
  • FIN_WAIT1: アクティブクローズ側のFIN送信後状態
  • CLOSE_WAIT: パッシブクローズ側のFIN受信後状態
  • FIN_WAIT2: FIN_WAIT1からACK受信後の状態
  • LAST_ACK: パッシブクローズ側のFIN送信後状態
  • TIME_WAIT: アクティブクローズ側のFIN受信後状態(2MSL待機)
  • CLOSED: 接続完全終了状態

カーネルパラメータ設定

3ウェイハンドシェイク関連パラメータ

$ sysctl -a | grep -E 'tcp_max_syn_backlog|tcp_syn_retries|tcp_synack_retries|tcp_syncookies'
net.ipv4.tcp_max_syn_backlog = 512
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
  • tcp_max_syn_backlog: 半接続キューの最大サイズ
  • tcp_syn_retries: SYNパケットの再送回数
  • tcp_synack_retries: SYN+ACKパケットの再送回数
  • tcp_syncookies: SYN Flood攻撃対策機能

キューマネジメント

半接続キューと全接続キューの管理:

$ ss -lt
State   Recv-Q Send-Q Local Address:Port
LISTEN  0      512    *:http
LISTEN  0      128    *:ssh

キュー溢れの統計確認:

$ netstat -s | grep -i listen
times the listen queue of a socket overflowed
SYNs to LISTEN sockets ignored

4ウェイクローズ関連パラメータ

$ sysctl -a | grep -E 'tcp_fin_timeout|tcp_tw_reuse|tcp_max_tw_buckets'
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 16384
  • tcp_fin_timeout: FIN_WAIT2状態のタイムアウト時間(秒)
  • tcp_tw_reuse: TIME_WAIT状態のソケット再利用許可
  • tcp_max_tw_buckets: TIME_WAIT状態の最大数制限

TCPバッファ設定

$ sysctl -a | grep -E 'tcp_rmem|tcp_wmem|tcp_mem'
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_mem = 94500000 915000000 927000000

ファイルディスクリプタ制限

ユーザーレベル制限:

$ ulimit -n
1048576

システムレベル制限:

$ sysctl fs.file-max
fs.file-max = 2097152

その他の重要パラメータ

  • tcp_max_orphans: オーファン接続の最大数
  • nf_conntrack_max: コネクショントラッキングエントリ数
  • tcp_keepalive_time: keepaliveプローブ間隔

タグ: TCP Linuxカーネル ネットワーク最適化 ソケットプログラミング システムチューニング

9月12日 04:52 投稿