TCP勉強会始めました

こんにちは、グリーで運用に携わっているhiromi.kaiと申します。よろしくお願い致します。

最近、私たちのチームではTCPの勉強会を始めました。講師は本ブログにも記事を書かれているebisawa先生です!

そもそもなぜTCPの勉強会?と思われる方もいらっしゃると思いますが、グリーのサービスを運用している際に直面するトラブルには、TCPプロトコルに関する詳細や実装がわかっていないと対応できない、難易度の高いものもあるからです。そのような難しいトラブルにも、対応できる人員を増やそう、ということで、勉強会を開く運びになりました。

第1回サマリ

第1回はTCPのプロトコルの説明で、主にTCPの信頼性確保の仕組みや、ヘッダの解説などがありました。
簡単にサマライズすると、以下のような内容です。

  • イーサネットやIPヘッダにも誤り検出の仕組みがあるのに、なぜTCPヘッダにもチェックサムがあるのか?

    • 送受信するデータ量が多いため、CRCによるよるデータチェックでは、データが化けているにも関わらず偶然符号が一致してしまうこともあり得る。

そのため、データを何重にもチェックする仕組みが必要になってくる。

  • TCPヘッダの「緊急ポインタ」って何?

    • TelnetでCtrl+Cを押した場合のように、優先的に処理してもらいたい内容について、バッファを経由せずにダイレクトに処理するために使用する。
    • ただし、アプリケーションにおいて緊急ポインタを処理する仕組みを実装している必要がある。
  • パケットがドロップされる場合にはどのようなシチュエーションがあるのか

    • 長距離の伝送路の場合、途中でパケットにノイズが乗ってしまう場合がある。
    • ルータの処理能力や回線の帯域を超えた場合にはキュー溢れを起こしてドロップを起こす。
    • ヘッダを最適化して回線を不当に使用する場合に対抗して、わざとパケットをドロップさせる場合もある。

第2回サマリ

第2回はtcpdumpの読み方やTCPの脆弱性についてお話がありました。

  • tcpdumpの読み方を教えてください

    • 非常に大まかに書くと、以下のようにパラメータが出力される
    • 経過時間 (送信元IPアドレス:ポート) > (送信先IPアドレス:ポート) フラグ シーケンス番号
    • ここでいうフラグはTCPヘッダにあるフラグを指し、SYNやRST、FIN、PSHの頭文字に対応する。.(ドット)はフラグが立っていないことを指す
    • ACKについてはシーケンス番号以降に、独立して出力される
    • シーケンス番号は32ビットの範囲内でランダムに生成される
    • 2回目以降の通信のやりとりからは、シーケンス番号は前のやりとりに使用した値の相対値が出力される
  • シーケンス番号のこぼれ話

    • 昔のOSの実装ではシーケンス番号は時間で値が変化するようになっていた
    • この仕組みを悪用して、現在のシーケンス番号を総当りで当ててしまい、それ以降の通信を第三者が乗っ取ることができてしまった(知る人達の間では騒ぎになったとか)(参考(Wikipedia))
    • 現在の実装では、なりすましを防ぐために完全にランダムになっている
    • 現在でも、Telnetのように継続してTCPコネクションを張りっぱなしにするプロトコルは別の手段を用いたなりすましのターゲットになるおそれがあるので注意が必要である
  • なぜTCP通信の始まりは3Wayハンドシェイクなのに、通信の終わりは4つパケットを送るのか

    • TCPは片方の通信を閉じて片方の通信を維持するハーフクローズが可能なため
    • 送信側がFINを送った後でもデータを受信できるような仕組みになっている
    • UNIX系のOSではshutdownというシステムコールで実現することが可能

おわりに

多分このブログの読者の中には「このくらい知ってるよ!」という方もいらっしゃるのではないでしょうか。より高度な内容をフィードバックできるように頑張っていきたいと思います。

それでは次回の勉強会レポートでお会いしましょう!