パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Linuxカーネルの「TCP_TIMEWAIT_LEN」変更は無意味?」記事へのコメント

  • by Anonymous Coward on 2015年09月09日 17時03分 (#2879341)

    ネットワーク上に滞留していたパケットのためかと思ってたけど。
    Linuxではどんな扱いなんだろう?

    • by Anonymous Coward

      > ネットワーク上に滞留していたパケットのためかと思ってたけど。

      そうです。

      > Linuxではどんな扱いなんだろう?

      話に出ている tcp_tw_reuse は、

      https://twitter.com/kosaki55tea/status/641267021443952640 [twitter.com]
      > シーケンスナンバーの初期値を十分ずらしてやれば TIME-WAITなsocketを再利用しても安全

      というものだそうで。

      TCP_TIMEWAIT_LEN を増やすほうは、コネクションが混ざっちゃう可能性があって、
      長時間滞留しているパケットがあると危険ですね。
      tcp_tw_reuse の方がたぶん安全。

      • by Anonymous Coward

        > TCP_TIMEWAIT_LEN を増やすほうは、コネクションが混ざっちゃう可能性があって

        失礼、「増やすほうは」じゃなくて、「減らすほうは」が正しい表現でした。

      • by Anonymous Coward

        TCPシーケンス番号予測攻撃 [wikipedia.org]を回避するためにSO_REUSEADDRに関係なくシーケンス番号をバラけさせる必要があるので「tcp_tw_reuseの方がたぶん安全」ということにはならないと思う。
        どっちみちランダムにバラけさせて開始するなら、低いとはいえ被る可能性があるSO_REUSEADDRの方が危ない。
        どうせ誤差レベルだし、他のメリット考えたらSO_REUSEADDRしといてもまず問題無いと思うけど。
        # Node.jsとかはデフォルトでSO_REUSEADDRだったかな。

        • by Anonymous Coward

          > どっちみちランダムにバラけさせて開始するなら、低いとはいえ被る可能性があるSO_REUSEADDRの方が危ない。

          だいぶ誤解があるようです。
          SO_REUSEADDR と tcp_tw_reuse は全然違う動作をします。

          そもそも、SO_REUSEADDR は、TIME_WAIT で ip_local_port_range が満杯になっている時には効きません。
          効くのは、local port の自動割り当て時ではなく、bind(2) で明示的にポート番号を指定している場合だけです。

          また、tcp_tw_reuse は、直前に使っていたシーケンス番号から 65535 + 2 だけ離してから再使用するので、
          被ることがないことが保証されてます。

          だから、被る可能性がある TCP_TIMEWAIT_LEN よりも、tcp_tw_reuse の方が安全だっていうのが今回の話なわけです。

          • by Anonymous Coward

            SO_REUSEADDR と tcp_tw_reuse はごっちゃにしてたよ、申し訳ない。
            だけどシーケンス番号を離してもその長さのデータがずらずら飛んできたらやっぱり衝突するはずです。
            どうせ今時のボーレートならすぐにシーケンス番号は一巡してしまうんですから。

            それとtcp_tw_reuseを使わない場合にもシーケンス番号はランダム化すべきです。
            シーケンス番号のランダム化は昔から必要とされていたはずなのでとうぜん実装はあると思うのですが、
            であればそれを使うべきであって再利用のためにちょっとずらしただけの状態でいるべきではありません。

            そしてシーケンス番号がランダム化されているなら、即座に再利用するより一定の時間を開けたほうが安全でしょう。
            長いほうが良いけど、そこはパフォーマンスとの兼ね合いもあるので考えて決める。

            • by Anonymous Coward

              > だけどシーケンス番号を離してもその長さのデータがずらずら飛んできたらやっぱり衝突するはずです。

              いえ、ずらしているのは送信側のシーケンス番号なので、衝突しないことは保証されています。
              もうクローズしたソケットですから、自分からデータを送信することはありませんから。

      • by Anonymous Coward

        > tcp_tw_reuse の方がたぶん安全。

        断言する前に、パケットが通過するすべてのネットワーク機器がport のreuse を正しくハンドリングできることを確認してくださいね。

        • by Anonymous Coward

          検証するまでもなく断言できますよ。
          もしも仮にそういう機器があれば、どちらのやり方でもトラブル出ますから、
          tcp_twの方がマシっていう判断は動きません。

日々是ハック也 -- あるハードコアバイナリアン

処理中...