オープンソースカンファレンス2014 Hiroshima! 
jus研究会広島大会 
これからのアプリ開発は 
IPv6対応で行こう! 
2014年9月20日 
IPv6普及・高度化推進協議会 
渡辺 露文  
About me 
渡辺 露文(わたなべ つゆふみ) 
Twitter: @tsuyu23 
某SIer勤務 
IPv6普及・高度化推進協議会 会員 
IPv6導入に起因する問題検討SWG 
アプリケーションのIPv6対応検討SWG 
技術評論社 
Software Design誌連載 
(2012年12月号~ 
    2014年1月号) 
! 
2
Do you know … 
IPv6 ? 
Internet Protocol version 6 
インターネットの通信に関する規約(RFC791) 
IPネットワークに接続するには1つ以上のIPアドレスが必要 
皆さんが馴染んでいるのはIPv4(例:10.1.2.3) 
3
実はIPv6を使える環境が 
増えています(1) 
最近のOS 
Windows Vista以降 
Mac OS X 
Linux 
FreeBSD 
 … 
! 
! 
4 
いずれも 
デフォルトで 
利用可能
実はIPv6を使える環境が 
増えています(2) 
インターネット回線 
フレッツ光ネクスト 
au ひかり 
NURO 光 
 … 
! 
! 
5 
利用可能 
既存ユーザへの自動導入も 
進行中 
すでに、ユーザからあなたのサービスにIPv6で 
アクセスされようとしている…かもしれない
日本におけるIPv6の普及 
状況 
フレッツ光ネクストのIPv6普及率 
(2014年6月) 
IPv6普及率:3.1%! 
フレッツ光ネクスト契約数:13,588,000契約! 
! 
au ひかりのIPv6普及率(2014年6月):68% 
! 
! 今後本格的に普及する前に 
出典:IPv6普及・高度化推進協議会 アクセス網におけるIPv6普及状況調査! 
   http://v6pc.jp/jp/spread/ipv6spread_03.phtml 
IPv6対応を始めたほうが良い 
6
余談:IPv6でインターネット 
にアクセスできるかの確認方法 
Webブラウザで http://www.test-ipv6.jp にアクセス 
! 
! 
! 
! 
Webブラウザで http://www.kame.net にアクセス 
! 
! 
! 
7 
IPv6でアクセスすると、 
亀が踊ります♪
IPv6の背景: 
  IPv4アドレス枯渇 
IPv4アドレスの在庫状況 
(地域インターネットレジストリ) 
8 
通信事業者、ISP、 
データセンター、 
クラウド事業者等の 
在庫が残るのみ 
世界的に足りなくなってきている
もう少しIPv6を知ろう! 
9
IPv4とIPv6とでは何が 
違うのか? 
アドレス体系が異なる 
(IPv6のアドレス空間は広大) 
例 
IPv4)192.0.2.1 
IPv6完全表記) 
2001:0db8:0000:0000:0001:0000:0000:0001 
IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠) 
10 
! 
他にも機能的にIPv4と異なることがある 
  IPv4とIPv6は互換性がない
IPv4とIPv6の接続性 
11 
Internet 
IPv4対応 
(IPv6非対応) 
システム 
IPv4/IPv6 
両対応システム 
IPv6対応 
(IPv4非対応) 
システム 
(1) 
(2) 
(3) 
IPv4端末 
IPv4/IPv6 
両対応端末 
IPv6端末 
IPv4 
IPv6
IPv6に対応しない場合の 
影響 
1. IPv6のみの環境と通信できない! 
ビジネス機会を損失する! 
システム連携が行えず要件を満たせなくなる! 
2. 今後、IPv4はサービスレベルが低下していく! 
通信事業者等によるCGN(Carrier Grade NAT) 
導入により、遅くなり、使用できるセッション 
数が減る可能性がある! 
! 
! IPv6に対応しなきゃ! 
12
インフラがIPv6に対応す 
るだけでいいのでは? 
ネットワークとサーバがIPv6に対応すれば、IPv6で接続 
可能 
! 
接続は可能だが… 
サービスが正常に動作しない 
13 
!!! 
かもしれない 
システム連携がうまくいかない! 
想定外の挙動をする! 
  … 
! アプリケーションもIPv6に対応しなきゃ!
IPv6対応の話をする前に 
…① 
このコード、イケてない… 
use IO::Socket::IP; 
$host = “198.51.100.1”; 
: 
: 
my $sock = IO::Socket::IP->new( 
PeerAddr => $host, 
PeerPort => $port, 
Proto => 'tcp' 
) or die “Error: $!n”; 
: 
: 
14 
えっ、 
IPアドレス直書き? 
IPアドレス直書きすると、 
アドレス変更時に修正が 
必要なんですよ… 
再テストも必要だし… 
ダメよ~ダメダメ
IPv6対応の話をする前に 
…② 
とある Androidプログラミング書籍に 
おけるソケット通信のサンプルコード 
15 
public class SocketEx… 
… 
… 
private final static String IP=“192.168.11.12”;//★変更必須 
良い子は真似しちゃダメ
IPv6対応の話をする前に 
…③ 
IPアドレスのハードコーディングはNG 
16 
ダメ。ゼッタイ。 
$host = “www.example.com” 
のようにFQDNで接続先を指定する
ネットワークアクセスの 
作法=名前解決を使う 
Internet 
17 
Client 
Web Server 
www.example.jp 
2001:db8:100::1 
192.0.2.1 
DNS Server 
198.51.100.53 
①名前解決問合せ! 
www.example.jp ? 
②アドレス応答! 
www.example.jp ⇒ 2001:db8:100::1 
! !   192.0.2.1 
③HTTP通信 
FQDN 
FQDNで接続先を指定し、DNSからアドレス取得
なぜIPアドレス直書きが 
ダメなのか? 
目的変更・改修の理由 
アプリケーション機能の提供■ 業務要件の変更! 
■ サービス内容の変更! 
■ ユーザビリティ向上 …,etc. 
インフラ資源の提供■ 資源管理(IPアドレス、サーバラック…)! 
■ 性能 
同一システムでも変更・改修の理由・時期は異なる 
互いに変更の影響を受けるべきではない 
アプリケーションは、IPアドレスに依存すべきではない 
例)IPアドレスでユーザを識別すべきではない 
18
さあ、アプリケーションを 
IPv6に対応させよう! 
ここからが本題 
19
アプリケーションIPv6対 
応の基本方針 
 IPv6対応 =! 
    IPv4とIPv6の両方で動作する 
シングルソースコードで対応 
20
アプリケーションIPv6対 
応の基本方針 
 IPv6対応 =! 
    IPv4とIPv6の両方で動作する 
21 
! 
!!!! 
IPv6とIPv4の共存期間が長く続く! 
これまでIPv4で提供してきたサービスは、今後 
も継続してIPv4でも動作する必要あり
アプリケーションIPv6対 
応の基本方針 
シングルソースコードで対応 
22 
! 
!!! 
各開発言語が概ねIPv6に対応しており、プロト 
コルによって開発言語を分ける必要がなくなっ 
た! 
アプリケーションのメンテナンス性を重視し、 
プロトコルによって機能差異が生じることを未 
然に防ぐ
アプリケーションのIPv6 
対応のポイント 
②通信処理をIPv4/IPv6の 
 両方に対応させる 
③データとしてIPアドレスを 
 扱う箇所をIPv4/IPv6の 
 両方に対応させる 
クライアントサーバ 
TCP / UDP 
IP(v4/v6) 
Ethernet 
23 
アプリケーション! 
ミドルウェア/ 
フレームワーク 
OS 
アプリケーション! 
フレームワーク 
OS 
HTTP/HTTPS! 
SMTP, SSH, 
ソケット通信など 
①IPv4/IPv6両対応のプログラミング言語と実行環境を使う
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(1) 
IPv4/IPv6両対応のプログラミング言語と 
実行環境? 
IPv4/IPv6の両方で通信できる 
24 
! 
1. 名前解決でIPv4/IPv6両方のアドレスが扱える! 
2. IPv4/IPv6両方で接続できる
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(2) 
名前解決でIPv4/IPv6両方のアドレスが扱える 
FQDNからIPv6アドレスが名前解決できる 
名前解決で得られるIPv6アドレスを認識、接続先アドレス 
に指定できる 
25 
Client 
Web Server 
www.example.jp 
2001:db8:100::1 
example.jpの 
権威DNS Server 
■ AAAAレコード(IPv4 
のAレコードに相当)を 
リソースレコードに 
登録 
www.example.jp IN AAAA 2001:db8:100::1 
①名前解決問合せ! 
www.example.jp ? 
②AAAA応答! 
2001:db8:100::1 
③HTTP通信 
! 
! 
! 
! 
! 
!
ポイント① プログラミング言 
語と実行環境 Perlの対応状況 
考慮すべき要素対応状況備考 
名前解決○ ■ Socket::getaddrinfo()! 
処理○ CPANモジュール Net::IPにより対応 
26 
■ Socket::getnameinfo()! 
■ CPAN Net::DNS 
ソケット○ ■ コアモジュールの Socketは 5.10 から 
部分的に対応! 
■ 5.14でフル対応! 
各種(L7) ■ CPANモジュールにも対応しているも 
プロトコル 
HTTP 
クライアント▲ 標準では非対応(コアモジュール 
HTTP::Tiny, LWP等のメジャーなモジュ 
ールも非対応) 
SMTP 
クライアント▲ 標準では非対応(コアモジュール 
Net::SMTP) 
その他IPv6アドレスの
ポイント① プログラミング言 
語と実行環境 PHPの対応状況 
考慮すべき要素対応状況備考 
名前解決○ ■ dns_get_record()! 
処理○ PEAR Net_IPv6拡張パッケージ 
27 
■ gethostbyaddr()! 
■ PEAR Net_DNS2 
ソケット○ inet_pton(), inet_ptop()は 5.1.0 以降 
対応 
各種(L7) 
プロトコル 
HTTP 
クライアント○ 各種ファイル関数 
cURLなど 
SMTP 
クライアント○ PEAR Net_SMTP! 
mail(), PEAR Mail ⇒システム環境依存 
その他IPv6アドレスの
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(3) 
プログラミングにおける留意点 
IPv4/IPv6の双方に対応するライブラリ、 
オブジェクト、関数、データ型を使う 
従来(IPv4のみ)のものとは別に用意されている 
ことがある 
C addrinfo構造体、getaddrinfo() 
Java InetAddressクラス 
Perl IO::Socket::IP       など 
28 
! 
アドレス検証、変換などはライブラリを有効活用
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(1) 
接続の優先順位(標準;RFC6724):IPv6 > IPv4 
! 
サーバプログラム 
IPv4/IPv6 両プロトコルでの 
接続を処理 
Client Server 
! 
クライアントプログラム 
IPv4/IPv6 両宛先アドレスに接続できるようにする 
接続できない状況も想定し、接続失敗時には別の 
宛先アドレスに切替えて接続する(フォールバック) 
  
29 
IPv6 IPv6 
IPv4 IPv4 
アプリケーションの作りが悪いと… 
■ 切替えに時間がかかる 
■ 正常に切替わらないこともある 
ユーザの利便性を 
損なう
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(2) 
フォールバック 
IPv4 ⇒ IPv6 / IPv6 ⇒ IPv4 / IPv4 ⇒ IPv4 / IPv6 ⇒ IPv6 
30 
! 
! 
! 
! 
! 
! 
! 
! 
Client 
Web Server! 
www.example.jp 
DNS Server 
www.example.jp IN AAAA 2001:db8:100::1! 
www.example.jp IN A 192.0.2.1 
①名前解決問合せ! 
www.example.jp ? 
②AAAA応答 2001:db8:100::1! 
 A応答 192.0.2.1 
③HTTP通信(IPv6) 2001:db8:100::1 
192.0.2.1 
2001:db8:ffff::1 
198.51.100.1 
④HTTP通信(IPv4) フォールバック
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(3) 
想定されるフォールバックの主な原因 
サーバ側の 
問題 
サーバが当該のサービスを提供していない 
DNS誤登録、障害等 
経路の問題ネットワークの接続性が失われている 
ISPの不具合 
31 
クライアント 
側の問題 
サーバへの到達性がないアドレスを 
選択して通信を行おうとしている 
グローバルアドレスを使用している 
閉域網
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(4) 
フォールバックの予防策 
サーバ設定の不備を修正する 
サービスを提供していないIPアドレス 
をDNSに登録しない 
サービスを適切に提供する 
ISP ネットワークの接続性を健全に保つ 
クライアントIPv6インターネット接続可能なISPと契 
32 
約する
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(5) 
クライアントプログラム 
ホスト名の名前解決結果を 
リスト形式で取得し、 
アドレスリストの順に接続を 
試み、接続が確立したものと 
送受信を行う 
Good! 
! 
更に迅速にフォールバックを行うために、 
Happy Eyeballs(RFC6555)も選択肢の一つ  
33 
ホスト名解決 
(DNS問合せ) 
接続成功? 
Yes 
No 
リスト取得 
リスト順次取出し
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(6) 
クライアント サンプルコード抜粋(1/2) 
/* resolve address/port into sockaddr */ 
memset(&hints, 0, sizeof(hints)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 
error = getaddrinfo(argv[1], argv[2], &hints, &res0); 
! 
if (error) { 
fprintf(stderr, "%s %s: %sn", argv[1], argv[2], 
34 
gai_strerror(error)); 
exit(1); 
} 
! 
/* 次のページに続く */
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(7) 
クライアント サンプルコード抜粋(2/2) 
/* try all the sockaddrs until connection goes successful */ 
for (res = res0; res; res = res->ai_next) { 
fprintf(stderr, "trying %s port %sn", hbuf, sbuf); 
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
if (s < 0) continue; 
if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { 
close(s); 
s = -1; 
continue; 
} 
! 
while ((l = read(s, buf, sizeof(buf))) > 0) 
write(STDOUT_FILENO, buf, l); 
close(s); 
exit(0); 
} 
35
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(8) 
サーバプログラム 
同一ソースコードでプログラムを作成 
IPv4/IPv6両方の接続を同時に受付ける2種類の 
手法 
接続プログラム 
A :ソケットB 
36 
プロセス 
A 
IPv6 
接続 
IPv4 
プログラム 
α 
接続 
プロセス 
B 
サーバ 
プロセス 
C 
IPv6 
IPv4 
接続 
β 
サーバ
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(1) 
! 
データとしてIPアドレスを扱う箇所 
出力入力 
37 
整列 
検索 
格納
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(2) 
アドレス体系の違い 
IPv4アドレスIPv6アドレス 
! 
アドレス長32bit 128bit 
! 
文字列 
表記法8bitずつ区切り、 
表記 
10進数で表記 
! 
! 
例 
IPv4)192.0.2.1 
IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 
IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠) 
38 
16bitずつ区切 
り、16進数で表記 
区切り文字. (ドット) : (コロン) 
文字列長15文字以内39文字以内 
RFC5952に文書化されているIPv6アドレス 
推奨テキスト表記ルールに従い省略可能
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(3) 
入力 
整数ではなく文字列で入力 
IPv4のみ15文字以内の文字列 [VARCHAR(15)] 
! 
もしくは整数×4 
! 
! 
IPv4/IPv6両対応39文字以内の文字列 [VARCHAR(39)] 
! 
入力値の検証はライブラリの関数・フィルタを利用 
例)PHP Net_IPv6::checkIPv6(); 
  (PEARにて提供されるNet_IPv6パッケージに 
   含まれる) 
39 
Good!
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(4) 
格納、検索、整列、出力 
IPアドレス型が定義されている場合は、IPアドレス型を 
使う 
例) PostgreSQLのネットワークアドレス型 
IPアドレス型が定義されていない場合は、文字列型で 
完全表記を使う 
IPv6完全表記) 
2001:0db8:0000:0000:0001:0000:0000:0001 
見やすさを求めるときは、省略表記(RFC5952準拠)で出力 
既存システムは、格納領域にIPv6アドレスが収まるか 
をチェック 
40
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(5) 
なぜ、完全表記? 
省略表記のままソートしても… 
アドレス昇順ソート後 
41 
2001:db8:0:1::1:1 
2001:db8:0:2::1 
2001:db8:0:1::50 
2001:db8:0:10::1 
ソート前 
2001:db8:0:10::1 
2001:db8:0:1::1:1 
2001:db8:0:1::50 
2001:db8:0:2::1 
2001:db8:0:1::50 
2001:db8:0:1::1:1 
2001:db8:0:2::1 
2001:db8:0:10::1 
省略表記の 
ソートは 
アドレス昇順と 
一致しない 
(文字列) 
ソート 
アドレス 
昇順
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(6) 
ソートは完全表記で行う 
2001:db8:0:1::1:1 
2001:db8:0:2::1 
2001:db8:0:1::50 
2001:db8:0:10::1 
完全表記のソートは 
アドレス昇順と一致 
42 
ソート前 
アドレス 
昇順 
完全表記 
(文字列) 
ソート 
アドレス昇順ソート後 
2001:db8:0:1::50 
2001:db8:0:1::1:1 
2001:db8:0:2::1 
2001:db8:0:10::1 
2001:0db8:0000:0001:0000:0000:0001:0001 
2001:0db8:0000:0002:0000:0000:0000:0001 
2001:0db8:0000:0001:0000:0000:0000:0050 
2001:0db8:0000:0010:0000:0000:0000:0001 
2001:0db8:0000:0001:0000:0000:0000:0050 
2001:0db8:0000:0001:0000:0000:0001:0001 
2001:0db8:0000:0002:0000:0000:0000:0001 
2001:0db8:0000:0010:0000:0000:0000:0001
43 
おわりに
まとめ(1) 
IPv6を使える環境が増えている 
IPv4とIPv6の違い:アドレス空間が異なる , etc. 
                 ⇒互換性なし 
IPアドレスのハードコーディングはダメ。ゼッタイ。 
IPv6対応の基本方針 
IPv6対応=IPv6/IPv4の両方で動作させること 
シングルソースコードで対応する 
44
まとめ(2) 
IPv6対応のポイント 
1. IPv4/IPv6両対応のプログラミング言語と実行 
環境を使う 
2. 通信処理をIPv4/IPv6の両方に対応させる 
3. データとしてIPアドレスを扱う箇所をIPv4/IPv6 
の両方に対応させる 
45 
! 
  
決して難しくない! 
今日から開発するアプリケーションは 
IPv6に対応させよう!
つづきはWebで 
(参考文献) 
「アプリケーションのIPv6対応ガイドライン 基礎編」/IPv6 
普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションの 
IPv6対応検討SWG 
http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml! 
! 
「アプリケーションのIPv6対応ガイドライン Webアプリ編 
(案)」/IPv6普及・高度化推進協議会 IPv4/IPv6共存WG 
アプリケーションのIPv6対応検討SWG 
http://www.v6pc.jp/jp/entry/wg/2014/06/ipv6web.phtml! 
! 
Internet Week 2013「T2 アプリケーション・サービスのIPv6対 
応」 
軽量プログラミング言語のIPv6対応 Perl編! 
https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-watanabe-2.pdf! ! 
軽量プログラミング言語のIPv6対応 PHP編! 
https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-hatano-2.pdf 
46
ご清聴いただき、 
ありがとうございました 
47

これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

  • 1.
    オープンソースカンファレンス2014 Hiroshima! jus研究会広島大会 これからのアプリ開発は IPv6対応で行こう! 2014年9月20日 IPv6普及・高度化推進協議会 渡辺 露文  
  • 2.
    About me 渡辺露文(わたなべ つゆふみ) Twitter: @tsuyu23 某SIer勤務 IPv6普及・高度化推進協議会 会員 IPv6導入に起因する問題検討SWG アプリケーションのIPv6対応検討SWG 技術評論社 Software Design誌連載 (2012年12月号~     2014年1月号) ! 2
  • 3.
    Do you know… IPv6 ? Internet Protocol version 6 インターネットの通信に関する規約(RFC791) IPネットワークに接続するには1つ以上のIPアドレスが必要 皆さんが馴染んでいるのはIPv4(例:10.1.2.3) 3
  • 4.
    実はIPv6を使える環境が 増えています(1) 最近のOS Windows Vista以降 Mac OS X Linux FreeBSD  … ! ! 4 いずれも デフォルトで 利用可能
  • 5.
    実はIPv6を使える環境が 増えています(2) インターネット回線 フレッツ光ネクスト au ひかり NURO 光  … ! ! 5 利用可能 既存ユーザへの自動導入も 進行中 すでに、ユーザからあなたのサービスにIPv6で アクセスされようとしている…かもしれない
  • 6.
    日本におけるIPv6の普及 状況 フレッツ光ネクストのIPv6普及率 (2014年6月) IPv6普及率:3.1%! フレッツ光ネクスト契約数:13,588,000契約! ! au ひかりのIPv6普及率(2014年6月):68% ! ! 今後本格的に普及する前に 出典:IPv6普及・高度化推進協議会 アクセス網におけるIPv6普及状況調査!    http://v6pc.jp/jp/spread/ipv6spread_03.phtml IPv6対応を始めたほうが良い 6
  • 7.
    余談:IPv6でインターネット にアクセスできるかの確認方法 Webブラウザでhttp://www.test-ipv6.jp にアクセス ! ! ! ! Webブラウザで http://www.kame.net にアクセス ! ! ! 7 IPv6でアクセスすると、 亀が踊ります♪
  • 8.
    IPv6の背景:   IPv4アドレス枯渇 IPv4アドレスの在庫状況 (地域インターネットレジストリ) 8 通信事業者、ISP、 データセンター、 クラウド事業者等の 在庫が残るのみ 世界的に足りなくなってきている
  • 9.
  • 10.
    IPv4とIPv6とでは何が 違うのか? アドレス体系が異なる (IPv6のアドレス空間は広大) 例 IPv4)192.0.2.1 IPv6完全表記) 2001:0db8:0000:0000:0001:0000:0000:0001 IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠) 10 ! 他にも機能的にIPv4と異なることがある   IPv4とIPv6は互換性がない
  • 11.
    IPv4とIPv6の接続性 11 Internet IPv4対応 (IPv6非対応) システム IPv4/IPv6 両対応システム IPv6対応 (IPv4非対応) システム (1) (2) (3) IPv4端末 IPv4/IPv6 両対応端末 IPv6端末 IPv4 IPv6
  • 12.
    IPv6に対応しない場合の 影響 1.IPv6のみの環境と通信できない! ビジネス機会を損失する! システム連携が行えず要件を満たせなくなる! 2. 今後、IPv4はサービスレベルが低下していく! 通信事業者等によるCGN(Carrier Grade NAT) 導入により、遅くなり、使用できるセッション 数が減る可能性がある! ! ! IPv6に対応しなきゃ! 12
  • 13.
    インフラがIPv6に対応す るだけでいいのでは? ネットワークとサーバがIPv6に対応すれば、IPv6で接続 可能 ! 接続は可能だが… サービスが正常に動作しない 13 !!! かもしれない システム連携がうまくいかない! 想定外の挙動をする!   … ! アプリケーションもIPv6に対応しなきゃ!
  • 14.
    IPv6対応の話をする前に …① このコード、イケてない… use IO::Socket::IP; $host = “198.51.100.1”; : : my $sock = IO::Socket::IP->new( PeerAddr => $host, PeerPort => $port, Proto => 'tcp' ) or die “Error: $!n”; : : 14 えっ、 IPアドレス直書き? IPアドレス直書きすると、 アドレス変更時に修正が 必要なんですよ… 再テストも必要だし… ダメよ~ダメダメ
  • 15.
    IPv6対応の話をする前に …② とあるAndroidプログラミング書籍に おけるソケット通信のサンプルコード 15 public class SocketEx… … … private final static String IP=“192.168.11.12”;//★変更必須 良い子は真似しちゃダメ
  • 16.
    IPv6対応の話をする前に …③ IPアドレスのハードコーディングはNG 16 ダメ。ゼッタイ。 $host = “www.example.com” のようにFQDNで接続先を指定する
  • 17.
    ネットワークアクセスの 作法=名前解決を使う Internet 17 Client Web Server www.example.jp 2001:db8:100::1 192.0.2.1 DNS Server 198.51.100.53 ①名前解決問合せ! www.example.jp ? ②アドレス応答! www.example.jp ⇒ 2001:db8:100::1 ! !   192.0.2.1 ③HTTP通信 FQDN FQDNで接続先を指定し、DNSからアドレス取得
  • 18.
    なぜIPアドレス直書きが ダメなのか? 目的変更・改修の理由 アプリケーション機能の提供■ 業務要件の変更! ■ サービス内容の変更! ■ ユーザビリティ向上 …,etc. インフラ資源の提供■ 資源管理(IPアドレス、サーバラック…)! ■ 性能 同一システムでも変更・改修の理由・時期は異なる 互いに変更の影響を受けるべきではない アプリケーションは、IPアドレスに依存すべきではない 例)IPアドレスでユーザを識別すべきではない 18
  • 19.
  • 20.
    アプリケーションIPv6対 応の基本方針  IPv6対応 =!     IPv4とIPv6の両方で動作する シングルソースコードで対応 20
  • 21.
    アプリケーションIPv6対 応の基本方針  IPv6対応 =!     IPv4とIPv6の両方で動作する 21 ! !!!! IPv6とIPv4の共存期間が長く続く! これまでIPv4で提供してきたサービスは、今後 も継続してIPv4でも動作する必要あり
  • 22.
    アプリケーションIPv6対 応の基本方針 シングルソースコードで対応 22 ! !!! 各開発言語が概ねIPv6に対応しており、プロト コルによって開発言語を分ける必要がなくなっ た! アプリケーションのメンテナンス性を重視し、 プロトコルによって機能差異が生じることを未 然に防ぐ
  • 23.
    アプリケーションのIPv6 対応のポイント ②通信処理をIPv4/IPv6の  両方に対応させる ③データとしてIPアドレスを  扱う箇所をIPv4/IPv6の  両方に対応させる クライアントサーバ TCP / UDP IP(v4/v6) Ethernet 23 アプリケーション! ミドルウェア/ フレームワーク OS アプリケーション! フレームワーク OS HTTP/HTTPS! SMTP, SSH, ソケット通信など ①IPv4/IPv6両対応のプログラミング言語と実行環境を使う
  • 24.
    ポイント① IPv4/IPv6両対応のプ ログラミング言語と実行環境を使う (1) IPv4/IPv6両対応のプログラミング言語と 実行環境? IPv4/IPv6の両方で通信できる 24 ! 1. 名前解決でIPv4/IPv6両方のアドレスが扱える! 2. IPv4/IPv6両方で接続できる
  • 25.
    ポイント① IPv4/IPv6両対応のプ ログラミング言語と実行環境を使う (2) 名前解決でIPv4/IPv6両方のアドレスが扱える FQDNからIPv6アドレスが名前解決できる 名前解決で得られるIPv6アドレスを認識、接続先アドレス に指定できる 25 Client Web Server www.example.jp 2001:db8:100::1 example.jpの 権威DNS Server ■ AAAAレコード(IPv4 のAレコードに相当)を リソースレコードに 登録 www.example.jp IN AAAA 2001:db8:100::1 ①名前解決問合せ! www.example.jp ? ②AAAA応答! 2001:db8:100::1 ③HTTP通信 ! ! ! ! ! !
  • 26.
    ポイント① プログラミング言 語と実行環境Perlの対応状況 考慮すべき要素対応状況備考 名前解決○ ■ Socket::getaddrinfo()! 処理○ CPANモジュール Net::IPにより対応 26 ■ Socket::getnameinfo()! ■ CPAN Net::DNS ソケット○ ■ コアモジュールの Socketは 5.10 から 部分的に対応! ■ 5.14でフル対応! 各種(L7) ■ CPANモジュールにも対応しているも プロトコル HTTP クライアント▲ 標準では非対応(コアモジュール HTTP::Tiny, LWP等のメジャーなモジュ ールも非対応) SMTP クライアント▲ 標準では非対応(コアモジュール Net::SMTP) その他IPv6アドレスの
  • 27.
    ポイント① プログラミング言 語と実行環境PHPの対応状況 考慮すべき要素対応状況備考 名前解決○ ■ dns_get_record()! 処理○ PEAR Net_IPv6拡張パッケージ 27 ■ gethostbyaddr()! ■ PEAR Net_DNS2 ソケット○ inet_pton(), inet_ptop()は 5.1.0 以降 対応 各種(L7) プロトコル HTTP クライアント○ 各種ファイル関数 cURLなど SMTP クライアント○ PEAR Net_SMTP! mail(), PEAR Mail ⇒システム環境依存 その他IPv6アドレスの
  • 28.
    ポイント① IPv4/IPv6両対応のプ ログラミング言語と実行環境を使う (3) プログラミングにおける留意点 IPv4/IPv6の双方に対応するライブラリ、 オブジェクト、関数、データ型を使う 従来(IPv4のみ)のものとは別に用意されている ことがある C addrinfo構造体、getaddrinfo() Java InetAddressクラス Perl IO::Socket::IP       など 28 ! アドレス検証、変換などはライブラリを有効活用
  • 29.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(1) 接続の優先順位(標準;RFC6724):IPv6 > IPv4 ! サーバプログラム IPv4/IPv6 両プロトコルでの 接続を処理 Client Server ! クライアントプログラム IPv4/IPv6 両宛先アドレスに接続できるようにする 接続できない状況も想定し、接続失敗時には別の 宛先アドレスに切替えて接続する(フォールバック)   29 IPv6 IPv6 IPv4 IPv4 アプリケーションの作りが悪いと… ■ 切替えに時間がかかる ■ 正常に切替わらないこともある ユーザの利便性を 損なう
  • 30.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(2) フォールバック IPv4 ⇒ IPv6 / IPv6 ⇒ IPv4 / IPv4 ⇒ IPv4 / IPv6 ⇒ IPv6 30 ! ! ! ! ! ! ! ! Client Web Server! www.example.jp DNS Server www.example.jp IN AAAA 2001:db8:100::1! www.example.jp IN A 192.0.2.1 ①名前解決問合せ! www.example.jp ? ②AAAA応答 2001:db8:100::1!  A応答 192.0.2.1 ③HTTP通信(IPv6) 2001:db8:100::1 192.0.2.1 2001:db8:ffff::1 198.51.100.1 ④HTTP通信(IPv4) フォールバック
  • 31.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(3) 想定されるフォールバックの主な原因 サーバ側の 問題 サーバが当該のサービスを提供していない DNS誤登録、障害等 経路の問題ネットワークの接続性が失われている ISPの不具合 31 クライアント 側の問題 サーバへの到達性がないアドレスを 選択して通信を行おうとしている グローバルアドレスを使用している 閉域網
  • 32.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(4) フォールバックの予防策 サーバ設定の不備を修正する サービスを提供していないIPアドレス をDNSに登録しない サービスを適切に提供する ISP ネットワークの接続性を健全に保つ クライアントIPv6インターネット接続可能なISPと契 32 約する
  • 33.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(5) クライアントプログラム ホスト名の名前解決結果を リスト形式で取得し、 アドレスリストの順に接続を 試み、接続が確立したものと 送受信を行う Good! ! 更に迅速にフォールバックを行うために、 Happy Eyeballs(RFC6555)も選択肢の一つ  33 ホスト名解決 (DNS問合せ) 接続成功? Yes No リスト取得 リスト順次取出し
  • 34.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(6) クライアント サンプルコード抜粋(1/2) /* resolve address/port into sockaddr */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(argv[1], argv[2], &hints, &res0); ! if (error) { fprintf(stderr, "%s %s: %sn", argv[1], argv[2], 34 gai_strerror(error)); exit(1); } ! /* 次のページに続く */
  • 35.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(7) クライアント サンプルコード抜粋(2/2) /* try all the sockaddrs until connection goes successful */ for (res = res0; res; res = res->ai_next) { fprintf(stderr, "trying %s port %sn", hbuf, sbuf); s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (s < 0) continue; if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { close(s); s = -1; continue; } ! while ((l = read(s, buf, sizeof(buf))) > 0) write(STDOUT_FILENO, buf, l); close(s); exit(0); } 35
  • 36.
    ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(8) サーバプログラム 同一ソースコードでプログラムを作成 IPv4/IPv6両方の接続を同時に受付ける2種類の 手法 接続プログラム A :ソケットB 36 プロセス A IPv6 接続 IPv4 プログラム α 接続 プロセス B サーバ プロセス C IPv6 IPv4 接続 β サーバ
  • 37.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(1) ! データとしてIPアドレスを扱う箇所 出力入力 37 整列 検索 格納
  • 38.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(2) アドレス体系の違い IPv4アドレスIPv6アドレス ! アドレス長32bit 128bit ! 文字列 表記法8bitずつ区切り、 表記 10進数で表記 ! ! 例 IPv4)192.0.2.1 IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠) 38 16bitずつ区切 り、16進数で表記 区切り文字. (ドット) : (コロン) 文字列長15文字以内39文字以内 RFC5952に文書化されているIPv6アドレス 推奨テキスト表記ルールに従い省略可能
  • 39.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(3) 入力 整数ではなく文字列で入力 IPv4のみ15文字以内の文字列 [VARCHAR(15)] ! もしくは整数×4 ! ! IPv4/IPv6両対応39文字以内の文字列 [VARCHAR(39)] ! 入力値の検証はライブラリの関数・フィルタを利用 例)PHP Net_IPv6::checkIPv6();   (PEARにて提供されるNet_IPv6パッケージに    含まれる) 39 Good!
  • 40.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(4) 格納、検索、整列、出力 IPアドレス型が定義されている場合は、IPアドレス型を 使う 例) PostgreSQLのネットワークアドレス型 IPアドレス型が定義されていない場合は、文字列型で 完全表記を使う IPv6完全表記) 2001:0db8:0000:0000:0001:0000:0000:0001 見やすさを求めるときは、省略表記(RFC5952準拠)で出力 既存システムは、格納領域にIPv6アドレスが収まるか をチェック 40
  • 41.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(5) なぜ、完全表記? 省略表記のままソートしても… アドレス昇順ソート後 41 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:1::50 2001:db8:0:10::1 ソート前 2001:db8:0:10::1 2001:db8:0:1::1:1 2001:db8:0:1::50 2001:db8:0:2::1 2001:db8:0:1::50 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:10::1 省略表記の ソートは アドレス昇順と 一致しない (文字列) ソート アドレス 昇順
  • 42.
    ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(6) ソートは完全表記で行う 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:1::50 2001:db8:0:10::1 完全表記のソートは アドレス昇順と一致 42 ソート前 アドレス 昇順 完全表記 (文字列) ソート アドレス昇順ソート後 2001:db8:0:1::50 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:10::1 2001:0db8:0000:0001:0000:0000:0001:0001 2001:0db8:0000:0002:0000:0000:0000:0001 2001:0db8:0000:0001:0000:0000:0000:0050 2001:0db8:0000:0010:0000:0000:0000:0001 2001:0db8:0000:0001:0000:0000:0000:0050 2001:0db8:0000:0001:0000:0000:0001:0001 2001:0db8:0000:0002:0000:0000:0000:0001 2001:0db8:0000:0010:0000:0000:0000:0001
  • 43.
  • 44.
    まとめ(1) IPv6を使える環境が増えている IPv4とIPv6の違い:アドレス空間が異なる, etc.                  ⇒互換性なし IPアドレスのハードコーディングはダメ。ゼッタイ。 IPv6対応の基本方針 IPv6対応=IPv6/IPv4の両方で動作させること シングルソースコードで対応する 44
  • 45.
    まとめ(2) IPv6対応のポイント 1.IPv4/IPv6両対応のプログラミング言語と実行 環境を使う 2. 通信処理をIPv4/IPv6の両方に対応させる 3. データとしてIPアドレスを扱う箇所をIPv4/IPv6 の両方に対応させる 45 !   決して難しくない! 今日から開発するアプリケーションは IPv6に対応させよう!
  • 46.
    つづきはWebで (参考文献) 「アプリケーションのIPv6対応ガイドライン基礎編」/IPv6 普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションの IPv6対応検討SWG http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml! ! 「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」/IPv6普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションのIPv6対応検討SWG http://www.v6pc.jp/jp/entry/wg/2014/06/ipv6web.phtml! ! Internet Week 2013「T2 アプリケーション・サービスのIPv6対 応」 軽量プログラミング言語のIPv6対応 Perl編! https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-watanabe-2.pdf! ! 軽量プログラミング言語のIPv6対応 PHP編! https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-hatano-2.pdf 46
  • 47.