ソケット
ネットワーク通信のエンドポイント
ソケットとは
ソケットはネットワーク通信のエンドポイントを表す抽象概念です。 プロセス間通信(IPC)やネットワーク通信に使用され、 ファイルディスクリプタとして操作できます。
ソケットの種類
TCP Socket (SOCK_STREAM)
- • コネクション型
- • 信頼性のあるバイトストリーム
- • 順序保証あり
- • HTTP, SSH, DBなど
UDP Socket (SOCK_DGRAM)
- • コネクションレス
- • データグラム単位
- • 順序・到達保証なし
- • DNS, ゲーム, ストリーミングなど
Unix Domain Socket
- • 同一ホスト内のプロセス間通信
- • ファイルパスで識別
- • ネットワークスタック不要で高速
- • MySQL, PostgreSQL, Dockerなど
TCP接続状態
| 状態 | 説明 |
|---|---|
| LISTEN | 接続待ち |
| SYN_SENT | SYN送信済み、応答待ち |
| SYN_RECEIVED | SYN受信、ACK待ち |
| ESTABLISHED | 接続確立済み |
| FIN_WAIT_1 | FIN送信済み |
| FIN_WAIT_2 | FINのACK受信、FIN待ち |
| TIME_WAIT | 終了待機(2MSL) |
| CLOSE_WAIT | FIN受信、アプリのclose待ち |
| LAST_ACK | 最後のACK待ち |
| CLOSED | 接続終了 |
ソケット確認
1 # 全ソケット状態 2 ss -a 3 4 # TCPリスニングソケット 5 ss -tln 6 7 # 接続中TCPソケット(プロセス情報付き) 8 ss -tnp 9 10 # UDP 11 ss -uln 12 13 # Unix Domain Socket 14 ss -x 15 16 # 特定ポートのソケット 17 ss -tn sport = :80 18 ss -tn dport = :443 19 20 # 状態でフィルタ 21 ss -tn state established 22 ss -tn state time-wait 23 24 # 統計 25 ss -s 26 27 # プロセスのソケット 28 lsof -i -P -n 29 lsof -i :80 30 31 # /proc からソケット情報 32 cat /proc/net/tcp 33 cat /proc/net/unix
Listen Backlog
Backlogは、accept()を待つ接続キューの長さ。 高負荷時にキューが溢れると接続が拒否される。
SYN Queue
SYN_RECEIVED状態の接続(3way handshake中)
Accept Queue
ESTABLISHED状態でaccept待ちの接続
1 # システムの最大backlog 2 cat /proc/sys/net/core/somaxconn 3 4 # 設定変更 5 sysctl -w net.core.somaxconn=65535 6 sysctl -w net.ipv4.tcp_max_syn_backlog=65535 7 8 # キュー状況確認(Recv-Qがバックログ使用量) 9 ss -tln
TIME_WAIT問題
TIME_WAITは接続終了後2MSL(通常60秒)維持される。 短時間に大量の接続を処理するサーバーで問題になることがある。
1 # TIME_WAIT数確認 2 ss -tn state time-wait | wc -l 3 4 # 対策 5 # tcp_tw_reuse: クライアント側でTIME_WAITソケットを再利用 6 sysctl -w net.ipv4.tcp_tw_reuse=1 7 8 # tcp_fin_timeout: FIN_WAIT_2のタイムアウト短縮 9 sysctl -w net.ipv4.tcp_fin_timeout=30 10 11 # ローカルポート範囲拡大 12 sysctl -w net.ipv4.ip_local_port_range="10000 65535"
SRE/インフラ観点
監視項目
- • ESTABLISHED接続数
- • TIME_WAIT数(多すぎると問題)
- • CLOSE_WAIT数(アプリのバグの可能性)
- • Backlogオーバーフロー
トラブルシューティング
- •
CLOSE_WAIT多発 → アプリがclose()していない - •
TIME_WAIT多発 → 接続プーリング検討 - •
SYN_RECV多発 → SYN flood攻撃の可能性 - • 接続拒否 → backlog不足、ファイルディスクリプタ上限