RFC8135 複素IPアドレスの追加によるIPv6の拡張

つい先日公開されたばかりの新たなRFC8135、[Complex Addressing in IPv6](https://tools.ietf.org/html/rfc8135)を日本語訳します。

# 1. Introduction

このドキュメントでは、IPv6の複素形式アドレッシングの基本コンセプトとスキームを紹介する。

IPv4([RFC791](https://tools.ietf.org/html/rfc791))やIPv6([RFC4291](https://tools.ietf.org/html/rfc4291))では、ネットワークアドレスの指定方法は符号無し整数に限られていた。
この自然数割り当ては初期のネットワークでは選択の余地がなかったが、将来のネットワーク環境には適した方式ではない。
さらに、これら固定アドレスは、クラウドコンピューティングがこれまでの概念を覆しつつある現在、可用性や仮想化において不適切な形式であることが証明されている。
IPv6において許可されているアドレスサイズの増大、浮動小数点演算ハードウェア価格の大幅な低下、また浮動小数点フォーマットが[IEEE754](https://tools.ietf.org/html/rfc8135#ref-IEEE754)で確立されたことにより、浮動小数アドレッシングだけではなく、複素形式アドレッシングにも対応することが可能となった。

# 2. Requirements Language

"MUST"、"MUST NOT"、"REQUIRED"等については[RFC2119](https://tools.ietf.org/html/rfc2119)を参照のこと。

# 3.  Natural Addresses

## 3.1.  Integer Addresses

従来のIPアドレスは整数形式だが、ドット付き十進表記でも表すことができる。
たとえば整数形式1904334091はドット付き十進表記113.129.213.11となる。
これら固定小数アドレスは自然アドレスとも呼ばれ、コンピュータが完全に固定されている、インターネット最初期のネットワークでの使用に適していた。
コンピュータがより強力になり、より大きな数、すなわち大きなアドレスを扱えるようになると同時に、コンピュータはスマホやノートPCのように移動可能になってきた。
コンピュータが移動可能になったことで、固定小数アドレスは現状に合わなくなってきた。

## 3.2.  Prime Addresses

個人のプライムアドレスは、整数アドレスの重要なサブクラスである。
本人以外にはプライムアドレスであるとわからないため、ユニークアドレスであると見做す必要がある。
多くのプライムアドレスが実験的に特定されてはいるが、多くのアドレスの中から計算に時間をかけずにプライムアドレスを識別することは非常に困難であることが証明されている。
主にセキュリティと情報収集に使用されており、例えばポストのアドレス大きなプライムアドレスの中に隠されている。

## 3.3.  Composite Addresses

複合アドレスは、2個以上のプライムアドレスで形成され、従って共有アドレスを構成する。
複合アドレスはプライムアドレスのアクセス口として使用することが可能である。
大規模な複合アドレスはプライムアドレスと区別することが難しい。
複合アドレスは軽量構造物をアドレッシングするためにも重要であり、軽量でかつ耐久性の高い飛行機にも使用されている。
これはクラウドに接続する際に重要となる。

# 4.  Complex Addresses

## 4.1.  Floating Addresses

浮動小数アドレスは、今日のモバイルコンピュータに適合した、より柔軟なアドレッシング、[モバイルIP](https://tools.ietf.org/html/rfc5944)を可能とする。
浮動小数点アドレスの形式は、IEEE754において十分に確立されている。
32ビットおよび64ビット両方の浮動小数点演算が利用可能で、これは128ビットIPv6アドレスと適合させることが可能である。

しかしながら、浮動小数アドレスを使用することでデバイスが防水になるわけではない。
防水にするためにはアプリストアもしくは配信サーバから別途アプリをダウンロードしなければならない。
特に塩水への暴露が予想される場合は、長期防水性を持つダクトテープでデバイスを補修すること。
最高の摺動性を得るためには、適切な環境に配置し、潤滑剤を塗布すること。

ダクトテープを使用し、浮動小数アドレスを物理アドレスなどの固定アドレスに固定することが可能である。
屋外で長期利用する場合は、アプリケーション層を紫外線から守るため、物理層に紫外線対策されたダクトテープを使用すること。
必要に応じてそれ以外のレイヤ層を追加してもよい。

## 4.2.  Real Addresses

浮動小数アドレスの重要な側面は、浮動小数アドレスを実数アドレスと結びつける必要があることである。
アドレスの一部を浮動小数値として表すことにより、このアドレス方式で実数アドレスを表現することが可能となり、複素アドレスの問題が解決される。
実数アドレスは、通常不動産に割り当てられる。
不動産が複数の道路インターフェイスに接続した場合、マルチホーミングがサポートされる。
各道路インターフェイスは通常、複数の実数アドレスを扱うことができる。
またモバイル端末には現在の実数アドレスが割り当てられる。

## 4.3.  Imaginary Addresses

浮動小数アドレスのもうひとつ重要な側面は、それらが複数の実数アドレスを取ることが可能という点である。
従って、複数あるうちの何れかが真の実数アドレスであると特定できなければならない。
虚数アドレスがこの直交特性を提供する。
虚数アドレスが0であった場合、虚数アドレスと実数アドレスは等しいと見做され、実数アドレスが特定される。

虚数アドレスは、通常の不動産ではないもの、すなわちクラウドコンピューティングを扱う際に重要である。
クラウドは、虚数アドレスでのみ識別し、実数アドレスと適合させることができる。
しかし、強風下ではこの識別が難しくなる。
ネットワークストーム中には、クラウドの実数アドレスが非常に不安定になる可能性がある。
またネットワークストームは時には不動産に影響を及ぼし、実数アドレスを入れ替えることもある。

## 4.4.  Flying Addresses

虚数アドレスの拡張のひとつが飛翔アドレスであり、これは鳥類キャリアによるIPに適した形式である。
[RFC6214](https://tools.ietf.org/html/rfc6214)で解説されているが、鳥類キャリアはICAOクラスG([ICAO-A11](https://tools.ietf.org/html/rfc8135#ref-ICAO-A11))空域で最もよく使用されている。

## 4.5.  Complex Addresses

実数アドレスと虚数アドレスの導入により、複素アドレスの全域を利用することが可能になる。
複素アドレスは実数部と虚数部の両方が64ビット浮動小数形式で表現されている。
実数部はデバイスの実数アドレスを提供し、虚数部は浮動小数アドレスの直交アドレスを指定する。
これにより、複素アドレスは実数アドレスと虚数アドレスの両方を特定可能となる。

複素アドレスはこれまでと同じアドレス演算が可能だが、固定小数の制限を超えることもできる。
以前は浮動小数演算ハードウェアが高コストだったため、アドレスへの虚数部分の追加はできなかった。

# 5.  Supported Addressing Schemes

## 5.1.  Absolute Addresses

法的側面だけではなく、それ以外の多くの目的のためにも、絶対アドレスの確立はますます重要になっている。
絶対アドレスは固定小数アドレスでは扱いやすいものだったが、携帯端末と浮動小数アドレスの増加により、絶対アドレスの算出はますます困難になりつつある。
複素アドレススキームでは、複素アドレスに対して絶対関数を実行することによって絶対アドレスを算出する方法を提供する。

## 5.2.  Address Argument

アドレス引数については特定のサービスや関数に対し、多くの議論の余地が残っていることが明らかになっている。
固定小数アドレスの問題点のひとつが、1次元の引数が許されていないことだ。
複素アドレススキームでは、この問題に対し、アドレス引数に対して関数を適用することで容易な解決法を提供する。
適切な関数を通すことで、曖昧さのない完全な結論を導くことができる。

## 5.3.  Safe Addresses

安全アドレスはセーフハウスで、これは様々なセキュリティシナリオで使用される。
セキュリティが必要な場合は安全アドレスを使用することができ、そしてIPアドレスからはそれが安全アドレスか否かを識別することはできない。
虚数部を大きくすればするほど、安全アドレスは実数アドレスとの結びつきを弱くすることができる。
任意の実数アドレスに対して直交する虚数アドレスを取ることで、実数アドレスを0にすることが可能であり、アドレスを完全に隠すことが可能になる。
当然ながら、必要な場合に絶対アドレスを設定することは可能である。

## 5.4.  Virtual Addresses

ひとつのネットワークインターフェイスが複数のアドレスを持つことができる仮想アドレスは、伝統的に重要な機能である。
複素アドレススキーマでは、虚数アドレスを利用することにより、実数アドレス形式よりも遙かに広い範囲での仮想化が可能となる。
単に他者のコンピュータを操作できるだけだったこれまでの仮想化と異なり、新たなアドレッシング機能と高度な仮想化により、クラウドでクラウドを操作し、クラウドを横断利用することが可能になる。
この高性能コンピューティングにより、超音速での巡航が可能となった。

## 5.5.  Rational Addresses

エンジニアは、アドレッシングの問題をはじめ、問題を合理的に観察する傾向がある。
従来の固定小数アドレスは、有理数アドレスの一部サブセットのみをサポートしていたが、複素アドレススキームは、有利数アドレスのより大きなサブセットを表すか、近似することができる。
この根拠は、浮動小数アドレスを使用することで2の累乗が完全に割り切れることから明らかである。
さらに他の除法についてもほぼ十分に正確である。
初期の浮動小数アドレスの扱いが非常に不正確であったため、有利数アドレスの全範囲はサポートされていない。
しかし有理数アドレスの有用性から、使用方法が未定ながらも最初からサポートされた。

## 5.6.  Irrational Addresses

歴史的な固定小数アドレスにおいては、設計的に対応していなかったため、無理数アドレスについてはほとんどまともにサポートされていなかった。
新しいスキームは無理数アドレスの近似がサポートされる。
その必要性についての理論的根拠は存在しないが、今日の世界の非合理性を扱うのに適しているのではないか。

## 5.7.  Transcendent Addresses

無理数アドレスの自然な拡張として、超越数アドレスの近似にも対応している。
限られた精度に制限されるが、例えば[PI](https://tools.ietf.org/html/rfc8135#ref-PI)の浮動小数アドレスを特定するため等に使用可能である。

# 6.  Geometric Addresses

## 6.1.  Round Addresses

有限である現実の数値表記に対応するため、実数アドレス(有理数アドレスや無理数アドレス)は常に切り上げで近似しなければならない。
この近似は丸めアドレスとして知られ、後述の丸め関数を用いて表現される。
このプラクティスは複素アドレスにおいてメンテナンスされ、有理数アドレスや無理数アドレスのためにサポートされる。
トークンリング([IEEE-802.5](https://tools.ietf.org/html/rfc8135#ref-IEEE-802.5))やレジリエント・パケット・リング([IEEE-802.17](https://tools.ietf.org/html/rfc8135#ref-IEEE-802.17))にパケットを転送するためには、丸めアドレスが必要となる。
丸めを表す単語には他に"ring"、"circle"、"sphere"等が存在するが、混乱を避けるためネットワーク使用時にはこれらの単語を避けること。

## 6.2.  Square Addresses

よく知られているように、幾つかのアドレス形式はインターネット上で直接使用することはできない。
テキストで表示したアドレスは、しばしば直交座標アドレスと呼ばれる。
これは文字が伝統的には画面上で四角形で表され、インターネットアドレス上でも直交座標として働くからである。
これらの直交座標アドレスを浮動小数形式に変換するため、ホストテーブルにかわりドメインネームサービス(DNS)が導入された。

ホストテーブルは直交座標アドレスを浮動小数形式に変換する旧式の方法である。
これは既知の全ての直交座標アドレスと浮動小数を変換テーブルに列挙していたが、これは直交座標アドレスが変更されるたびに新しい浮動小数を算出してテーブルに反映しないといけないため大きな手間が必要だった。

直交座標アドレスでは、直交座標形式のPiを使用することがよくある。[付録A](https://tools.ietf.org/html/rfc8135#appendix-A)を参照。

## 6.3.  Polar Addresses

直交座標アドレスに関する誤解は、地球を平面のように表現することです。
複素アドレススキームはデカルト座標系をサポートしているが、また極座標アドレス形式で表すこともできる。
地球が平面であれば極座標系を導入することができないが、地球は直交座標アドレスだけで完全に特定することはできないため、地球が平面ではないことの証明になる。
極座標アドレスは、絶対アドレスと引数から簡単に算出することができる。
極座標アドレスから複素アドレスへは、複素極座標上で指数関数を用いることによって復元が可能である。

極座標アドレスはまた、北極で生活していることで有名なサンタクロースに対応するためという用途を持っている。
サンタの位置特定には、仮想アドレスを使用することによってのみ到達が可能である。
伝統的な整数型および固定長のアドレス形式では仮想アドレスが許されないが、複素アドレス上では表現可能である。
北アメリカ航空宇宙防衛司令部(NORAD)のサンタトラッカーは極座標アドレスなしではサンタを追いかけることができなかった。

## 6.4.  Root Server

既存のDNSシステムは、ルートサーバでは大量のアクセスを捌くために最小限の処理しか行わない。
複素アドレスでは、各クライアント自分自身がルートサーバとなれるような解決策を提供する。
ビルトインの浮動小数演算ソフトウェアもしくはハードウェアを用いて、直交座標アドレスからルートアドレスを算出することができる。
これによってルートサーバの負荷を軽減することが可能になる。
また従来のルートサーバと平行動作が可能であり、複素アドレスへの移行が容易となっている。

## 6.5.  Implementation Considerations

複素アドレススキームに必要な浮動小数計算ユニットの入手と実装は、今日では非常に簡単である。
浮動小数計算の共通フォーマットは[IEEE754](https://tools.ietf.org/html/rfc8135#ref-IEEE754)を参照。
64ビット浮動小数計算は多くのデバイスで十分に確立、検証されている。
CやFORTRANを含む多くのコンピュータ言語にもサポートがある。
標準Cライブラリ(もしくはlibc)は現代の全言語で一貫してサポートされている。
Intercalでは別途独立した実装が存在する。
[ISO C99](https://tools.ietf.org/html/rfc8135#ref-C99)においては<complex.h>で複素アドレスをより直接的にサポートしている。
これををインクルードすることで、複素アドレスを最小限の実装労力で効率的に処理することが可能となる。

# 7.  IPv6 Address Mapping

複素アドレスはIPv6アドレスに以下のようにマッピングされる。

```
    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |6                                                             3|
   |3               complex address (real part)                   2|
   +---------------------------------------------------------------+
   |3                                                              |
   |1               complex address (real part)                   0|
   +---------------------------------------------------------------+
   |6                                                             3|
   |3            complex address (imaginary part)                 2|
   +---------------------------------------------------------------+
   |3                                                              |
   |1            complex address (imaginary part)                 0|
   +---------------------------------------------------------------+
```

128ビットのIPv6アドレスを64ビットずつに分割し、前半は実数アドレスを、後半は虚数アドレス部分を保持する。
実数アドレスと虚数アドレス部分は[IEEE754](https://tools.ietf.org/html/rfc8135#ref-IEEE754)で定義されている64ビット浮動小数形式で表されなければならない。
実数アドレスは複素アドレスの実数部に、虚数アドレスは複素アドレスの虚数部にマッピングされるため、コンパイラの最適化が可能になる。

# 8.  IANA Considerations

この文書はIANAのアクションを必要としないが、IANAが何らかの反応をする可能性はある。

# 9.  Security Considerations

複素アドレスは安全でない形式であると見做される。
何故ならば、0で割るとNaNが返されるからである。
任意長の複素アドレスを有限長のIPv6のアドレス空間に当てはめるため、実質的に非実用的ではあるが、NaNとして扱われる空間範囲外のアドレスを識別するように注意する必要がある。
しかし、固定小数アドレスの安全でない操作の多くは解決されている。
例えば、ルートアドレスが複素アドレスになると、値が-1になる直交座標アドレスのエラー条件を容易に解決できる。
実数部分が0である場合それは実在するアドレスではないとわかり、虚数部分が1の場合はエラーが発生すると想定できる。

浮動小数アドレスの計算では、0除算などの割り込みが発生して実行アドレスがずれる場合がある。
通常それらはスタックに積まれ、割り込みハンドラのアドレスに置き換えられる。
これら割り込みから回復する前に、さらに再帰呼び出しがかかる場合がある。
従って、全体的な計算時間は予測不可能である。
エラーはコアダンプを引き起こす可能性があり、コアダンプは重大な影響を引き起こし、アドレス空間の何処にでも到達してしまう可能性がある。
このような影響を避けるため、注意して実装する必要がある。
コアダンプは広範囲の漏洩をもたらす可能性もあり、セキュリティプロトコルの重大な脆弱性となり得る。
NaNは「No Agency Number」の略語で、物事を安全に保つことの重要性を示す指標である。

# 10.  References

## 10.1.  Normative References

### C99

「Information technology -- Programming Languages -- C」 [ISO/IEC 9899:1999](https://www.iso.org/standard/29237.html)

### IEEE754

「IEEE Standard for Floating-Point Arithmetic」 [IEEE 754, DOI 10.1109/IEEESTD.2008.4610935](http://ieeexplore.ieee.org/document/4610935/?reload=true)

### OSI

「Information technology -- Open Systems Interconnection -- Basic Reference Model: The Basic Model」 [ISO/IEC 7498-1, 1994](https://www.iso.org/standard/20269.html)

### RFC791

「Internet Protocol」 [DOI 10.17487/RFC0791](https://tools.ietf.org/html/rfc791)

### RFC2119

「Key words for use in RFCs to Indicate Requirement Levels」 [DOI 10.17487/RFC2119](https://tools.ietf.org/html/rfc2119)

### RFC4291

「IP Version 6 Addressing Architecture」 [DOI 10.17487/RFC4291](https://tools.ietf.org/html/rfc4291)

### RFC6214

「Adaptation of RFC 1149 for IPv6」 [DOI 10.17487/RFC6214](https://tools.ietf.org/html/rfc6214)

## 10.2.  Informative References

### ICAO-A11

「Air Traffic Services, Annex 11 to the Convention on International Civil Aviation」 [July 2001](http://www.icao.int/secretariat/PostalHistory/annex_11_air_traffic_services.htm)

### IEEE-802.17

「Telecommunications and Information Exchange between Systems Local and metropolitan area networks」 [DOI 10.1109/IEEESTD.2011.6026209](http://ieeexplore.ieee.org/document/6026209/)

### IEEE-802.5

「Token Ring Access Method and Physical Layer Specifications」 [DOI 10.1109/IEEESTD.1992.7438701](http://ieeexplore.ieee.org/document/7438701/)

### PI

「Life of Pi」 [20th Century Fox, 2012](http://www.foxmovies.jp/lifeofpi/)

### pibill

 [Indiana Pi Bill](https://en.wikipedia.org/wiki/Indiana_Pi_Bill)

### RFC5944

「IP Mobility Support for IPv4, Revised」 [DOI 10.17487/RFC5944](https://tools.ietf.org/html/rfc5944)

# Appendix B.  Implementation Example

以下はISO C99で定義されているcomplex.hを使用して、本RFCのコンセプトを実装する簡単な例である。

```c

#include <complex.h>
#include <math.h>
#include <stdio.h>

// 複素アドレスの定義
typedef complex ca;

// 複素アドレス作成
ca ca_create_complex_address(double real_address, double imaginary_address)
{
	return real_address + I * imaginary_address;
}

// 実数アドレスを取得
double  ca_get_real_address(ca ca_val)
{
	return creal(ca_val);
}

// 虚数アドレスを取得
double  ca_get_imaginary_address(ca ca_val)
{
	return cimag(ca_val);
}

// 複素アドレスを取得
complex ca_get_complex_address(ca ca_val)
{
	return ca_val;
}

// 浮動小数アドレスを取得
double  ca_get_floating_address(ca ca_val)
{
	return creal(ca_val);
}

// 物理アドレスを取得
double  ca_get_physical_address(ca ca_val)
{
	return cimag(ca_val);
}

// 絶対アドレスを取得
double  ca_get_absolute_address(ca ca_val)
{
	return cabs(ca_val);
}

// アドレス引数を取得
double  ca_get_address_argument(ca ca_val)
{
	return carg(ca_val)*360/(2*M_PI);
}

int main()
{
	ca ca1, ca2;

	ca1 = ca_create_complex_address(1.0, 0.0);
	printf("The complex address (%f,%f)\n", creal(ca1), cimag(ca1));
	printf("has the real address %f and imaginary address %f\n",
        ca_get_real_address(ca1),ca_get_imaginary_address(ca1));
	printf("This represents the floating address %e and physical address %f\n",
        ca_get_floating_address(ca1),ca_get_physical_address(ca1));
	
	ca2 = ca_create_complex_address(0.0, 1.0);
	printf("The complex address (%f,%f)\n", creal(ca2), cimag(ca2));
	printf("This represents the absolute address %f\n", ca_get_absolute_address(ca2));
	printf("The address argument resolution is %f\n", ca_get_address_argument(ca2));
	
	return 0;
}
```

# その他

複素アドレスを使うことで、IPアドレスの表現がより多彩なものとなります。
これはインターネットがますます便利になりそうですね。

しかし、いつにも増して意味不明な部分が多い。
"sliding performance"とか"square peg"とか"propulsion system"ってなんだ。
他にも英語による駄洒落を使った部分とか訳しようがなくてかなり適当なので、うまいこと訳してくれるプルリク待ち。