こんにちは!大規模データセンターのネットワーク運用(NOC)の現場を長年守り続けているシニアエンジニアです。数え切れないほどの夜間障害をくぐり抜けてきましたが、いつの時代もエンジニアを悩ませるのは「なぜか通信が途切れる」「突然アプリの反応が遅くなる」という、目に見えないネットワークのミステリーです。
そんなとき、私たちが現場で真っ先に手に取る「相棒」が、Linuxの ss コマンドです。
古いエンジニアなら netstat と言えばピンとくるかもしれませんが、現代の高速なクラウドや巨大なデータセンターでは、もっとスピーディで詳細な情報を見せてくれる ss コマンドが主流になっています。
今回は、この ss コマンドを使って、TCP通信の裏側で動いている「タイマー(再送タイマーやキープアライブなど)」の動きをリアルタイムに覗き見する方法を、身近な例えを交えながら優しく紐解いていきたいと思います。難しい専門用語に身構える必要はありません。一歩ずつ、一緒に理解していきましょう!
—
1. TCP通信は「確実に届く郵便配達」のようなもの
ネットワークの世界を少しだけ身近なものに例えてみましょう。私たちが普段使っているWebブラウザやアプリの通信(TCP)は、例えるなら「内容証明郵便」や「書留」のやり取りにそっくりです。
普通のハガキ(UDP通信など)は、ポストに投函したら相手に届いたかどうか分かりませんよね。でも、TCPという仕組みは違います。
1. あなたが手紙を出す。
2. 相手が「ちゃんと受け取りました!」という受領確認のハガキ(ACK)をあなたに送り返す。
3. もし一定時間経っても受領確認が返ってこなければ、「あれ、途中で郵便配達員が道に迷ったのかな?」と心配になって、もう一度同じ手紙を出す(再送する)。
この「返事が来るのを待っている時間(タイムアウト)」を測っているのが、今回主役にする「TCPタイマー」です。
現場のエンジニアにとって、このタイマーが今どうなっているのか(何秒待たされているのか、あと何回配り直そうとしているのか)を知ることは、通信トラブルを解決するための最大の手がかりになります。
—
2. 昔の netstat から、なぜ ss コマンドなのか?
「ネットの調子を調べるときは netstat って教わったけど?」という方も多いと思います。もちろん netstat も素晴らしいコマンドです。
しかし、今のクラウド環境やコンテナが大量に動くサーバーを考えてみてください。1台のサーバー上で数万、数十万もの通信が同時に行われています。昔の netstat は、これだけの膨大な情報をすべてカーネルの奥底から引っぺがして画面に表示しようとするため、サーバーが重くなってしまうという弱点がありました。
そこで登場したのが ss(Socket Statistics)コマンドです。
ss は、OSの頭脳(カーネル)のメモリから直接、必要な情報だけをスマートに、かつ圧倒的なスピードで引き出すことができます。まさに、熟練の配達員が「今、どの郵便物がどこで止まっているか」を一瞬でリストアップするようなものです。
—
3. 実践! ss コマンドでタイマーの息づかいを感じてみよう
それでは、実際にサーバーにログインして ss コマンドを叩いてみましょう。
TCPのタイマー情報を詳しく見るためには、-o(オプションの timers)と -t(TCPソケットの指定)を組み合わせます。ターミナルを開いて、次のように入力してみてください。
# TCP接続の状況を、タイマー情報付きで一覧表示する
ss -t -o
実行すると、画面にずらっと英数字の羅列が出てきます。最初は「うっ…」と尻込みしてしまいますよね。でも、一番右端のあたりに注目してください。次のような見慣れない文字が隠れています。
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.10:443 192.168.1.100:54321 timer:(on,450ms,0)
この最後の timer:(on,450ms,0) という部分が、まさに今回のお宝情報です!ここには、その通信が今どんな状態にあるのかのドラマが詰まっています。
それぞれの意味を、郵便配達の例えで優しく分解してみましょう。
① on(再送タイマー:Retransmit Timer)
- 意味: 相手からの「受け取りました(ACK)」の返事がまだ返ってこないので、ハラハラしながら返事を待っている状態です。
- 見方:
timer:(on,450ms,0)ならば、「あと450ミリ秒待って返事が来なければ、手紙をもう一度出し直す(再送する)ぞ」とカウントダウンしている瞬間を表しています。最後の0は再送を試みた回数(リトライ回数)です。これが1、2と増えていくと、ネットワークが重い、あるいは相手のサーバーがフリーズしているサインになります。
② keep-alive(キープ-アライブ タイマー)
- 意味: 「お互いにまだ繋がっていますよね?」と生存確認をするためのタイマーです。
- 見方: しばらく会話がない静かな状態のときに、「そろそろ生存確認の合図を送ろうか」とタイマーがじっと時を刻んでいます。チャットアプリなどで、しばらく放置しても接続が切れないのは、このタイマーが裏で頑張って「生きてますよー」と小包を送り合っているからです。
③ timewait(タイムウェイト タイマー)
- 意味: 通信が無事に終わったあとの「後片付けの時間」です。
- 見方: 手紙のやり取りが終わった後、「もしかすると、相手がまだ最後の返事を出したつもりでいるかもしれないから、念のためもう少しだけポストの前で待機していよう」というクールダウン期間です。この状態が大量に残る場合も、
ssコマンドですぐに発見できます。
—
4. 現場で役立つ!トラブルシューティングの現実的なアプローチ
実際のインフラ現場で、この ss のタイマー情報をどう使うのか、少しリアルな話をしましょう。
ある日、ユーザーから「Web画面の読み込みが時々すごく遅くなる、あるいは途中で止まる」という問い合わせが入りました。アプリのログを見てもエラーは出ていません。データベースも元気です。
そんなとき、私は真っ直ぐサーバーに飛び乗り、次のようなコマンドを実行します。
# 再送待ち(on状態)になっている怪しい通信だけをあぶり出す
ss -t -o | grep "on,"
もし、このコマンドの結果として、特定の接続に対して timer:(on,7.8s,3) のような表示が何行もずらーっと出てきたらどうでしょう?
- ミリ秒ではなく「数秒(7.8s)」も待たされている。
- リトライ回数(3回目)に突入している。
これは、ネットワークの途中でパケットがドロップ(破棄)されているか、あるいは宛先のルーターやファイアウォールがフリーズしかけているという動かぬ証拠になります。「アプリケーションのバグではなく、ネットワークの物理的な不調、あるいはルーティングの迷子だ」と、一瞬で切り分けることができるのです。
—
5. まとめ:パケットの「心の声」を聞き逃すな
今回は、ss コマンドを使ったTCPタイマーの詳細分析について、郵便配達の例えを交えてお話ししました。
初学者のうちは、黒い画面に並ぶ無機質な英数字の羅列を見ると、どうしてもアレルギー反応が出てしまいがちです。でも、それぞれの文字や数値には、通信をしているパケットたちの「今、こういう状態で困っています」「お返事を待っています」というリアルな心の声が宿っています。
ss -t -o というたった数文字のコマンドは、その声なき声を私たちに鮮やかに見せてくれる魔法のレンズです。
ネットワークに初めて触れるあなたも、今日からぜひ、自分のパソコンや検証環境で ss コマンドを叩いてみてください。「あ、今この通信はタイマーが動いているな」「すごくスムーズに流れているな」と実感できるようになると、インフラを触るのが何倍も楽しくなりますよ。
それでは、次回のNOCエンジニアリングコラムでお会いしましょう!安全で快適なネットワークライフを!
コメント