言い換えれば、アドレスがIPv4の場合、なぜわざわざIPv6として表現するのでしょうか。
これはIPv6を介して表現されたIPv4であるため、アプリケーションは1つのIPスタックのみをサポートする必要があります。
IPv6表記を介してIPv4アドレスを参照できるということは、アプリケーションでIPv6サポートを確実に実現することに取り組むことができ、重複作業について心配する必要がないことを意味します。
最近、一部のディストリビューションはデフォルトでIPv4互換性を無効にし(Debianなど)、Windowsもデフォルトでこれを行います。プログラマーとしてこれに対応するには、2つのソケットをバインドする必要があります。1つはIPv4ソケット、もう1つはIPV6_V6ONLY
フラグ付きのIPv6ソケットです(これにより、/proc/sys/net/ipv6/bindv6only
の状態に関係なく、IPv6との互換性がない場合にのみIPv6がバインドされます)。
以下のコメントで、マイクは私を この素晴らしいサイト にリンクしました。AF_に依存しないプログラミングにsockaddr_storageを使用する方法に関する情報があります(AF_INET6を使用するか、AF_INETを使用するかを決定するかどうかに大きな関連性があります。 AF_INET6を並べて)。また、私はBeejのネットワークプログラミングガイドが好きです。これには いくつかの同様の情報 もあります。推奨読書。ありがとう、マイク!
アドレスがIPv4の場合、なぜわざわざIPv6として表現するのでしょうか。
上位互換性?
そのフォームをV4MAPPEDアドレスで使用するのが適切です。
V4MAPPEDアドレスは、ネットワークで送信される実際のIPv6ヘッダーに表示されることは想定されていません。これらは、単一のトランスポートエンドポイントがIPv4とIPv6の両方を同時に使用して通信できるデュアルスタックIPv4/IPv6ホスト実装を使用するアプリケーションによってのみ使用されることになっています。
エンドポイントがIPv6のみである必要なしにIPv6プロトコルファミリを使用してTCP接続を開き(システムのデフォルトである可能性があります)、宛先アドレスをV4MAPPED形式で指定する場合)オペレーティングシステムはIPv4経由で接続し、システムでgetsockname
に相当するものを呼び出すと、V4MAPPEDアドレスが返されます。