Shadowrocket Hysteria2解説:QUICベースで速い理由と適したネットワーク環境

UDPとQUICのハンドシェイクから、パケットロスや高遅延環境でのHysteria2の仕組み、Shadowrocketで手動設定する際の確認項目まで解説します。

この記事の概要

この記事は、サービス提供者から取得したHysteria2のパラメータを使い、接続性能の仕組みを理解したうえで手動設定したいShadowrocketユーザー向けです。QUICのハンドシェイクとパケットロスの復旧、適したネットワークの見分け方、Add Serverの項目確認、Global Routingとの組み合わせ、接続失敗時の切り分け手順を扱います。

Hysteria2、UDP、QUICの関係

ShadowrocketのHysteria2は、QUICをベースにしたプロキシプロトコルです。UDPはQUICのデータグラムを運ぶ基盤であり、QUICはユーザー空間で接続確立、暗号化、輻輳制御、データ確認、パケットロスからの復旧を処理します。Hysteria2を「UDPをそのまま送るだけ」と考えることはできません。アプリのデータはいったんHysteria2のセッションに入り、QUICによって暗号化・番号付けされたパケットとして構成されます。

従来のTCP暗号化接続では、通常TCPハンドシェイクとTLSハンドシェイクを順に完了させます。RTTが180msの回線を例にすると、相手の応答を待つ往復が1回増えるたび、最初の有効なデータまで約180ms長く待つことになります。QUICはトランスポート層の接続確立とTLS 1.3の安全なネゴシエーションを組み合わせるため、新規接続でも少ない往復で送信可能な状態に到達できることがあります。実際の時間はDNS解決、サーバーの応答、無線ネットワークのスケジューリング、回線の混雑にも左右され、特定のミリ秒数が必ず短縮されるわけではありません。

QUICは複数の論理streamにも対応します。あるパケットが失われた場合、その内容を必要とするstreamは再送を待ちますが、失われたデータに依存しない他のstreamは処理を続けられます。これによりstream間のヘッドオブラインブロッキングを軽減できます。ただし、単一のstreamに連続データをまとめている場合、欠落したバイトの復旧は必要です。そのため「QUICを使えば」パケットロスの影響を完全に受けなくなるわけではありません。

高遅延・高パケットロス環境で速くなる可能性がある理由

速度差は主に輻輳制御とパケットロスからの復旧によって生じ、プロトコル名そのものが原因ではありません。パケットロスが発生すると、送信側は届かなかったデータを判断し、再送を手配し、送信ペースを調整する必要があります。RTTが高いほど、誤判定や確認待ちのコストは大きくなります。連続したパケットロスが多いほど、実効スループットも低下しやすくなります。QUICはユーザー空間で確認範囲とパケットロスのタイマーを管理するため、実装側で対策を進化させやすい一方、最終的なスループットはサーバー側の出口、端末性能、アクセス回線にも制限されます。

Hysteria2の設定には上り・下り帯域幅の値が含まれることがあります。これらは速度測定の結果でも、数値が大きいほどよいというものでもありません。実装によっては、帯域幅パラメータの有無に応じて輻輳制御の動作を選択します。サービス提供者から明確な数値が示されている場合はそのまま入力し、空欄にするよう案内されている場合は、回線契約の公称値をもとに勝手に入力しないでください。実測50 Mbpsの回線に500 Mbpsと入力すると、送信が速すぎてキューが膨張し、遅延上昇やパケットロスの増加を招くことがあります。

帯域幅遅延積は、計算例で考えると理解しやすくなります。RTT 200msの100 Mbps回線では、パイプ内に同時に保持できるデータ量は約2.5MBです。これは100,000,000 bit/s × 0.2 s ÷ 8で求められます。送信ウィンドウがこの値を大きく下回ると、回線を使い切れない可能性があります。一方、送信が速すぎて途中のキュー容量が不足すると、待ち行列やパケットロスが発生します。Hysteria2の性能は、輻輳制御が現在の回線容量にどれだけ近づけるかによって変わります。

元のパラメータどおりに入力

推奨

Address、Port、Password、SNI、帯域幅、認証オプションはすべて、手元の設定を基準にします。不足している値を推測して補わないでください。

適する場面:初回追加と日常利用

任意項目は空欄のままにする

サービス提供者がデフォルトの輻輳制御を明示している場合、または帯域幅の入力を求めていない場合は、該当する任意項目を空欄のままにします。

適する場面:設定説明にデフォルト値が明記されている場合

帯域幅の値を自己判断で引き上げる

実際のアクセス能力を超える数値を入力すると、待ち行列が悪化する可能性があります。これをもとにプロトコル自体の正常性を判断することはできません。

適する場面:管理できるネットワークでのパラメータ検証に限る

結論:回線のボトルネックを確認してから調整する

Connectivity Testの遅延が安定しているのに大容量通信が不安定な場合は、まずサービス提供者から示された帯域幅項目とUDPの到達性を確認してください。1回の速度結果だけを見て、Up、Down、または同様の項目の値を何度も引き上げないでください。

Hysteria2に適したネットワーク環境

Hysteria2は、RTTが高い回線、ランダムなパケットロスがある回線、ネットワーク切り替えが頻繁な回線でよく使われます。たとえばモバイル回線の電波変動、地域をまたぐ通信、混雑時間帯では、従来の信頼性重視の転送で復旧待ちが長くなることがあります。QUICは失われたパケットを復旧でき、ネットワーク条件が許せば複数のstreamを進行させられるため、このような環境では接続確立や継続通信の違いを確認しやすくなります。

低遅延・低パケットロスで経路も安定している場合、どのプロトコルでもボトルネックがサーバー側の出口やアクセス帯域にある可能性があり、Hysteria2にしても速度差が明確に出ないことがあります。現在のネットワークがUDPを制限している場合、QUICのハンドシェイクはそのままタイムアウトする一方、別の転送方式を使う既存設定なら接続できることもあります。プロトコルは理論上のスループットだけでなく、到達性とパラメータの一致を優先して選んでください。

観察される現象 考えられる意味 推奨する対応
RTT 150~250ms、パケットロスがまれに1~3% 長距離回線または無線回線に揺らぎがある 元のパラメータでHysteria2をテストし、Connectivity Testの結果を複数回記録する
遅延は安定しているが、通信中に大きく上昇する キューの混雑、または帯域幅の設定が高すぎる サービス提供者が示したUp、Downの値に戻し、公称帯域をもとに増やさない
常にtimeoutと表示される UDPに到達できない、Portが誤っている、またはハンドシェイク項目が一致していない UDPが許可されていることが分かっているネットワークで再テストし、Port、SNI、Passwordを確認する
接続後、一部のドメインだけ異常がある ルールまたはDNS経路の問題の可能性がある Global Routingを確認し、Proxyの状態で短時間比較する

結論:timeoutなら最初にUDPの到達性を確認する

同じパラメータで一方のネットワークでは接続でき、別のネットワークではtimeoutが続く場合は、まず現在のネットワークからUDPと対象Portへ到達できるか確認してください。すべてのネットワークで失敗する場合は、項目の確認に戻ります。

ShadowrocketでHysteria2を手動入力する

開始前に、サービス提供者から渡された完全なパラメータを用意します。通常、最低限必要なのはサーバーのAddress、Port、認証情報で、TLSを使う場合はSNIも含まれることがあります。設定によってはALPN、混淆用Password、上り・下り帯域幅、証明書検証に関するオプションも指定されます。項目名は画面表示や設定方法によって異なることがありますが、パラメータの意味を入れ替えてはいけません。

Port 443を例にすると、これは一般的なポートの例にすぎず、すべてのHysteria2サービスが443を使うわけではありません。Addressにはホスト名またはIPを入力し、Portはサーバーの待受値と一致させます。PasswordはHysteria2の認証値であり、Shadowrocketの購入情報ではありません。SNIはTLSハンドシェイクでサーバー名を検証するために使われ、通常はサービス提供者から示されたドメインをそのまま入力します。

  1. アプリを確認する

    App StoreからShadowrocketを入手し、開発者がShadow Launch Technology Limited、アプリIDが932747118であることを確認します。アプリは買い切り方式で、システム要件はApp Storeページの記載に従います。

  2. 追加画面を開く

    Homeで右上の「+」をタップしてAdd Serverを開き、TypeでHysteria2を選択します。

  3. 接続項目を入力する

    Address、Port、Password、SNIの順に入力します。ALPN、Obfuscation、Up、Downなどの任意項目は、手元の設定に明記されている場合だけ入力してください。

  4. 検証項目を確認する

    証明書検証に関するスイッチは、手元の設定に従います。正常な証明書を使う場合は検証を有効にし、項目の誤りを回避するために検証状態を安易に変更しないでください。

  5. 保存して選択する

    保存後にHomeへ戻り、新しく作成したサーバー項目をタップして、その項目の前に選択マークが表示されていることを確認します。

  6. 接続テストを実行する

    接続スイッチをオンにしてシステムVPN設定を許可し、Connectivity Testを実行します。失敗した場合は、timeout、TLS、authenticationなどの表示カテゴリを記録してください。

サービス提供者から単一のHysteria2 URIが渡されている場合は、まずURIの構造を確認してから、Shadowrocketが対応するインポート入口を使います。以下は構文を示すためのダミー値であり、実際の接続には使えません。URI内の認証値、ホスト名、Port、クエリパラメータ、名前部分はそれぞれ異なる役割を持ち、Passwordに特殊文字が含まれる場合は正しくURLエンコードする必要があります。

hysteria2://[email protected]:443/?sni=edge.example.com&insecure=0#HY2-demo

既存のサブスクリプションがある場合は、Homeの右上にある「+」からAdd Serverを開き、TypeをSubscribeに設定してサブスクリプションURLを入力します。ダミー値の例はhttps://example.com/sub?token=xxxxです。保存後、Homeに戻って下にスワイプして更新します。更新すると、そのサブスクリプションが管理する項目は上書きまたは再作成されるため、パラメータを変更する場合は、手動で自動生成されたサーバー記録を長期的に編集するのではなく、サービス提供者がサブスクリプション側での変更を求めているか確認してください。

Global RoutingとOn Demandの組み合わせ方

Hysteria2はクライアントとサーバー間で転送セッションを確立する方法を決め、Global Routingはどのリクエストをそのセッションに渡すかを決めます。両者は異なる階層です。HomeでHysteria2の項目を選択していても、Global RoutingがDirectなら通信は直接接続として処理されます。サーバーが選択されていることだけでは、リクエストがその接続を通っているとは限りません。

Configの状態では、現在の設定ファイルにあるルールに従って通信を振り分けます。よく使われるルールキーワードにはDOMAIN-SUFFIX、GEOIP、IP-CIDR、FINALがあります。ルールは通常上から順に評価され、最初に一致したルールが動作を決めます。FINALは、それまでに一致しなかったリクエストを受け持ちます。Proxyはルールの問題を切り分ける一時的な比較に使え、Directは異常がプロキシ経路に関係するか確認する際に使えます。Sceneは条件に応じて設定済みの動作を切り替えます。

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

On Demandは、条件に応じて接続を開始するための機能です。操作経路はSettings → On Demand → Enableです。その後、自分のネットワーク条件に合わせてトリガールールを設定します。Hysteria2を初めて切り分けるときは、手順を単純に保ってください。サーバーを手動で選び、接続を手動でオンにしてConnectivity Testを実行します。基本接続が正常だと確認してからOn Demandを有効にします。先に有効にすると、トリガー条件、システムVPNの状態、プロトコルパラメータが同時に結果へ影響し、原因を特定しにくくなります。

ルール構文の例にあるexample.com192.0.2.0/24は説明用です。実際のConfigには、自分で管理している、または既存の設定で提供されているルールを使用してください。変更前に元の設定を保存し、変更後はProxy、Direct、FINALに一致するリクエストをそれぞれテストします。1つのウェブページだけを確認して、ルール全体が有効だと判断しないでください。

接続タイムアウト、ハンドシェイク失敗、速度変動の切り分け手順

切り分けは、最も確認しやすい条件から始めます。まず端末の時刻が自動設定になっていることを確認し、次にAddressとPortを確認します。その後Password、SNI、ALPN、混淆パラメータを確認し、最後に帯域幅とルーティングを調整します。端末の時刻ずれはTLS証明書の有効期限判定に影響することがあります。AddressやPortの誤りは通常、timeoutが続く症状になります。Passwordの不一致は認証失敗として現れることがあり、SNIと証明書名が一致しない場合はTLSエラーが発生することがあります。

Connectivity Testは、現在の項目の遅延と基本的な接続性を確認するのに適していますが、1回の結果が継続的なスループットを示すわけではありません。3~5回連続でテストし、すべてtimeoutになるか、最初だけ遅いか、遅延が80msから600msへ跳ね上がるかを記録します。テストに成功しても実際のリクエストに異常がある場合は、Hysteria2のPasswordやPortを変更し続けるのではなく、Global Routing、Configのルール、DNS処理を確認してください。

timeoutが表示され続ける場合は?

まずHomeで選択されている項目が、追加したばかりのHysteria2であることを確認し、AddressとPortを再確認します。次に、UDPが許可されていることが分かっている別のネットワークで再テストします。特定のネットワークだけで失敗する場合は、まずそのネットワークのUDP到達性を判断してください。

TLSエラーが表示された場合は何を変更する?

端末の時刻が自動設定になっているか確認し、SNIを一字ずつ照合します。SNIは通常、メモ用の名前ではなくドメインです。証明書検証の状態は手元の設定に従い、正しく入力する代わりに検証オプションを変更しないでください。

接続できるのに速度が安定しない場合は?

Connectivity Testを3~5回連続で実行し、遅延の変動を確認します。次に、Up、Down、または同様の帯域幅項目を自己判断で増やしていないか確認します。サービス提供者が示した元の値に戻してから再テストし、複数の項目を同時に変更しないでください。

サーバーを選択したのに反映されない場合は?

Homeの接続スイッチとGlobal Routingを確認します。現在Directになっている場合は、短時間だけProxyに切り替えて比較してください。Proxyでは正常でConfigでは異常がある場合は、Configに戻り、ルールの順序とFINALの動作を確認します。

サブスクリプション更新後に手入力した値が消えた場合は?

Subscribeで管理されている項目は、更新時にサブスクリプション内容に従って再作成されることがあります。まずHomeで項目の取得元を確認し、自分のサービス提供者にサブスクリプション内のHysteria2パラメータを確認してください。更新で上書きされる一時的な変更に頼らないでください。

プロトコルの問題とルールの問題を切り分ける場合は、まずGlobal Routingを一時的にProxyに設定し、対象のHysteria2項目を選択してConnectivity Testを実行します。基本接続が正常ならConfigに戻し、DOMAIN-SUFFIX、GEOIP、IP-CIDR、FINALを順に確認します。切り分けが終わったら元の振り分け状態に戻し、テスト用の設定を長期間使わないようにしてください。

Shadowrocketは主にiPhoneとiPadで利用され、Mac、Apple TV、Apple Visionでの利用可否はApp Store製品ページの互換性欄で確認できます。システム要件はApp Storeページの記載に従います。端末によってネットワーク切り替えやシステムVPNの動作は異なる場合がありますが、Hysteria2の項目確認の原則は共通です。まずアドレスとポートを確認し、認証とTLSパラメータを一つずつ一致させ、最後に輻輳制御とルール振り分けを確認します。

Shadowrocketをダウンロード