More Related Content
Similar to これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版) (20)
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
- 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
- 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
- 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
- 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”;//★変更必須
良い子は真似しちゃダメ
- 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
- 23. アプリケーションのIPv6
対応のポイント
②通信処理をIPv4/IPv6の
両方に対応させる
③データとしてIPアドレスを
扱う箇所をIPv4/IPv6の
両方に対応させる
クライアントサーバ
TCP / UDP
IP(v4/v6)
Ethernet
23
アプリケーション!
ミドルウェア/
フレームワーク
OS
アプリケーション!
フレームワーク
OS
HTTP/HTTPS!
SMTP, SSH,
ソケット通信など
①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
クライアント
側の問題
サーバへの到達性がないアドレスを
選択して通信を行おうとしている
グローバルアドレスを使用している
閉域網
- 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
接続
β
サーバ
- 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
- 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