ダウンロードが通常の速度で進むのにページが引っかかるのは、帯域ではなく往復回数を示している。VPNは暗号化されたホップを一つ加え、Torの回路は複数加えるが、余分なホップごとに、有用なバイトが動く前にハンドシェイクのコストがかかる。そのコストは短い接続を多く開くページで目立ち、一度の大きな転送ではほとんど消える。パターンが見えれば、議論はどの道具が速いかではなくなる。

症状が示すのは設定コストであり、容量ではない

ページの読み込みは、名前の検索、トランスポートのハンドシェイク、TLSのハンドシェイク、そして最初のリクエストという依存するやり取りの連鎖だ。経路上の各ホップは、何かが描画される前に自分の往復をその連鎖に挿し込む。大きなダウンロードは同じ設定コストを一度だけ払ってから流れるので、二つの作業負荷が食い違うのはまさにそのためだ。

ネットワークパネルでは合計ではなく、最初のバイトまでの待ち時間を読む。短い内容のダウンロードで待ちが長ければ往復回数を指し、待ちが短く内容のダウンロードが長ければスループットを指す。二つ目の宛先に対しても繰り返すが、混雑したリレーの背後のホスト一つでは何も証明できない。転送は良好なのにクリックが遅いなら、帯域よりずっと先に設定コストを疑う。

遅延と容量は異なる形で失敗する

二つの測定を取れば、混乱の大半は自然に解ける。遅延はやり取り一回あたりの固定コスト、容量は時間あたりの速度なので、一方の経路が前者に強く後者に弱いことがある。遠くの端点でも処理装置が遊んでいれば小さな要求には素早く応答し、それでも持続的な転送は上りリンクが許す範囲に制限される。利用者はこの分裂を、素早いクリックの後にほとんど動かない進行バーが続く形で体験する。

持続的な転送で容量を試し、速度が安定するか鋸歯状になるかを見る。何度も繰り返す小さな要求で遅延を試し、最良の標本ではなくばらつきを読む(ばらつきが広いと平均が示すより悪く感じるからだ)。変更の前後で両方の数値を記録しなければ、後で間違った変数に功績を帰すことになる。

二つを一つの数値として扱うと、本当に見たい測定を決して動かさない修正が生まれる。遅延の苦情に帯域の増強で答えるのは、最もよくあるこの形だ。

オニオンルーティングは自分で選んでいないホップを加える

Torの回路は通常、ガード、中間ノード、出口という三つのリレーを使い、クライアントは地図ではなく合意からそれらを選ぶ。だから経路は宛先への直線よりはるかに長くなりうる。各リレーは他人の通信も運ぶので、あなたのストリームはそのリレーに残る容量を分け合う。

回路の再利用は、新しいストリームが別の構築に払う代わりに既存の回路に乗れるので、コストを和らげる。要求ごとに新しい回路を築くクライアントは設定コストを繰り返し払い、再利用するものよりずっと悪く感じる。出口の選択も重要で、負荷の重い出口もあり、どの出口に着いたかを画面は教えてくれない。この共有こそ設計の狙いであり、遅延を固定値に合わせられない理由だから、遅い出口が一つあることは、この仕組みを捨てる弱い理由にすぎない。

連鎖の順序を変えると実験が変わる

VPNを先にしてTorを後にすることは、Torを先にしてVPNを後にすることとは別の実験だ。前者ではVPNの端点が回路全体を運ぶので、あなたの接続網はVPNのアドレスしか知らない。後者ではVPN接続そのものがオニオン経路の内側で運ばれ、出口はVPNの通信を見る。どちらも正当な設計であり、どちらかを素のVPNと比べれば別のものを測ることになるからこそ、両者を組み合わせる件についてのTorプロジェクトのページは、時間の問いになる前に、何を隠したいのかという問いとして枠づけている。

端末、接続網、宛先を固定し、実行の間で要素をちょうど一つだけ変える。サーバー、回路、試験用ホストを一緒に動かすと、誰も帰属できない差が生まれる。最適化する前に各配置が誰から何を隠すのかを書いておくべきで、隠したかったものを露出する速い連鎖は改善ではない。

二度目の実行に耐える比較

実際に使う宛先を二つか三つ選び、小さな資源を多く引くページと大きな転送を一つ含めて、それぞれで同じ操作の時間を測る。日を変えて一連の測定を繰り返す。

対話的な作業は悪い瞬間で評価されるので、最速の標本ではなく中央値と最悪値を報告する。クライアント、端点または出口、その実行で回路やトンネルを再利用したかを記す。中央値を改善して裾を悪化させる変更は勝利ではなく取引であり、利用者が気づくかどうかを決めることが本当の判断だ。

関連記事