読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

BSDカーネルの設計と実装 読書会 (32) #readDaemon

勉強会

おさらい

TCPとは 【 Transmission Control Protocol 】 - 意味/解説/説明/定義 : IT用語辞典

構造体

イーサネットフレームとは 〔 Ethernetフレーム 〕 【 Ethernet frame 】 - 意味/解説/説明/定義 : IT用語辞典

アソシエーション

ネットワークの基礎を学習する CCNA対策講座(30):無線LANセキュリティの必要性と対策 (2/2) - @IT

MTU

MTUとは 【 Maximum Transmission Unit 】 - 意味/解説/説明/定義 : IT用語辞典

MTUを自分で弄らせるやつって昔のルータにあったような

スライディングウィンドウ - Wikipedia

13.4 伝送制御プロトコル(TCP)

  • TCP接続の状態=堅牢性に主眼をおいている。
  • 通常の接続確立の手続きは3ウェイハンドシェイク
  • FreeBSDでは接続を開始するためのSYNに3つのオプションをサポート
  • 接続が確立すると、それぞれのピアから送られるすべてのパケットには確認応答とウィンドウ情報が含まれるようになる
  • 一定の時間内に確認応答を受け取ることが出来ない送信者は、それが失われたものと考え再送信する
  • それぞれのピアはFINビットをセットしたパケットを送ることで、いつでもデータ送信を中止できる

正しく完了していない古い接続が残っていたら、強制的に終了する。 こんな感じの接続をハーフオープン接続といい、TCPにはそんな機能がある。 SYN Flooding Attack ‐ 通信用語の基礎知識

TCPは3ウェイハンドシェイクで、SYN(シーケンス番号の要求)を送り合い、ACK(応答確認フラグ)を返す。

SYN ‐ 通信用語の基礎知識

ACK (TCP) ‐ 通信用語の基礎知識

http://www.infraexpert.com/network/tcpip24.gif

http://www.infraexpert.com/study/tcpip9.html

やたらピアって言葉が出てきますが、たぶんリクエストを送り合っているっていう感じからP2Pネットワーク的な意味合いでピアって言葉を使っているんじゃないでしょうか。

SYNオプション

  • 最大セグメント長の指示
  • ウィンドウサイズのシフト
  • タイムスタンプの付与

ARMだと即値フィールドが狭い(2バイト)ので、シフトフィールドを用意してより広く使えるようにしている。

ARM Information Center

それと同じような感じで、FreeBSDのSYNにもSYNに65535オクテット以上のウィンドウを使うためにウィンドウサイズをシフトするオプションが用意されている。

また、タイムスタンプを付与することで、ラウンドトリップ時間の計測にも使える。

ラウンドトリップとは 【 round trip 】 - 意味/解説/説明/定義 : IT用語辞典

FINビットをセットしたパケットを送ることでデータ送信を中止できる。「さよなら」といえば「さよなら」が返ってくる。

FINパケット ‐ 通信用語の基礎知識

片方のピアの接続が失われたら、それはハーフオープン接続とみなされる。

f:id:shigemk2:20150314143352p:plain

13.4.2 シークエンス変数

  • それぞれのTCP接続はTCP制御ブロックの中に多くの状態変数を管理する
  • 送信ウィンドウ
  • 出力モジュールは、データが送信可能かどうかを判断するためにこれらの変数を使用し、入力モジュールは、受信したデータが受け入れ可能かどうかを判定する
  • 接続に対してTCPのタイムスタンプオプションを有効にすると、入力パケットが受け入れ可能かどうかの検査は、タイムスタンプの検査によって補強される

シークエンス番号が短時間に繰り返し利用されるような状況で古い重複パケットが偶発的に受け入れられてしまう危険性を低減する。

13.5 TCPのアルゴリズム

TCPの接続状態、出力状態、状態遷移は、外部イベントとタイマーに依存する。 TCPの処理は、3つのイベントのいずれかによって発生する

  1. ユーザからの要求
  2. 接続に対するパケットの受信
  3. タイマーの時間切れ

いずれかの状態が発生すると、それまで許可されていなかったデータ送信が許可されるようになる

  • ユーザが送信要求を実行して、送信キューに新しいデータをおいた
  • ピアからのウィンドウ更新情報の受信
  • 再送タイマーの時間切れ
  • ウィンドウ更新タイマーの時間切れ

以下の状況が発生すると制御情報を含むパケットを送ることができる

  • 接続状態の変化
  • 確認応答すべきデータの到着
  • 受信キューからデータが削除されたことによる受信ウィンドウの変化
  • 緊急データの送信要求
  • 接続の強制終了

TCPはいろいろとアルゴリズムが備わっているけどUDPは貧弱。

13.5.1 タイマー

  • UDPのソケットと違い、TCPの接続は多くの状態情報を管理する。そのためにいくつかの操作を非同期で行う
  • カーネルはcallout()関数としてタイマーサービスを提供する
  • 出力処理のためには2つのタイマーを使用する(再送タイマーと継続タイマー)
  • キープアライブタイマー(3ウェイハンドシェイクが完了するまでの期限を設定し、タイマーが切れると接続をクローズする)
  • 2MSLタイマー(twice the maximum segment lifetime FINに対するACKを送受信するとスタートするタイマーで、それが切れた時点で制御ブロックを削除する ずっと待つことはせずに、期間が過ぎたら接続を切る)

2MSL待ち TCP 詳細

f:id:shigemk2:20150314145813p:plain

13.5.2 ラウンドトリップ時間の推定

スループットを決定する上で重要な判断は、再送タイマーとして使われる値の設定である。

システムによるラウンドトリップ時間の計算式

平滑化移動平均 srtt

f:id:shigemk2:20150314154441p:plain

  • αは平滑化係数
  • rttはラウンドトリップ時間
  • 新しい確認応答が届くたびにラウンドトリップ時間の推測値を得ることができる
  • 対応する平方偏差にして0.75を使用する
  • GPSも平坦な場所よりビル街のほうが精度が低い

平方偏差ってなに

偏差(へんさ)とは - コトバンク

基本統計量<確率・統計<Web教材<木暮 仁

13.5.3 接続の確立

  • 新しいTCP接続を確立するための方法(能動的な接続or受動的な接続)

能動的接続

  • tcp_attach()関数を実行し、inpcb(プロトコル制御ブロック)とtcpcb構造体(制御ブロック)を作成する。
  • パケットヘッダテンプレートを用意
  • キープアップタイマーを75秒に設定し、最初のtcp_output()を実行する
  • tcp_output()で制御フラグを設定
  • 新しい接続をオープンするときはtcp_hc_get()を実行して以前の接続に関する情報を検索する(ここでいうhcはホストキャッシュの略)
  • 有効期限の切れたエントリは削除するので、ホストキャッシュが大きくなりすぎることはない
  • パスMTU検索を使うこともでき、フラグメント禁止のIPフラグを付加したパケットを送信する

PMTUDとは 〔 経路MTU探索 〕 〔 パスMTU探索 〕 - 意味/解説/説明/定義 : IT用語辞典

  • 最初に接続がオープンされたときはラウンドトリップ時間の情報が存在しないので、再送タイマーの値はデフォルト値を6秒に設定する
  • キープアライブタイマーの時限が切れても応答が届かなければ接続時間切れエラーで終了する
  • TCP制御ブロックにTF_ACKNOWフラグを設定して出力関数を実行し、SYNに対する確認応答が速やかに行われる

IPフラグメントについて (1) - ネットワークエンジニアを目指して

f:id:shigemk2:20150314160358p:plain

受動的接続

  • 異なる種類のイベントが発生する
  • ソケットを作成してアドレスを与えるまでは同じ
  • listenコールが実行されることで接続を受け付けられる状態になる
  • acceptシステムコールが完了した時点で、最大で1つのデータウィンドウをすでに受信して、確認応答を終了している可能性がある

13.5.4 SYNキャッシュ

  • 以前のTCP実装だとサービス不能攻撃(DoS攻撃)に対応できない
  • そこで、SYNパケットを保管して必要に応じて破棄するSYNキャッシュという方法が導入された
  • LISTEN状態のソケットがSYNパケットを受信すると、TCPモジュールはsyncache_add()関数を実行して、そのパケットに対して新しいSYNキャッシュエントリを割り当てる
  • 新規でリソースを作らない まさにキャッシュ

13.5.4 接続の終了

  • TCPは対照的で全二重の接続なので、独立に終了処理を開始することが出来る
  • ソケットに関するデータ送信が完了したことを通知するためにshutdownシステムコールを実行する
  • SS_NOFDREFフラグがセットされた時にも解放される。つまり、ソケットは、ファイル記述子かプロトコル制御ブロックから制御されている間は存在し続ける
  • こちらからFINパケットを送り、向こうのアプリケーションが終了したときはリセットフラグを立てる
  • お互いにFINを送受信しないと終了しないっぽい
  • TCPが終了時に接続を完了すると、tcp_close()が実行される

User → FD → Socket → TCP

  • FDをクローズするとSocketにNOFDREFフラグがつく

ファイル記述子 - Wikipedia

13.6 TCPの入力処理

  • TCPの入力処理はUDPの入力処理に比べてかなり複雑

  • 受信したIPデータグラムからTCPヘッダの場所の特定

  • パケット長を計算してIPの擬似ヘッダを用意
  • TCPのヘッダ長を検査
  • 指定されたポート番号から接続に対応するプロトコル制御ブロックを決める
  • ソケットが接続を受け付けていることを確認
  • パケットヘッダに指定されているTCPオプションを処理
  • 接続に対応する休眠時間を初期化

他にもチェックすることはいろいろあるけど、不正なパケットによって混乱やデータの権限が発生するのを防ぐためには、これらのチェックは重要な意味を持っている

  • 次にパケットが受信ウィンドウに適合しているかどうかをチェックする
  • TCPパケットの処理は、入力パケットと受信状態の可能性を考慮した極めて包括的なものでなければならない
  • ヘッダ予測

http://www.mars.dti.ne.jp/~otk/bak/200111-linuxkernel24.pdf

期待値計算でよく使われるやつは計算が早く、あまり使われないものは計算が遅い。

  • いろいろやったらtcp_output()を実行して確認応答に対する処理を完了する

  • ヘッダ予測の検査で問題なければ、順序通りのパケットなのでフラグを立てて終わり。

  • ヘッダ予測によって処理できなかったパケットについては以下の順序で処理がすすむ。(12個ぐらいチェックポイントがあるので、長い)

パケットの体裁とか状態とか

  1. タイムスタンプ処理があるか

  2. 開始位置がrcv_nxtより前か

  3. 削除後もデータが残っていて、ソケットを作成したプロセスがそのソケットをクローズしているか

  4. セグメントの末尾がウィンドウ範囲を超えているか(即時的接続再生)

フラグとフィールドについての確認

  1. タイムスタンプが指定されていてパケットのシークエンス番号が次に期待される値か

  2. RSTがセットされているか

  3. ACKがセットされていないか(だいぶレアな話かと)

  4. 確認応答フィールドの値が以前の確認応答の値よりも大きいか

ウィンドウのはなし

  1. ウィンドウフィールドが、既知の送信ウィンドウをすすめるものであるか

  2. 緊急データフラグURGがセットされているか(プロトコル制御ブロックに保管する)

受信パケットのデータフィールド

  1. データがrcv_nxtで始まっているか(遅延確認応答)

  2. FINフラグの検査(送信側がすでにクローズしていればTF_ACKNOWをセットする)

13.7 TCPの出力処理

  • TCPのパケットは、データに加えて確認応答とウィンドウフィールドを持ち、これらのいずれかのフィールドが変化するとパケットが送られる。
  • TCPの送信ポリシーが実装するアルゴリズムには、ネットワーク負荷を最小限に抑えながらスループットを最大化することが求められる
  • 接続上にデータを送信する景気となるイベントにはいくつか種類がある

13.7.1 データの送信

  • tcp_output()が実行されるわかりやすい要因はユーザが新しいデータをソケットに書き込んだ場合である
  • UDPとちがうのは、送信されるのはデータ自体ではなく、そのコピーであるということ
  • tcp_output()関数は、出力パケットヘッダを保持するmbufを確保し、ヘッダテンプレートの内容をそのmbufにコピーする
  • ウィンドウの情報を相手に伝える 受信バッファがあいているかどうか 送っている最中に自分の情報を入れる
  • 緊急の場合はURGとPSHを同時に送り出す
  • サービス種別とパケット生存期間フィールドを含むIPヘッダを初期化して、ip_output()を実行する

サービス種別(TOS)

TOSとは 【 Type Of Service 】 - 意味/解説/説明/定義 : IT用語辞典

生存期間(TTL)

TTLとは 〔 生存時間 〕 【 Time To Live 】 - 意味/解説/説明/定義 : IT用語辞典

13.7.2 シリーウィンドウシンドローム

SWS ‐ 通信用語の基礎知識

TCPで、送信側が受信側よりも高速な場合、受信側のウィンドウがいっぱいになる。受信側がそのデータを少しだけ処理すると、小さなウィンドウサイズが送信側に送られるため、それに合わせた小さなデータセグメントが送られる。これが繰り返すと小さなデータセグメントが大量に送られ、ネットワークの効率が落ちる。この現象をSWSという。

これを防ぐため、受信側は小さなウィンドウサイズがあいた時に嘘のウィンドウサイズとして0を送ることでこの現象を回避できるが、TELNETのようなリアルタイム性の高いパケットの場合問題となる。

  • フロー制御の受信側と送信側の両方に備わっているのが望ましい(必ず備わっている必要はない)

  • FreeBSD: 送信側で回避→受信ウィンドウサイズをmax_sndwndに保存し、max_sndwndの半分以上の送信が可能ならば新しいセグメントを送信する 実装がまずかったねっていう話

13.7.3 微小パケットの話

  • 二峰性の分布(動物の耳みたいな形のアレ)
  • ネットワークの遅いところでは一文字の入力でも遅い
  • 同時に接続上を流れる微小パケットは常に1つに限られるアルゴリズム
  • TCP_NODELAYフラグの追加

13.7.4 遅延確認応答とウィンドウ更新

  • TCPパケットは、データ転送以外の目的でも送信されることがある
  • 確認応答を遅延させてデータをピギーバッグ
  • ウィンドウ更新を合体

  • 大量データ転送の受信で、2段階の実行

  • 入力を受け付けてパケットの受信処理を行うとき
  • 読み出し処理によって入力バッファからデータが削除されたとき(このときの処理がよいスループットを出せるかどうかで重要なところ)

書籍

BSDカーネルの設計と実装―FreeBSD詳解

BSDカーネルの設計と実装―FreeBSD詳解

  • 作者: マーシャル・カークマキュージック,ジョージ・V.ネヴィル‐ニール,砂原秀樹,Marshall Kirk McKusick,George V. Neville‐Neil,歌代和正
  • 出版社/メーカー: アスキー
  • 発売日: 2005/10/18
  • メディア: 単行本
  • クリック: 122回
  • この商品を含むブログ (57件) を見る