banner
jzman

jzman

Coding、思考、自觉。
github

IPV6、IPV4デュアルスタックの問題

PS: 人生とコードは同じです。反省や反復がなければ成長はありません。

最近、シングルスタックとダブルスタックの問題に触れました。簡単に整理しますが、ダブルスタックとシングルスタックは、IPV4 と比較して、ダブルスタッククライアントのアプリケーションは明らかな接続遅延に直面し、ダブルスタッククライアントのユーザーエクスペリエンスが低下します。以下では、ダブルスタックの問題とその解決策について説明します。主な内容は次のとおりです:

  1. ダブルスタックの選択問題
  2. IPV6 にアクセスできない場合の遅延
  3. ハッピーアイボール
  4. 実際の適用

ダブルスタックの選択問題#

ダブルスタックの選択問題および IPV6 / IPV4 の選択問題は、RFC1671 ドキュメントで初めて見られます。IPV6(Internet Protocol version 6)はインターネットプロトコルの第 6 版であり、IPV4(Internet Protocol version 4)はインターネットプロトコルの第 4 版です。IPV6 は、IPV4 のアドレスリソースの枯渇に対処するために主に開発されました。IPv6 の主な強化点は、IP アドレススペースを 32 ビットから 128 ビットに拡張し、制限のない一意の IP アドレスを実現することです。ダブルスタックの選択問題は、インターネットの急速な発展の背景で発生します。ダブルスタックの状態では、DNS 解決で取得されるアドレスは 2 種類あります。シングルスタックの状態では、DNS 解決で取得されるのは IPV4 または IPV6 アドレスであり、現在は通常、シングルスタック IPV4 がデフォルトです。

IPV6 にアクセスできない場合の遅延#

IPV6 にアクセスできない場合、IPV6 をサポートするプログラムは数秒待ってから IPV4 に正常に切り替わる必要があります。これはユーザーエクスペリエンスに影響を与えるため、一部のシステムでは IPV6 を直接無効にすることもあります。

IPV6 にアクセスできない理由は次のとおりです:

そのような失敗の理由には、IPv6 インターネットへの接続のない、壊れた 6to4 または Teredo トンネル、および壊れた IPv6 ピアリングが含まれます。

次に、IPV6 接続の失敗フローチャートを見てみましょう:

image

上記の図のように、クライアントはドメイン名の解決結果として IPV6、IPV4 アドレスを取得し、最初に IPV6 に接続が成功せず、数秒後に IPV4 に切り替わります。この間の IPV6 接続の待機時間が IPV6 にアクセスできない場合の遅延です。

ハッピーアイボール#

RFC6555では、遅延を減らすためのアルゴリズムであるハッピーアイボールの要件が定義されています。基本的な 2 つの目標は次のとおりです:

  1. ユーザーに IPV6 と IPV4 の高速な接続能力を提供すること、つまり、IPV6 を使用しての接続を高速に試み、高速な接続が成功しない場合は IPV4 に切り替えること。
  2. IPV6 と IPV4 の同時接続によるネットワークへの影響を回避すること。

以下は上記のアイデアの図解です:

image

上記の図のように、クライアントは IPV6 と IPV4 の両方に対して TCP SYN パケットを送信します。IPV6 は接続に成功せず、IPV4 は成功した場合、IPV6 を再試行し、ユーザーが IPV6 接続を放棄して直接 IPV4 に切り替えるまで続けます。

上記の手順を実行すると、クライアントは IPV6 と IPV4 のアドレスが接続に成功したかどうかを知ることができます。クライアントは結果をキャッシュして、後続の接続試行に影響を与えないようにすることができます。上記の例では、IPV6 接続が失敗した場合、後続の接続では直接 IPV4 に切り替えることができます。接続結果のキャッシュには有効期間(例:10 分)を設定し、その後に接続状態を更新できます。これにより、IPV6 接続の異常時の遅延がある程度減少し、ユーザーエクスペリエンスの向上に役立ちます。

以下は IPV6 が正常に動作している場合の図解です:

image

上記の図のように、クライアントは IPV6 と IPV4 の両方に対して TCP SYN パケットを送信します。IPV6 と IPV4 の両方が接続に成功した場合、IPV6 に直接接続し、IPV4 を無視します。同様に、IPV6 接続の状態を記録し、設定された有効期間内に直接 IPV6 に接続できます。

クライアントホストがダブルスタックをサポートしている限り、ハッピーアイボールメカニズムは常に存在します。IPV4 のみをサポートするサーバーが存在する限り、ハッピーアイボールは常に存在します。時間の経過とともに、IPV4 は徐々に歴史の舞台から退場するでしょうが、ハッピーアイボールの実装シナリオは異なるかもしれませんが、基本的な要件に従います。

実際の適用#

一般的なアプリケーションレベルで使用されるドメイン名解決 API は次のとおりです:

public static InetAddress[] getAllByName(String host)

上記のメソッドは、ドメイン名 host に対応する IP アドレスを返します。この時点で、IP アドレスが IPV6 アドレスか IPV4 アドレスかに応じて、シングルスタックとダブルスタックの問題に対応できます。具体的な実装は要件に応じて調整および改善することができます。上記で説明したハッピーアイボールは、主にダブルスタック時の遅延問題を解決するためのものであり、大規模なアプリケーションでは独自のアルゴリズム実装を持っている場合があります。一部のアプリケーションでは、DNS の部分も独自に実装している場合があります。ここでは、一般的な概要を理解しておきましょう。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。