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プローブ間隔