Perl の RFC6555 の実装を書いてみた

RFC6555 - Happy Eyeballs

という割と最近 RFC になった ipv6 fallback 問題を解決する手法があるので Perl で実装してみた。
https://github.com/masanorih/p5-IO-Socket-Happpy-EyeBalls

RFC6555 自体実装方法がいくつかあって、その内 Google ChromeMozilla Firefox が使っているという方法と同じ(と理解している)方法で実装しています。すなわち、

  • ipv6 アドレスがあれば優先的にそれに接続する
  • 300ms 待ってその間に接続されれば、その socket を返す
  • 上記がタイムアウトした場合 ipv6 の接続は close し ipv4 での接続を試みる

という動作をします。二つ同時に SYN packet を投げたりはしないです。

実験的に作ったものなので色々問題があって

  • 名前空間。個別の module ではなく IO::Socket::IP の option パラメータとかで十分な気がする
  • sockopt とか全然使ってない
  • AnyEvent とか使ったほうが ipv6 connect が早くなる。多分

ipv6 環境を持ってる人がまだ少ないので試せる人あまりいないと思いますが、近々 World IPv6 Launch とかあるので、その時にでも試してみると良いかも。