panda's tech note

Poptrie

Radix tree

最長一致アルゴリズムの最も基本的なものはRadix treeです。Radix treeの実装については,こちらを参照してください。PoptrieはRadix treeを大幅に拡張しています。

Radix treeは二分木であり,ルートの深さを1としたとき,深さdからd+1の枝はプレフィックスのdビット目,各ノードが1つのプレフィックス(経路)に対応します。つまり,あるノードについて,ルートからそのノードまでの枝はプレフィックス,深さはプレフィックス長,すなわち最長一致におけるプライオリティを示します。

ここで,0.0.0.0/00.0.0.0/264.0.0.0/264.0.0.0/3128.0.0.0/1の5つのプレフィックスを考えると,下図のようになります。

radix tree

しかし,Radix treeをインターネット上のコアルータで交換されている50万経路以上のルーティングテーブルで用いるには,以下の問題があります。

  • 木の深さがビット長に比例し,IPv4で最大32,IPv6で最大128の深さまで探索が必要になるため,木構造を辿る際のメモリアクセス回数が多い。さらに,木構造を辿る操作はランダムアクセスに近いメモリアクセスパターンであるため,CPUキャッシュが効きにくい。
  • 木構造は子ノードへのポインタで接続されるため,メモリ使用量が大きくなり,CPUキャッシュミスが多くなる。

これのような原因により,一般にRadix treeの性能が悪くなります。