分散型ホールパンチング
パブリックノードがリレーサーバーの役割を務める
DHTアルゴリズムを用いれば最も近いリレーノードを見つけることもできる ダイアルされる側のみプライベートノードの場合
https://scrapbox.io/files/634a67dcb31dc000200d8ef8.jpg
(YがXにダイヤルしている)
1. Yはリレーサーバーに接続し、Xへのリレーを要請する
2. リレーサーバーはXへ接続をリレーする
3. XはYとの接続を試みる。Yはパブリックノードであるためこれは成功する
双方がプライベートノードの場合
https://scrapbox.io/files/634a6cc3861239001f7f7467.jpeg
上から続く
(X→Yへのホールパンチング)
4. Xはリレーサーバーを介してYへパケットを送る
5. リレーサーバーを介して4を受け取ったYはパケットを送り返す
6. Xは5を受け取ることでRTTを計測し、YにCONNECTメッセージを送る 7. またXは6を送ってからRTT/2が経過したらYに直接パケットを送信する
8. Yは6受け取ったらすぐにXに直接パケットを送信する
RTTに大きな誤差がなければ4と5のタイミングはほぼ等しくなり、双方はお互いにポートを開けた状態で相手のパケットを受け取れることになる。これがサーバーを介さないホールパンチングの肝である 以下は各プロトコルにおける方法である
従来のホールパンチングが可能なプロトコルであれば分散型も実現できる
QUICにおける処理