Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
オープンソースカンファレンス2014 Hiroshima! 
jus研究会広島大会 
これからのアプリ開発は 
IPv6対応で行こう! 
2014年9月20日 
IPv6普及・高度化推進協議会 
渡辺 露文  
About me 
渡辺 露文(わたなべ つゆふみ) 
Twitter: @tsuyu23 
某SIer勤務 
IPv6普及・高度化推進協議会 会員 
IPv6導入に起因する問題検討SWG 
アプリケーションのIPv6対応検討SWG 
技術評論...
Do you know … 
IPv6 ? 
Internet Protocol version 6 
インターネットの通信に関する規約(RFC791) 
IPネットワークに接続するには1つ以上のIPアドレスが必要 
皆さんが馴染んでいるのはI...
実はIPv6を使える環境が 
増えています(1) 
最近のOS 
Windows Vista以降 
Mac OS X 
Linux 
FreeBSD 
 … 
! 
! 
4 
いずれも 
デフォルトで 
利用可能
実はIPv6を使える環境が 
増えています(2) 
インターネット回線 
フレッツ光ネクスト 
au ひかり 
NURO 光 
 … 
! 
! 
5 
利用可能 
既存ユーザへの自動導入も 
進行中 
すでに、ユーザからあなたのサービスにIP...
日本におけるIPv6の普及 
状況 
フレッツ光ネクストのIPv6普及率 
(2014年6月) 
IPv6普及率:3.1%! 
フレッツ光ネクスト契約数:13,588,000契約! 
! 
au ひかりのIPv6普及率(2014年6月):68%...
余談:IPv6でインターネット 
にアクセスできるかの確認方法 
Webブラウザで http://www.test-ipv6.jp にアクセス 
! 
! 
! 
! 
Webブラウザで http://www.kame.net にアクセス 
!...
IPv6の背景: 
  IPv4アドレス枯渇 
IPv4アドレスの在庫状況 
(地域インターネットレジストリ) 
8 
通信事業者、ISP、 
データセンター、 
クラウド事業者等の 
在庫が残るのみ 
世界的に足りなくなってきている
もう少しIPv6を知ろう! 
9
IPv4とIPv6とでは何が 
違うのか? 
アドレス体系が異なる 
(IPv6のアドレス空間は広大) 
例 
IPv4)192.0.2.1 
IPv6完全表記) 
2001:0db8:0000:0000:0001:0000:0000:0001...
IPv4とIPv6の接続性 
11 
Internet 
IPv4対応 
(IPv6非対応) 
システム 
IPv4/IPv6 
両対応システム 
IPv6対応 
(IPv4非対応) 
システム 
(1) 
(2) 
(3) 
IPv4端末 
...
IPv6に対応しない場合の 
影響 
1. IPv6のみの環境と通信できない! 
ビジネス機会を損失する! 
システム連携が行えず要件を満たせなくなる! 
2. 今後、IPv4はサービスレベルが低下していく! 
通信事業者等によるCGN(Car...
インフラがIPv6に対応す 
るだけでいいのでは? 
ネットワークとサーバがIPv6に対応すれば、IPv6で接続 
可能 
! 
接続は可能だが… 
サービスが正常に動作しない 
13 
!!! 
かもしれない 
システム連携がうまくいかない!...
IPv6対応の話をする前に 
…① 
このコード、イケてない… 
use IO::Socket::IP; 
$host = “198.51.100.1”; 
: 
: 
my $sock = IO::Socket::IP->new( 
Peer...
IPv6対応の話をする前に 
…② 
とある Androidプログラミング書籍に 
おけるソケット通信のサンプルコード 
15 
public class SocketEx… 
… 
… 
private final static String...
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....
なぜIPアドレス直書きが 
ダメなのか? 
目的変更・改修の理由 
アプリケーション機能の提供■ 業務要件の変更! 
■ サービス内容の変更! 
■ ユーザビリティ向上 …,etc. 
インフラ資源の提供■ 資源管理(IPアドレス、サーバラック...
さあ、アプリケーションを 
IPv6に対応させよう! 
ここからが本題 
19
アプリケーションIPv6対 
応の基本方針 
 IPv6対応 =! 
    IPv4とIPv6の両方で動作する 
シングルソースコードで対応 
20
アプリケーションIPv6対 
応の基本方針 
 IPv6対応 =! 
    IPv4とIPv6の両方で動作する 
21 
! 
!!!! 
IPv6とIPv4の共存期間が長く続く! 
これまでIPv4で提供してきたサービスは、今後 
も継続し...
アプリケーションIPv6対 
応の基本方針 
シングルソースコードで対応 
22 
! 
!!! 
各開発言語が概ねIPv6に対応しており、プロト 
コルによって開発言語を分ける必要がなくなっ 
た! 
アプリケーションのメンテナンス性を重視し...
アプリケーションのIPv6 
対応のポイント 
②通信処理をIPv4/IPv6の 
 両方に対応させる 
③データとしてIPアドレスを 
 扱う箇所をIPv4/IPv6の 
 両方に対応させる 
クライアントサーバ 
TCP / UDP 
IP...
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(1) 
IPv4/IPv6両対応のプログラミング言語と 
実行環境? 
IPv4/IPv6の両方で通信できる 
24 
! 
1. 名前解決でIPv4/IPv6両...
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(2) 
名前解決でIPv4/IPv6両方のアドレスが扱える 
FQDNからIPv6アドレスが名前解決できる 
名前解決で得られるIPv6アドレスを認識、接続先アド...
ポイント① プログラミング言 
語と実行環境 Perlの対応状況 
考慮すべき要素対応状況備考 
名前解決○ ■ Socket::getaddrinfo()! 
処理○ CPANモジュール Net::IPにより対応 
26 
■ Socket:...
ポイント① プログラミング言 
語と実行環境 PHPの対応状況 
考慮すべき要素対応状況備考 
名前解決○ ■ dns_get_record()! 
処理○ PEAR Net_IPv6拡張パッケージ 
27 
■ gethostbyaddr()...
ポイント① IPv4/IPv6両対応のプ 
ログラミング言語と実行環境を使う 
(3) 
プログラミングにおける留意点 
IPv4/IPv6の双方に対応するライブラリ、 
オブジェクト、関数、データ型を使う 
従来(IPv4のみ)のものとは別に...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(1) 
接続の優先順位(標準;RFC6724):IPv6 > IPv4 
! 
サーバプログラム 
IPv4/IPv6 両プロトコルでの 
接続を処理 
Client Server...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(2) 
フォールバック 
IPv4 ⇒ IPv6 / IPv6 ⇒ IPv4 / IPv4 ⇒ IPv4 / IPv6 ⇒ IPv6 
30 
! 
! 
! 
! 
! 
! 
...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(3) 
想定されるフォールバックの主な原因 
サーバ側の 
問題 
サーバが当該のサービスを提供していない 
DNS誤登録、障害等 
経路の問題ネットワークの接続性が失われている ...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(4) 
フォールバックの予防策 
サーバ設定の不備を修正する 
サービスを提供していないIPアドレス 
をDNSに登録しない 
サービスを適切に提供する 
ISP ネットワークの接...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(5) 
クライアントプログラム 
ホスト名の名前解決結果を 
リスト形式で取得し、 
アドレスリストの順に接続を 
試み、接続が確立したものと 
送受信を行う 
Good! 
! ...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(6) 
クライアント サンプルコード抜粋(1/2) 
/* resolve address/port into sockaddr */ 
memset(&hints, 0, siz...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(7) 
クライアント サンプルコード抜粋(2/2) 
/* try all the sockaddrs until connection goes successful */ 
f...
ポイント② 通信処理をIPv4/ 
IPv6の両方に対応させる(8) 
サーバプログラム 
同一ソースコードでプログラムを作成 
IPv4/IPv6両方の接続を同時に受付ける2種類の 
手法 
接続プログラム 
A :ソケットB 
36 
プロ...
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(1) 
! 
データとしてIPアドレスを扱う箇所 
出力入力 
37 
整列 
検索 
格納
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(2) 
アドレス体系の違い 
IPv4アドレスIPv6アドレス 
! 
アドレス長32bit 128bit 
! 
文字列 
表記法8bitずつ区切り...
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(3) 
入力 
整数ではなく文字列で入力 
IPv4のみ15文字以内の文字列 [VARCHAR(15)] 
! 
もしくは整数×4 
! 
! 
IP...
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(4) 
格納、検索、整列、出力 
IPアドレス型が定義されている場合は、IPアドレス型を 
使う 
例) PostgreSQLのネットワークアドレス型...
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(5) 
なぜ、完全表記? 
省略表記のままソートしても… 
アドレス昇順ソート後 
41 
2001:db8:0:1::1:1 
2001:db8:0...
ポイント③ データとしてIPアドレ 
スを扱う箇所をIPv4/IPv6の両方 
に対応させる(6) 
ソートは完全表記で行う 
2001:db8:0:1::1:1 
2001:db8:0:2::1 
2001:db8:0:1::50 
2001...
43 
おわりに
まとめ(1) 
IPv6を使える環境が増えている 
IPv4とIPv6の違い:アドレス空間が異なる , etc. 
                 ⇒互換性なし 
IPアドレスのハードコーディングはダメ。ゼッタイ。 
IPv6対応の基本方針 ...
まとめ(2) 
IPv6対応のポイント 
1. IPv4/IPv6両対応のプログラミング言語と実行 
環境を使う 
2. 通信処理をIPv4/IPv6の両方に対応させる 
3. データとしてIPアドレスを扱う箇所をIPv4/IPv6 
の両方に...
つづきはWebで 
(参考文献) 
「アプリケーションのIPv6対応ガイドライン 基礎編」/IPv6 
普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションの 
IPv6対応検討SWG 
http://www.v6pc.jp/j...
ご清聴いただき、 
ありがとうございました 
47
Upcoming SlideShare
Loading in …5
×

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

2,531 views

Published on

OSC広島 jus研究会広島大会での発表資料です

Published in: Technology
  • Be the first to comment

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

  1. 1. オープンソースカンファレンス2014 Hiroshima! jus研究会広島大会 これからのアプリ開発は IPv6対応で行こう! 2014年9月20日 IPv6普及・高度化推進協議会 渡辺 露文  
  2. 2. About me 渡辺 露文(わたなべ つゆふみ) Twitter: @tsuyu23 某SIer勤務 IPv6普及・高度化推進協議会 会員 IPv6導入に起因する問題検討SWG アプリケーションのIPv6対応検討SWG 技術評論社 Software Design誌連載 (2012年12月号~     2014年1月号) ! 2
  3. 3. Do you know … IPv6 ? Internet Protocol version 6 インターネットの通信に関する規約(RFC791) IPネットワークに接続するには1つ以上のIPアドレスが必要 皆さんが馴染んでいるのはIPv4(例:10.1.2.3) 3
  4. 4. 実はIPv6を使える環境が 増えています(1) 最近のOS Windows Vista以降 Mac OS X Linux FreeBSD  … ! ! 4 いずれも デフォルトで 利用可能
  5. 5. 実はIPv6を使える環境が 増えています(2) インターネット回線 フレッツ光ネクスト au ひかり NURO 光  … ! ! 5 利用可能 既存ユーザへの自動導入も 進行中 すでに、ユーザからあなたのサービスにIPv6で アクセスされようとしている…かもしれない
  6. 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. 7. 余談:IPv6でインターネット にアクセスできるかの確認方法 Webブラウザで http://www.test-ipv6.jp にアクセス ! ! ! ! Webブラウザで http://www.kame.net にアクセス ! ! ! 7 IPv6でアクセスすると、 亀が踊ります♪
  8. 8. IPv6の背景:   IPv4アドレス枯渇 IPv4アドレスの在庫状況 (地域インターネットレジストリ) 8 通信事業者、ISP、 データセンター、 クラウド事業者等の 在庫が残るのみ 世界的に足りなくなってきている
  9. 9. もう少しIPv6を知ろう! 9
  10. 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. 11. IPv4とIPv6の接続性 11 Internet IPv4対応 (IPv6非対応) システム IPv4/IPv6 両対応システム IPv6対応 (IPv4非対応) システム (1) (2) (3) IPv4端末 IPv4/IPv6 両対応端末 IPv6端末 IPv4 IPv6
  12. 12. IPv6に対応しない場合の 影響 1. IPv6のみの環境と通信できない! ビジネス機会を損失する! システム連携が行えず要件を満たせなくなる! 2. 今後、IPv4はサービスレベルが低下していく! 通信事業者等によるCGN(Carrier Grade NAT) 導入により、遅くなり、使用できるセッション 数が減る可能性がある! ! ! IPv6に対応しなきゃ! 12
  13. 13. インフラがIPv6に対応す るだけでいいのでは? ネットワークとサーバがIPv6に対応すれば、IPv6で接続 可能 ! 接続は可能だが… サービスが正常に動作しない 13 !!! かもしれない システム連携がうまくいかない! 想定外の挙動をする!   … ! アプリケーションもIPv6に対応しなきゃ!
  14. 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. 15. IPv6対応の話をする前に …② とある Androidプログラミング書籍に おけるソケット通信のサンプルコード 15 public class SocketEx… … … private final static String IP=“192.168.11.12”;//★変更必須 良い子は真似しちゃダメ
  16. 16. IPv6対応の話をする前に …③ IPアドレスのハードコーディングはNG 16 ダメ。ゼッタイ。 $host = “www.example.com” のようにFQDNで接続先を指定する
  17. 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. 18. なぜIPアドレス直書きが ダメなのか? 目的変更・改修の理由 アプリケーション機能の提供■ 業務要件の変更! ■ サービス内容の変更! ■ ユーザビリティ向上 …,etc. インフラ資源の提供■ 資源管理(IPアドレス、サーバラック…)! ■ 性能 同一システムでも変更・改修の理由・時期は異なる 互いに変更の影響を受けるべきではない アプリケーションは、IPアドレスに依存すべきではない 例)IPアドレスでユーザを識別すべきではない 18
  19. 19. さあ、アプリケーションを IPv6に対応させよう! ここからが本題 19
  20. 20. アプリケーションIPv6対 応の基本方針  IPv6対応 =!     IPv4とIPv6の両方で動作する シングルソースコードで対応 20
  21. 21. アプリケーションIPv6対 応の基本方針  IPv6対応 =!     IPv4とIPv6の両方で動作する 21 ! !!!! IPv6とIPv4の共存期間が長く続く! これまでIPv4で提供してきたサービスは、今後 も継続してIPv4でも動作する必要あり
  22. 22. アプリケーションIPv6対 応の基本方針 シングルソースコードで対応 22 ! !!! 各開発言語が概ねIPv6に対応しており、プロト コルによって開発言語を分ける必要がなくなっ た! アプリケーションのメンテナンス性を重視し、 プロトコルによって機能差異が生じることを未 然に防ぐ
  23. 23. アプリケーションのIPv6 対応のポイント ②通信処理をIPv4/IPv6の  両方に対応させる ③データとしてIPアドレスを  扱う箇所をIPv4/IPv6の  両方に対応させる クライアントサーバ TCP / UDP IP(v4/v6) Ethernet 23 アプリケーション! ミドルウェア/ フレームワーク OS アプリケーション! フレームワーク OS HTTP/HTTPS! SMTP, SSH, ソケット通信など ①IPv4/IPv6両対応のプログラミング言語と実行環境を使う
  24. 24. ポイント① IPv4/IPv6両対応のプ ログラミング言語と実行環境を使う (1) IPv4/IPv6両対応のプログラミング言語と 実行環境? IPv4/IPv6の両方で通信できる 24 ! 1. 名前解決でIPv4/IPv6両方のアドレスが扱える! 2. IPv4/IPv6両方で接続できる
  25. 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. 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. 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. 28. ポイント① IPv4/IPv6両対応のプ ログラミング言語と実行環境を使う (3) プログラミングにおける留意点 IPv4/IPv6の双方に対応するライブラリ、 オブジェクト、関数、データ型を使う 従来(IPv4のみ)のものとは別に用意されている ことがある C addrinfo構造体、getaddrinfo() Java InetAddressクラス Perl IO::Socket::IP       など 28 ! アドレス検証、変換などはライブラリを有効活用
  29. 29. ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(1) 接続の優先順位(標準;RFC6724):IPv6 > IPv4 ! サーバプログラム IPv4/IPv6 両プロトコルでの 接続を処理 Client Server ! クライアントプログラム IPv4/IPv6 両宛先アドレスに接続できるようにする 接続できない状況も想定し、接続失敗時には別の 宛先アドレスに切替えて接続する(フォールバック)   29 IPv6 IPv6 IPv4 IPv4 アプリケーションの作りが悪いと… ■ 切替えに時間がかかる ■ 正常に切替わらないこともある ユーザの利便性を 損なう
  30. 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. 31. ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(3) 想定されるフォールバックの主な原因 サーバ側の 問題 サーバが当該のサービスを提供していない DNS誤登録、障害等 経路の問題ネットワークの接続性が失われている ISPの不具合 31 クライアント 側の問題 サーバへの到達性がないアドレスを 選択して通信を行おうとしている グローバルアドレスを使用している 閉域網
  32. 32. ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(4) フォールバックの予防策 サーバ設定の不備を修正する サービスを提供していないIPアドレス をDNSに登録しない サービスを適切に提供する ISP ネットワークの接続性を健全に保つ クライアントIPv6インターネット接続可能なISPと契 32 約する
  33. 33. ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(5) クライアントプログラム ホスト名の名前解決結果を リスト形式で取得し、 アドレスリストの順に接続を 試み、接続が確立したものと 送受信を行う Good! ! 更に迅速にフォールバックを行うために、 Happy Eyeballs(RFC6555)も選択肢の一つ  33 ホスト名解決 (DNS問合せ) 接続成功? Yes No リスト取得 リスト順次取出し
  34. 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. 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. 36. ポイント② 通信処理をIPv4/ IPv6の両方に対応させる(8) サーバプログラム 同一ソースコードでプログラムを作成 IPv4/IPv6両方の接続を同時に受付ける2種類の 手法 接続プログラム A :ソケットB 36 プロセス A IPv6 接続 IPv4 プログラム α 接続 プロセス B サーバ プロセス C IPv6 IPv4 接続 β サーバ
  37. 37. ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(1) ! データとしてIPアドレスを扱う箇所 出力入力 37 整列 検索 格納
  38. 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. 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. 40. ポイント③ データとしてIPアドレ スを扱う箇所をIPv4/IPv6の両方 に対応させる(4) 格納、検索、整列、出力 IPアドレス型が定義されている場合は、IPアドレス型を 使う 例) PostgreSQLのネットワークアドレス型 IPアドレス型が定義されていない場合は、文字列型で 完全表記を使う IPv6完全表記) 2001:0db8:0000:0000:0001:0000:0000:0001 見やすさを求めるときは、省略表記(RFC5952準拠)で出力 既存システムは、格納領域にIPv6アドレスが収まるか をチェック 40
  41. 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. 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. 43. 43 おわりに
  44. 44. まとめ(1) IPv6を使える環境が増えている IPv4とIPv6の違い:アドレス空間が異なる , etc.                  ⇒互換性なし IPアドレスのハードコーディングはダメ。ゼッタイ。 IPv6対応の基本方針 IPv6対応=IPv6/IPv4の両方で動作させること シングルソースコードで対応する 44
  45. 45. まとめ(2) IPv6対応のポイント 1. IPv4/IPv6両対応のプログラミング言語と実行 環境を使う 2. 通信処理をIPv4/IPv6の両方に対応させる 3. データとしてIPアドレスを扱う箇所をIPv4/IPv6 の両方に対応させる 45 !   決して難しくない! 今日から開発するアプリケーションは IPv6に対応させよう!
  46. 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. 47. ご清聴いただき、 ありがとうございました 47

×