Hysteria2とは?QUICベースの通信が高速な理由と適したネットワーク環境

Hysteria2のQUIC/UDP通信と輻輳制御を解説。高遅延・高パケットロス環境での特性と、Shadowrocketで設定する項目を確認できます。

この記事の概要

利用するサービスとサブスクリプションをすでにお持ちで、ShadowrocketでHysteria2を使う方向けの記事です。まずQUIC、UDP、輻輳制御の関係を説明し、続いてアドレス、ポート、認証、TLS、帯域幅の各項目を確認します。最後に接続時の症状から問題を切り分けます。ネットワークとの相性は、UDPの到達性、パケットロスの種類、継続通信時の状態を確認して判断しましょう。一度の遅延測定だけでは判断できません。

Hysteria2・QUIC・UDPの関係

Hysteria2はQUICをベースにしたプロキシプロトコルです。Shadowrocketはクライアントとして、ユーザー自身が利用するHysteria2サーバーに接続し、サーバーが宛先への通信を中継します。アプリの購入と接続サービスの利用は別です。クライアントを購入しても、サーバーアドレス、認証情報、サブスクリプションは付属しません。

UDPは下位のトランスポートで、QUICはその上で暗号化、接続管理、信頼性のあるストリーム、輻輳制御を実現します。「UDPベースだからデータが失われても処理されない」という意味ではありません。TCPのプロキシ通信を運ぶ場合、QUICの信頼性のあるストリームでは確認応答と再送が行われます。プロキシ経由のUDP通信では、データグラムに適した方式で転送されます。

UDP
クライアントからHysteria2サーバーまでの下位トランスポート
TLS 1.3
QUICで使用される暗号化ハンドシェイクの基盤
443/UDP
サーバーの待ち受けポートの設定例。固定ポートではありません

ここで示す443/UDPはポートの一例です。サーバーは別のUDPポートでも待ち受けられるため、クライアントには実際のポートを入力してください。ネットワークで443/TCPが許可されていても、443/UDPも許可されているとは限りません。通常のWebページをブラウザーで開けても、Hysteria2の通信経路が利用できるとは限りません。

通信が速くなることがある理由:多重化と輻輳制御

QUICは1つの接続で複数のストリームを扱えます。あるストリームでパケットロスが起きても、複数の通信を1本のTCPバイトストリームにまとめた場合のように、外側の順序制御で欠落部分が補われるまで、ほかのストリームのデータ配送が必ず待たされるわけではありません。ただし、各ストリームは回線容量と輻輳制御を共有し、信頼性のあるストリーム内では順序どおりの配送が必要です。

Hysteria2のもう1つの特徴は、帯域幅を基準に動作するBrutal輻輳制御です。設定した目標速度で送信し、パケットロスを補います。ランダムなパケットロスがある一方、回線に余裕がある環境では、ロスが起きると送信速度を大きく下げる方式よりも、スループットを維持しやすい場合があります。BrutalとBBRなど、どの方式が使われるかは、帯域幅の設定、ネゴシエーションの結果、クライアントとサーバーの実装によって異なります。プロトコル名だけでは判断できません。

仕組み改善する可能性がある現象残る制約
QUICの多重化外側の順序制御によってストリーム間で発生する待ち時間すべてのストリームが同じ回線容量を共有する
信頼性のあるストリームの再送パケットロス後にTCPプロキシ通信のデータ完全性を回復再送にかかる時間と追加の帯域幅
Brutalランダムなパケットロスによる継続通信の速度低下目標帯域幅が大きすぎると、キューの滞留やパケットロスが増える可能性がある
BBR方式回線状況の推定に基づいて送信動作を調整経路、実装、サーバーの制約によって効果が異なる

判断の基本:回線の実効容量を測ってから帯域幅を設定

同じ経路でダウンロード、アップロード、応答遅延を継続して測定し、実際の容量に合わせて帯域幅を設定します。数値を上げてもスループットが変わらず、Webページの応答だけが遅くなる場合は、さらに上げるのではなく設定を下げて再測定してください。

「速さ」はプロトコルに固定された特性ではありません。高遅延の環境では、ハンドシェイク、リクエストの往復、パケットロスからの回復に時間がかかります。QUICでも物理的な距離は縮まりません。サーバーの外向き回線、接続先サイトの速度制限、ローカルの無線干渉も、プロトコルを切り替えるだけでは解消しません。未検証の割合を示して速度向上を保証することはできません。

適したネットワーク環境と、先に確認すべき環境

まず試す価値があるのは、UDPが到達可能で、遅延が比較的大きく、ある程度のランダムなパケットロスがある一方、利用可能な帯域幅も確保されているネットワークです。キューが継続的にいっぱいになることでパケットロスが発生している場合、送信速度を上げるとかえって悪化することがあります。「ランダムなパケットロス」と「輻輳によるパケットロス」を分けて観察し、単一のパケットロス率だけで判断しないでください。

ShadowrocketにHysteria2を追加する:項目を確認する順序

ユーザーがすでに利用しているサブスクリプションの設定を、そのまま使うのがおすすめです。TLSや認証の項目を手動で入力し忘れるのを防げます。Hysteria2と旧プロトコルのHysteriaは、名前を変更するだけでは切り替えられません。インポート後に項目を開き、TypeがHysteria2になっていることを確認してください。画面の言語やアプリのバージョンによって項目の並びは異なる場合があります。似た名前から値を推測せず、各項目の意味を確認しましょう。

  1. 設定情報の確認

    利用中のサービスについて、アドレス、UDPポート、認証情報、TLS、必要に応じて難読化の設定を用意します。サブスクリプションを読み込むには、Home → 右上の「+」→ Type → Subscribe の順に進み、自分のサブスクリプションURLを入力して保存します。

  2. プロトコルの選択

    手動で追加する場合は、Home → 右上の「+」→ Type → Hysteria2 の順に進みます。サブスクリプションから読み込んだ場合は、該当項目を開いてTypeを確認します。別のプロトコルに変更して、元の設定値をそのまま使わないでください。

  3. 接続情報の入力

    サーバーの情報に従ってアドレスとポートを入力し、認証情報を設定します。アドレス欄にはホスト名またはIPアドレスだけを入力してください。Webページのパス、プロトコルの接頭辞、ポート番号をつなげて入力しないでください。ポート番号は別の欄に入力します。たとえばサーバー情報に443と明記されていれば、443を入力します。

  4. 暗号化関連項目の確認

    TLSのサーバー名SNIと証明書の要件を確認します。サーバーで難読化が有効になっている場合は、難読化の種類とパスワードもそれぞれ照合してください。認証パスワードと難読化パスワードは用途が異なるため、互いに代用できません。

  5. 保存して接続を確認

    保存後、Homeに戻って対象の項目を選択し、接続します。現在のGlobal Routingの設定を記録し、アクセス可能であることが分かっている接続先で確認してください。テスト後は普段の設定に戻します。DNS、ルール、帯域幅を同時に変更しないでください。

項目の意味入力の根拠よくある間違い
サーバーアドレスサーバーから指定されたホスト名またはIPアドレス管理画面やサブスクリプションのURLを誤って入力
Port実際に待ち受けているUDPポート別のサービス用のTCPポートを入力
認証情報サーバーが指定する認証文字列全体文字列の一部が欠けている、または前後に空白がある
SNITLS証明書に対応するサーバー名IPアドレスで接続する場合、証明書名の確認は不要だと思い込む
難読化の設定サーバー側で有効かどうかと、対応する設定値クライアント側だけで有効にする、またはパスワードが一致しない
アップロードとダウンロードの帯域幅クライアント側から見た通信経路の性能とサーバー側の制約上りと下りの値を逆に入力する、またはMB/sをMbpsとして扱う

帯域幅の単位に注意してください。1 MB/s = 8 Mbpsですが、実際のペイロード速度は通信のオーバーヘッドの影響も受けます。通常、ダウンロードはサーバーからクライアントへの方向、アップロードはその逆です。入力前に現在の項目説明を確認してください。ローカル回線の公称速度が高くても、同じ数値で遠隔地まで継続通信できるとは限りません。

接続後の確認:通信が対象の項目を経由しているか

HomeでHysteria2の項目を選んでも、すべてのリクエストがその経路を通るとは限りません。Global RoutingのDirectは直接接続、Proxyはプロキシ経由の確認に使用します。Configでは現在の設定ファイルのルールに従って処理され、Sceneでは現在のシーンの設定も確認が必要です。診断時は設定状態を記録してください。記録しないと、プロトコルの比較で実際には異なる経路を測定してしまうことがあります。

Configを使う場合は、Configで現在有効なファイルを確認してから、対象のリクエストに適用されるルールを確認します。ルールは通常、上から順に照合されます。以下は構文を説明するための例であり、現在のファイルと置き換えて使える完全な設定ではありません。PROXYのポリシーは、実際の設定内に存在し、想定する経路を指している必要があります。

DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

テスト中に接続状態が自動的に回復した場合は、Settings → On Demandの現在の設定を確認し、オンデマンド接続が起動したかどうかを確認してください。On Demandは接続を開始する条件を設定するものであり、認証、ポート、TLSの設定ミスを修正するものではありません。一時的に設定を変える前に元の値を記録し、確認後に元へ戻してください。

Hysteria2のよくある問題:症状別の確認方法

タイムアウトが続くのに、通常のWebページは開けるのはなぜ?

まずアドレスの名前解決結果と、実際に使用するUDPポートを確認します。次に、利用可能な別のネットワークでも同じ項目への接続を試してください。通常のWebページはTCPで通信している場合があり、UDP経路が正常であることの証明にはなりません。1つのネットワークだけで失敗する場合は、そのネットワークのUDPポリシーを優先して確認します。2つのネットワークでどちらも失敗する場合は、サーバーの待ち受け設定、ファイアウォール、サービスの状態を確認してください。

認証エラーや証明書エラーが表示されるのはなぜ?

認証エラーの場合は、認証文字列全体と前後の空白を照合してください。パスワードの代わりにサブスクリプションURLを使わないでください。証明書エラーの場合は、デバイスの時刻、SNI、サーバー証明書を確認します。IPアドレスで接続する場合も、証明書に対応するドメイン名の入力が必要なことがあります。難読化の設定が一致しない場合もハンドシェイクに失敗することがあるため、サーバーの設定と1項目ずつ照合してください。

帯域幅を大きくしたのに、かえって遅くなるのはなぜ?

目標速度が通信経路の容量を超えると、キューの滞留、再送、補償通信が増えることがあります。帯域幅の目標値を下げ、ほかの大容量通信を一時停止して、継続通信中のWebページの応答を比較してください。スループットが上がらず、応答遅延だけが大きくなる場合は、低い設定を維持し、サーバーが実際の利用可能速度を制限していないか確認してください。

接続できているのに、一部のWebサイトが開かないのはなぜ?

まずHomeでGlobal Routingを確認し、Directになっていないか、ルールが別の経路を指定していないかを調べます。次にConfigのルール照合結果とDNSの名前解決を確認してください。大きな応答や特定のネットワークでのみ通信が途切れる場合は、経路MTU、UDPフラグメンテーション、中継ネットワークの制限を確認します。原因が分からないうちに、DNS、ポート、難読化の設定を同時に変更しないでください。

サブスクリプションを更新したら、手動で変更した設定が消えたのはなぜ?

サブスクリプションを更新すると、サブスクリプションで管理される項目が再書き込みされる場合があります。まず変更した内容を記録し、元のサブスクリプションに正しい設定が含まれているか確認してください。長期的な設定には、自分が利用するサービスの有効な情報を使ってください。サブスクリプションの更新、Configの更新、App Storeからのアプリ更新は別の操作であり、相互に置き換えることはできません。

設定を最終的に保存する際は、ネットワークの種類、サーバーの項目、Global Routingの状態、帯域幅の設定、問題が起きた具体的な操作を記録してください。同じ作業を複数回行った結果を比較するほうが、一度だけ出た最高速度より参考になります。特定のサーバーでのみ問題が起きる場合は、情報を伏せたうえで症状を自分のサービス提供元に確認してください。認証情報を公開しないでください。

App Storeで正規版を確認 →