ソケット

ネットワーク通信のエンドポイント

ソケットとは

ソケットはネットワーク通信のエンドポイントを表す抽象概念です。 プロセス間通信(IPC)やネットワーク通信に使用され、 ファイルディスクリプタとして操作できます。

ソケットの種類

TCP Socket (SOCK_STREAM)

  • • コネクション型
  • • 信頼性のあるバイトストリーム
  • • 順序保証あり
  • • HTTP, SSH, DBなど

UDP Socket (SOCK_DGRAM)

  • • コネクションレス
  • • データグラム単位
  • • 順序・到達保証なし
  • • DNS, ゲーム, ストリーミングなど

Unix Domain Socket

  • • 同一ホスト内のプロセス間通信
  • • ファイルパスで識別
  • • ネットワークスタック不要で高速
  • • MySQL, PostgreSQL, Dockerなど

TCP接続状態

状態説明
LISTEN接続待ち
SYN_SENTSYN送信済み、応答待ち
SYN_RECEIVEDSYN受信、ACK待ち
ESTABLISHED接続確立済み
FIN_WAIT_1FIN送信済み
FIN_WAIT_2FINのACK受信、FIN待ち
TIME_WAIT終了待機(2MSL)
CLOSE_WAITFIN受信、アプリのclose待ち
LAST_ACK最後のACK待ち
CLOSED接続終了

ソケット確認

1# 全ソケット状態
2ss -a
3
4# TCPリスニングソケット
5ss -tln
6
7# 接続中TCPソケット(プロセス情報付き)
8ss -tnp
9
10# UDP
11ss -uln
12
13# Unix Domain Socket
14ss -x
15
16# 特定ポートのソケット
17ss -tn sport = :80
18ss -tn dport = :443
19
20# 状態でフィルタ
21ss -tn state established
22ss -tn state time-wait
23
24# 統計
25ss -s
26
27# プロセスのソケット
28lsof -i -P -n
29lsof -i :80
30
31# /proc からソケット情報
32cat /proc/net/tcp
33cat /proc/net/unix

Listen Backlog

Backlogは、accept()を待つ接続キューの長さ。 高負荷時にキューが溢れると接続が拒否される。

SYN Queue

SYN_RECEIVED状態の接続(3way handshake中)

Accept Queue

ESTABLISHED状態でaccept待ちの接続

1# システムの最大backlog
2cat /proc/sys/net/core/somaxconn
3
4# 設定変更
5sysctl -w net.core.somaxconn=65535
6sysctl -w net.ipv4.tcp_max_syn_backlog=65535
7
8# キュー状況確認(Recv-Qがバックログ使用量)
9ss -tln

TIME_WAIT問題

TIME_WAITは接続終了後2MSL(通常60秒)維持される。 短時間に大量の接続を処理するサーバーで問題になることがある。

1# TIME_WAIT数確認
2ss -tn state time-wait | wc -l
3
4# 対策
5# tcp_tw_reuse: クライアント側でTIME_WAITソケットを再利用
6sysctl -w net.ipv4.tcp_tw_reuse=1
7
8# tcp_fin_timeout: FIN_WAIT_2のタイムアウト短縮
9sysctl -w net.ipv4.tcp_fin_timeout=30
10
11# ローカルポート範囲拡大
12sysctl -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不足、ファイルディスクリプタ上限