Movatterモバイル変換


[0]ホーム

URL:


Kohki Ohhira, profile picture
Uploaded byKohki Ohhira
PPT, PDF327 views

V6prog OSC2013Hokkaido

Embed presentation

Download to read offline
1Socket を使用した IPv6 プログラミングの基礎IPv6 普及・高度化推進協議会IPv6/IPv4 共存 WGアプリ IPv6 化検討 SWG メンバー株式会社リコー研究開発本部基盤技術開発センター大平浩貴(おおひら こうき)
2IPv6 とその必要性1990 年代よりインターネットが流行した– IP が多数使われるようになった– IP を使う端末が増えたIP アドレスの枯渇– インターネットで通信する端末の識別番号(端末の住所: IP アドレス)が不足するようになった新しい IP アドレスを持つ IP にしよう– IPv4 (従来型)から IPv6 (次世代型)へ– IPv6 は IPv4 を参考にしているが相互運用性はない
3IPv6 の対応状況 iDC/ ホスティング→続々対応中 ISP→ 続々対応中 端末 OS→PC は対応済み(随時機能向上中) … じゃぁ、アプリケーションソフトウェアは?– Apache や BIND など、公共性の高いものは対応済み … じゃぁ、私たちが作るアプリは?– 私たち自身がこれからがんばらないと! アプリケーションソフトウェアが IPv6 対応するにはどうしたらいいか
4IPv6 プログラミングの情報について 今回の解説で参考にしている書籍– IPv6 ネットワークプログラミング ASCII 社刊•http://ascii.asciimw.jp/books/books/detail/4-7561-4236-2.shtml– 著者は萩野純一郎( itojun )氏– 今回参考にしたプログラムもこの本に掲載されているもの•itojun 氏が製作し、パブリックドメインで公開 IW2012 の T7 「 IPv6 実践講座~トラブルシューティング、セキュリティ、アプリ構築まで~」セッション– https://www.nic.ad.jp/ja/materials/iw/2012/proceedings/t7/
5IPv6 普及・高度化推進協議会での活動 IPv6/IPv4 共存 WG アプリケーション IPv6 化検討SWG– http://www.v6pc.jp/jp/wg/coexistenceWG/v6app-swg.phtml Socket アプリケーションの IPv6 化•http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml– 手法本文 / サンプルプログラム / ソリューションサンプル•http://www.v6pc.jp/jp/upload/pdf/socket-20121203.pdf•http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf•http://www.v6pc.jp/jp/upload/pdf/about_asterisk_ipv6v5-9.pdf Web アプリの IPv6 化– 現在調査・検討中
6IPv6 Summit も北海道で開催 IPv6 Summit 2014 in Hokkaido– IPv6 に関する最新事情の講演会– 1 月ないしは 2 月に実施 社団法人日本インターネット協会( IAjapan )が主催– http://www.iajapan.org/– IPv6 ディプロイメント委員会による– http://www.iajapan.org/ipv6/ みなさまお誘い合わせの上、ご参加をよろしくお願いいたします
7今回の説明の概要 BSD Socket API を使用したアプリケーションソフトウェアの IPv6 化を説明 クライアントプログラムの IPv6 対応– 具体的な手順 サーバプログラムの IPv6 対応– 手法の分類– 具体的な手順は割愛(すみません) 名前解決の問題と解決案 組み込みの話
8BSD Socket によるクライアントアプリケーションの IPv6化
9IPv6 対応・デュアルスタック対応とは IPv6 だけでなく従来の IPv4 にも対応しなければならない 従来:シングルスタック– ひとつのプロトコル( IPv4 )に対応していた 今後:デュアルスタック( IPv6/IPv4 両対応プログラム)– クライアントは複数のプロトコル・複数アドレスの中のどれで送信を行うか選ばなければならない– サーバは複数のプロトコル・アドレスで同時に受信しなければならないただ単に関数を変更するだけではだめ選択機構や、並列受信機構などが新たに必要となる
10従来のクライアントプログラミングIPv4 対応シングルスタックによるクライアントアプリの大まかな流れ– ホスト名解決– サービス名解決– Socket 生成(ファイルデスクリプタ生成)– Connect 実行(通信相手指定・接続を確立)– デスクリプタによる入出力– クローズ
11ホスト名・サービス名解決 IPv4– ホスト名: gethostbyname() で hostent 構造体を得る– サービス: getservbyname() で servent 構造体を得る デュアルスタック– getaddrinfo() を呼ぶと addrinfo 構造体のリストが得られる•リストの開放は freeaddrinfo() 関数に引数でそのリストを与える 注意– gethostbyname2() は IPv6 を扱えるが使うべきではない
12addrinfo 構造体と sockaddr 構造体 addrinfo 構造体– 1 インスタンスで 1 アドレス情報を持ち、リストを構築している– 内部でアドレスを保持する sockaddr 構造体へのリンクを持つ sockaddr 構造体– IPv4 や IPv6 など各種アドレス情報を汎化した構造体– 実体は sockaddr_in6 ( v6 ) や sockaddr_in ( v4 )– どのアドレスが入るかわからない場合は sockaddr_storage で定義
13逆引き IPv4– アドレス: gethostbyaddr() で hostent 型構造体を得る– サービス: getservbyport() で servent 構造体を得る デュアルスタック– getnameinfo() に sockaddr 構造体を与えるとホスト名やサービス名の文字列を取得できる•文字列領域は呼び出し元が引数で与える– いろいろなオプションが指定可能•NI_NOFQDN …FQDN ではなくホスト名だけ•NI_DGRAM …UDP のポート情報を得る•NI_NUMERICHOST… 逆引きせずアドレスの文字列表現を返す•etc...
14ソケット生成・コネクト デュアルスタックの場合 addrinfo 構造体を参照する– 例: addrinfo ai ;– プロトコルファミリ: ai->ai_family– ソケットタイプ: ai->ai_socktype– プロトコル: ai->ai_protocol– アドレス: ai->ai_addr– アドレス長: ai->ai_addrlen 実例s=socket ( ai->ai_family, ai->ai_socktype, ai->ai_protocol ) ;connect(s, ai->ai_addr, ai->ai_addrlen);
15クライアントのコード概要struct addrinfo hints, *res, *resall;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;getaddrinfo(“www.v6pc.jp”,”http”, &hints, &resall);for (res = resall; res; res = res->ai_next) {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);continue;}/* 読み書き */close(s);break;}
16デュアルスタッククライアントのまとめgetaddrinfo() で接続先 IP アドレスのリストを得る– addrinfo 構造体のリストリストの順にソケット生成・接続を行い、成功したら通信して終了するサンプルプログラム•http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf
17BSD Socket によるサーバアプリケーションの IPv6対応
18サーバのデュアルスタック化いくつか手法がある– inetd を使用する– 自身のプロトコル・アドレスの数だけ socket() を生成して、全ての FD に対して応答処理をする– シングルスタック仕様のプログラムを複数プロセス走行させる– IPv4 マップドアドレス( IPv4 Mapped IPv6address )を使用して、 v6 ソケットで通信する
19サーバアプリ実現手法の分類手法 利点 欠点【手法1】inetd を使用する通信部分を inetd が代行するため、通信の IPv6 化を意識しなくてよいinetd を必要とする【手法 2 】複数の socket を生成するひとつのプロセスでマルチプロトコルに対応できる複数ソケットを生成し、それらを同時に待つため、プログラムが複雑になる【手法 3 】シングルスタックプログラムを複数プロセス走行させるプログラム構成の変更なしに IPv6 に対応できる共有リソースを扱う場合、プロセス間で排他制御する必要がある【手法 4 】IPv4 マップドアドレスを使用するひとつのソケットでIPv4/IPv6 両方を処理でき、プログラム構成の変更が必要ないIPv4 と IPv6 の処理が混在する。アドレスを扱う際には IPv4 マップドアドレスかどうかの判定が必要
20inetd によるデュアルスタックサーバ 通信部分は変わらない 通信相手アドレスを取得する部分で注意が必要– getpeername()   FD と sockaddr 構造体を引数で渡すとsockaddr 構造体に相手ピアアドレスを書く– 引数は sockaddr 構造体ではなく、 sockaddr_storage 構造体を使用する•sockaddr_storage 構造体はどんなプロトコルのアドレスでも記憶できる領域を持つ– あとは getnameinfo() で文字列化sockaddr_storage from;getpeername(0,(sockaddr*)&from,sizeof(from)) ;手法1
21複数 socket で待ち受けるサーバもっとも典型的で理想的な対応プログラム構成が変化する– 複数のデスクリプタを同時待ち受けする機構完全な新規で設計する通信プログラムはこの構成が望ましい手法2
22複数ソケットを処理するサーバの流れ getaddrinfo() で自身のプロトコル・アドレスを addrinfo 構造体のリストで得る– hints パラメータで AI_PASSIVE を指定すると IN_ADDR_ANY とIN6ADDR_ANY_INIT が得られる リストで得られたプロトコル・アドレス個別に下記を実施– socket() 、 bind() 、 listen() 得られた複数の FD を fd_set 構造体に保存 以降はループ– fd_set 構造体を引数に select() で接続の待機– select() を抜けてきた fd に対して accept()– 読み書き処理– クローズ
23複数プロセスで待ち受けるサーバ シングルスタックアプリを複数走行させる– getaddrinfo() で AF_INET と AF_INET6 のどちらかを設定する fork でひとつのプログラムが v4/v6 に分離するようにすればリソースの節約も可能– Copy on Write 機能による手法3
24自分自身の IP アドレスを得るには?環境依存– UNIX ライク OS なら ioctl 関数を利用するのが一般的オープンソース OS の場合は ifconfig のソースを参照するとよい– FreeBSD の場合、 /usr/src/sbin/ifconfig/*– ubuntu の場合、 net-tools パッケージ
25デュアルスタックサーバのまとめいくつか手法があるので、メリットとコスト・リスクを比較して適切な選択をしましょうサンプルプログラム•http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf
26名前解決の問題と最近のテクニック
27getaddrinfo の並びは?getaddrinfo() は名前解決– 出力される addrinfo 構造体のリストはどういう順序になるのか?長らく RFC3484 で定義されていたRFC6724 が RFC3484 を Obsolete した– デフォルトポリシーテーブルの修正– アドレス選択ルールの修正– フォールバック問題の記述– etc...
28フォールバック問題 フォールバックとは– クライアントが接続先 IP アドレスのリストを得る– リストの先頭にある IP アドレスに接続しようとして、失敗すると次のリスト要素の IP アドレスを試す 原因– サーバがそのプロトコル・ IP アドレスでアプリサービスをしていない– ネットワークの接続性が失われている 問題– タイムアウトを繰り返すので、接続まで時間がかかる– 環境によっては数十秒かかる場合もありうる
29フォールバックの回避 サーバがサービスしていない IP アドレスは DNS に登録しない IP の接続性を健全に保つ ポリシーテーブルを変更する– ポリシーテーブルの参照法は下記のとおり•Windows: netsh interface ipv6 show prefixpolicies•Linux: ip addrlavel show•FreeSBD: ip6addrctl show サーバサイドだけでの対応では完全には解決できない
30Happy Eyeballs RFC6555 、 RFC6556 で定義 従来は TCP Syn の接続失敗を受けて次の TCP Syn を送っていた Happy Eyeballs は IPv6 / IPv4アドレスに両方に対して一気にTCP Syn を送る– Syn/Ack 応答が帰ってきた IP にTCP Ack を送って接続 詳細の動きが不明瞭で実装依存性が高い– 複数 I/F の場合や IPv6 アドレスが複数ある場合は?– IPv6 Syn/Ack が遅れて届いたら?– 今後の展開や運用を注視すべき
31組み込み用途での IPv6 対応
32組み込み機器へのアドレス埋め込み組み込みでは Socket を使うことが多い組み込み機器はいろいろ大変– お客様の環境で DNS が使えない– 名前解決処理に必要なリソースが不足している組み込み機器で IP アドレスをハードコーディングしたいこともある– しかしやめたほうがいい– RFC4085 でこの問題が記述されている
33アドレスハードコーディングの問題 そもそも IP アドレスは借り物– リナンバリングのリスクが伴う ホスト名は名前指定して、名前解決にはgetaddrinfo() を使うべき– RFC6724 や RFC3484 に従った適切な処理が約束されている– これを自作するということは RFC に従うコストやそれから外れるリスクを自己負担するということ これらのリスク・コスト・インターネットの道義的責任がハードコーディングしないリスク・コストを上回ったとき– 十分な注意・サポートとともにやむをえずハードコーディングすることは考えられる
34最後に IPv6 はどんどん浸透してきている– アプリで IPv6 を先取りして、時代もお客様も先取りしよう 何かありましたらいつでもこちらまで– IPv6 普及・高度化推進協議会の連絡先•https://www.v6pc.jp/jp/info/inquiry_web.phtml– 大平の連絡先•ohhira@src.ricoh.co.jp•kohki@lemegeton.org•Twitter : @torawarenoaya•facebook : http://www.facebook.com/kohki.ohhira•LinkedIn : http://jp.linkedin.com/pub/kohki-ohhira/10/7ba/6a2

Recommended

PPT
Ceph With Quanta Stor
PPTX
Ceph アーキテクチャ概説
PDF
ceph acceleration and storage architecture
PDF
Cephを用いたwordpressの構築[LT版]
PDF
PDF
Cephのベンチマークをしました
PDF
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
PDF
VyOSでMPLS
PDF
Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
PDF
openstack+cephインテグレーション
PPTX
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
PDF
Linux packet-forwarding
PDF
Openstack+Ceph設定ガイド
PDF
Cloudera impala
PDF
【さくらのクラウド】ローカルルータ導入ガイド
PPTX
さくらのクラウドでVyOS使ってみた
PDF
VTI の中身
PPTX
VPP事始め
 
PPT
Pgcon2012 ori-20120224
PPTX
Hadoop Compatible File Systems (Azure編) (セミナー「Big Data Developerに贈る第二弾 ‐ Azur...
PDF
Btrfsの基礎 part1 機能編
PDF
I pv6 research_basical
PDF
本当にあったHadoopの恐い話 Blockはどこへきえた? (Hadoop / Spark Conference Japan 2016 ライトニングトー...
PPTX
ラズパイオーディオで学ぶLinuxシステム構築
PDF
CephとGluster次期バージョンでの新機能
PDF
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
KEY
Vyatta 改造入門
PDF
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
PDF
IoT Security
PDF
バグハンターの哀しみ

More Related Content

PPT
Ceph With Quanta Stor
PPTX
Ceph アーキテクチャ概説
PDF
ceph acceleration and storage architecture
PDF
Cephを用いたwordpressの構築[LT版]
PDF
PDF
Cephのベンチマークをしました
PDF
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
PDF
VyOSでMPLS
Ceph With Quanta Stor
Ceph アーキテクチャ概説
ceph acceleration and storage architecture
Cephを用いたwordpressの構築[LT版]
Cephのベンチマークをしました
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
VyOSでMPLS

What's hot

PDF
Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
PDF
openstack+cephインテグレーション
PPTX
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
PDF
Linux packet-forwarding
PDF
Openstack+Ceph設定ガイド
PDF
Cloudera impala
PDF
【さくらのクラウド】ローカルルータ導入ガイド
PPTX
さくらのクラウドでVyOS使ってみた
PDF
VTI の中身
PPTX
VPP事始め
 
PPT
Pgcon2012 ori-20120224
PPTX
Hadoop Compatible File Systems (Azure編) (セミナー「Big Data Developerに贈る第二弾 ‐ Azur...
PDF
Btrfsの基礎 part1 機能編
PDF
I pv6 research_basical
PDF
本当にあったHadoopの恐い話 Blockはどこへきえた? (Hadoop / Spark Conference Japan 2016 ライトニングトー...
PPTX
ラズパイオーディオで学ぶLinuxシステム構築
PDF
CephとGluster次期バージョンでの新機能
PDF
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
KEY
Vyatta 改造入門
PDF
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)
Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
openstack+cephインテグレーション
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
Linux packet-forwarding
Openstack+Ceph設定ガイド
Cloudera impala
【さくらのクラウド】ローカルルータ導入ガイド
さくらのクラウドでVyOS使ってみた
VTI の中身
VPP事始め
 
Pgcon2012 ori-20120224
Hadoop Compatible File Systems (Azure編) (セミナー「Big Data Developerに贈る第二弾 ‐ Azur...
Btrfsの基礎 part1 機能編
I pv6 research_basical
本当にあったHadoopの恐い話 Blockはどこへきえた? (Hadoop / Spark Conference Japan 2016 ライトニングトー...
ラズパイオーディオで学ぶLinuxシステム構築
CephとGluster次期バージョンでの新機能
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Vyatta 改造入門
サポートメンバは見た! Hadoopバグワースト10 (adoop / Spark Conference Japan 2016 ライトニングトーク発表資料)

Viewers also liked

PDF
IoT Security
PDF
バグハンターの哀しみ
PPT
バイオメトリクス認証Hacks(AVtokyo2008 After Party: KA – E – DA - MA(Biometrics Authenti...
PPTX
SecurityCamp2015「バグハンティング入門」
PPTX
SecurityCamp2015「CVE-2015-4483解説」
PDF
JavaScript難読化読経
IoT Security
バグハンターの哀しみ
バイオメトリクス認証Hacks(AVtokyo2008 After Party: KA – E – DA - MA(Biometrics Authenti...
SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「CVE-2015-4483解説」
JavaScript難読化読経

Similar to V6prog OSC2013Hokkaido

PDF
20150228 OSC2015 Tokyo/Spring サンプルコードで理解するアプリケーションのIPv6対応
 
PDF
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
 
PDF
Lightweight Language Diverプレゼン資料:アプリケーションのIPv6対応のススメ(LL編)
 
PDF
IPv6 アプリケーション開発入門
 
PDF
20141023 IPv6 Summit in FUKUOKA 2014 IPv6対応Webサービスの作り方
 
PDF
Node.js入門
PPT
20060520.tcp
PDF
[Basic 6] DNS / ソケット通信 / その他
PDF
60分でわかるソケットプログラミング
PPTX
イベント駆動プログラミングとI/O多重化
PPTX
VSUG Day 2011 Summer - IPv6 Now
PDF
Scapy presentation
PDF
RubyからFFIを使ってみた
PPTX
Mmo game networking_1
PDF
[Basic 5] グラフ / コンピュータ ネットワーク基礎 / TCP/IP
PDF
Kyoto Tycoon Guide in Japanese
PPT
第2回 分散システム本読書会
PDF
2011/08/27 第3回 静岡 IT Pro勉強会 インフラ部 LT
PPTX
Enshu3
PDF
Scapy presentation Remake(訂正)
20150228 OSC2015 Tokyo/Spring サンプルコードで理解するアプリケーションのIPv6対応
 
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
 
Lightweight Language Diverプレゼン資料:アプリケーションのIPv6対応のススメ(LL編)
 
IPv6 アプリケーション開発入門
 
20141023 IPv6 Summit in FUKUOKA 2014 IPv6対応Webサービスの作り方
 
Node.js入門
20060520.tcp
[Basic 6] DNS / ソケット通信 / その他
60分でわかるソケットプログラミング
イベント駆動プログラミングとI/O多重化
VSUG Day 2011 Summer - IPv6 Now
Scapy presentation
RubyからFFIを使ってみた
Mmo game networking_1
[Basic 5] グラフ / コンピュータ ネットワーク基礎 / TCP/IP
Kyoto Tycoon Guide in Japanese
第2回 分散システム本読書会
2011/08/27 第3回 静岡 IT Pro勉強会 インフラ部 LT
Enshu3
Scapy presentation Remake(訂正)

V6prog OSC2013Hokkaido

  • 1.
    1Socket を使用した IPv6プログラミングの基礎IPv6 普及・高度化推進協議会IPv6/IPv4 共存 WGアプリ IPv6 化検討 SWG メンバー株式会社リコー研究開発本部基盤技術開発センター大平浩貴(おおひら こうき)
  • 2.
    2IPv6 とその必要性1990 年代よりインターネットが流行した–IP が多数使われるようになった– IP を使う端末が増えたIP アドレスの枯渇– インターネットで通信する端末の識別番号(端末の住所: IP アドレス)が不足するようになった新しい IP アドレスを持つ IP にしよう– IPv4 (従来型)から IPv6 (次世代型)へ– IPv6 は IPv4 を参考にしているが相互運用性はない
  • 3.
    3IPv6 の対応状況 iDC/ホスティング→続々対応中 ISP→ 続々対応中 端末 OS→PC は対応済み(随時機能向上中) … じゃぁ、アプリケーションソフトウェアは?– Apache や BIND など、公共性の高いものは対応済み … じゃぁ、私たちが作るアプリは?– 私たち自身がこれからがんばらないと! アプリケーションソフトウェアが IPv6 対応するにはどうしたらいいか
  • 4.
    4IPv6 プログラミングの情報について 今回の解説で参考にしている書籍–IPv6 ネットワークプログラミング ASCII 社刊•http://ascii.asciimw.jp/books/books/detail/4-7561-4236-2.shtml– 著者は萩野純一郎( itojun )氏– 今回参考にしたプログラムもこの本に掲載されているもの•itojun 氏が製作し、パブリックドメインで公開 IW2012 の T7 「 IPv6 実践講座~トラブルシューティング、セキュリティ、アプリ構築まで~」セッション– https://www.nic.ad.jp/ja/materials/iw/2012/proceedings/t7/
  • 5.
    5IPv6 普及・高度化推進協議会での活動 IPv6/IPv4共存 WG アプリケーション IPv6 化検討SWG– http://www.v6pc.jp/jp/wg/coexistenceWG/v6app-swg.phtml Socket アプリケーションの IPv6 化•http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml– 手法本文 / サンプルプログラム / ソリューションサンプル•http://www.v6pc.jp/jp/upload/pdf/socket-20121203.pdf•http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf•http://www.v6pc.jp/jp/upload/pdf/about_asterisk_ipv6v5-9.pdf Web アプリの IPv6 化– 現在調査・検討中
  • 6.
    6IPv6 Summit も北海道で開催IPv6 Summit 2014 in Hokkaido– IPv6 に関する最新事情の講演会– 1 月ないしは 2 月に実施 社団法人日本インターネット協会( IAjapan )が主催– http://www.iajapan.org/– IPv6 ディプロイメント委員会による– http://www.iajapan.org/ipv6/ みなさまお誘い合わせの上、ご参加をよろしくお願いいたします
  • 7.
    7今回の説明の概要 BSD SocketAPI を使用したアプリケーションソフトウェアの IPv6 化を説明 クライアントプログラムの IPv6 対応– 具体的な手順 サーバプログラムの IPv6 対応– 手法の分類– 具体的な手順は割愛(すみません) 名前解決の問題と解決案 組み込みの話
  • 8.
  • 9.
    9IPv6 対応・デュアルスタック対応とは IPv6だけでなく従来の IPv4 にも対応しなければならない 従来:シングルスタック– ひとつのプロトコル( IPv4 )に対応していた 今後:デュアルスタック( IPv6/IPv4 両対応プログラム)– クライアントは複数のプロトコル・複数アドレスの中のどれで送信を行うか選ばなければならない– サーバは複数のプロトコル・アドレスで同時に受信しなければならないただ単に関数を変更するだけではだめ選択機構や、並列受信機構などが新たに必要となる
  • 10.
    10従来のクライアントプログラミングIPv4 対応シングルスタックによるクライアントアプリの大まかな流れ– ホスト名解決–サービス名解決– Socket 生成(ファイルデスクリプタ生成)– Connect 実行(通信相手指定・接続を確立)– デスクリプタによる入出力– クローズ
  • 11.
    11ホスト名・サービス名解決 IPv4– ホスト名:gethostbyname() で hostent 構造体を得る– サービス: getservbyname() で servent 構造体を得る デュアルスタック– getaddrinfo() を呼ぶと addrinfo 構造体のリストが得られる•リストの開放は freeaddrinfo() 関数に引数でそのリストを与える 注意– gethostbyname2() は IPv6 を扱えるが使うべきではない
  • 12.
    12addrinfo 構造体と sockaddr構造体 addrinfo 構造体– 1 インスタンスで 1 アドレス情報を持ち、リストを構築している– 内部でアドレスを保持する sockaddr 構造体へのリンクを持つ sockaddr 構造体– IPv4 や IPv6 など各種アドレス情報を汎化した構造体– 実体は sockaddr_in6 ( v6 ) や sockaddr_in ( v4 )– どのアドレスが入るかわからない場合は sockaddr_storage で定義
  • 13.
    13逆引き IPv4– アドレス:gethostbyaddr() で hostent 型構造体を得る– サービス: getservbyport() で servent 構造体を得る デュアルスタック– getnameinfo() に sockaddr 構造体を与えるとホスト名やサービス名の文字列を取得できる•文字列領域は呼び出し元が引数で与える– いろいろなオプションが指定可能•NI_NOFQDN …FQDN ではなくホスト名だけ•NI_DGRAM …UDP のポート情報を得る•NI_NUMERICHOST… 逆引きせずアドレスの文字列表現を返す•etc...
  • 14.
    14ソケット生成・コネクト デュアルスタックの場合 addrinfo構造体を参照する– 例: addrinfo ai ;– プロトコルファミリ: ai->ai_family– ソケットタイプ: ai->ai_socktype– プロトコル: ai->ai_protocol– アドレス: ai->ai_addr– アドレス長: ai->ai_addrlen 実例s=socket ( ai->ai_family, ai->ai_socktype, ai->ai_protocol ) ;connect(s, ai->ai_addr, ai->ai_addrlen);
  • 15.
    15クライアントのコード概要struct addrinfo hints,*res, *resall;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;getaddrinfo(“www.v6pc.jp”,”http”, &hints, &resall);for (res = resall; res; res = res->ai_next) {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);continue;}/* 読み書き */close(s);break;}
  • 16.
    16デュアルスタッククライアントのまとめgetaddrinfo() で接続先 IPアドレスのリストを得る– addrinfo 構造体のリストリストの順にソケット生成・接続を行い、成功したら通信して終了するサンプルプログラム•http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf
  • 17.
  • 18.
    18サーバのデュアルスタック化いくつか手法がある– inetd を使用する–自身のプロトコル・アドレスの数だけ socket() を生成して、全ての FD に対して応答処理をする– シングルスタック仕様のプログラムを複数プロセス走行させる– IPv4 マップドアドレス( IPv4 Mapped IPv6address )を使用して、 v6 ソケットで通信する
  • 19.
    19サーバアプリ実現手法の分類手法 利点 欠点【手法1】inetdを使用する通信部分を inetd が代行するため、通信の IPv6 化を意識しなくてよいinetd を必要とする【手法 2 】複数の socket を生成するひとつのプロセスでマルチプロトコルに対応できる複数ソケットを生成し、それらを同時に待つため、プログラムが複雑になる【手法 3 】シングルスタックプログラムを複数プロセス走行させるプログラム構成の変更なしに IPv6 に対応できる共有リソースを扱う場合、プロセス間で排他制御する必要がある【手法 4 】IPv4 マップドアドレスを使用するひとつのソケットでIPv4/IPv6 両方を処理でき、プログラム構成の変更が必要ないIPv4 と IPv6 の処理が混在する。アドレスを扱う際には IPv4 マップドアドレスかどうかの判定が必要
  • 20.
    20inetd によるデュアルスタックサーバ 通信部分は変わらない通信相手アドレスを取得する部分で注意が必要– getpeername()   FD と sockaddr 構造体を引数で渡すとsockaddr 構造体に相手ピアアドレスを書く– 引数は sockaddr 構造体ではなく、 sockaddr_storage 構造体を使用する•sockaddr_storage 構造体はどんなプロトコルのアドレスでも記憶できる領域を持つ– あとは getnameinfo() で文字列化sockaddr_storage from;getpeername(0,(sockaddr*)&from,sizeof(from)) ;手法1
  • 21.
    21複数 socket で待ち受けるサーバもっとも典型的で理想的な対応プログラム構成が変化する–複数のデスクリプタを同時待ち受けする機構完全な新規で設計する通信プログラムはこの構成が望ましい手法2
  • 22.
    22複数ソケットを処理するサーバの流れ getaddrinfo() で自身のプロトコル・アドレスをaddrinfo 構造体のリストで得る– hints パラメータで AI_PASSIVE を指定すると IN_ADDR_ANY とIN6ADDR_ANY_INIT が得られる リストで得られたプロトコル・アドレス個別に下記を実施– socket() 、 bind() 、 listen() 得られた複数の FD を fd_set 構造体に保存 以降はループ– fd_set 構造体を引数に select() で接続の待機– select() を抜けてきた fd に対して accept()– 読み書き処理– クローズ
  • 23.
    23複数プロセスで待ち受けるサーバ シングルスタックアプリを複数走行させる– getaddrinfo()で AF_INET と AF_INET6 のどちらかを設定する fork でひとつのプログラムが v4/v6 に分離するようにすればリソースの節約も可能– Copy on Write 機能による手法3
  • 24.
    24自分自身の IP アドレスを得るには?環境依存–UNIX ライク OS なら ioctl 関数を利用するのが一般的オープンソース OS の場合は ifconfig のソースを参照するとよい– FreeBSD の場合、 /usr/src/sbin/ifconfig/*– ubuntu の場合、 net-tools パッケージ
  • 25.
  • 26.
  • 27.
    27getaddrinfo の並びは?getaddrinfo() は名前解決–出力される addrinfo 構造体のリストはどういう順序になるのか?長らく RFC3484 で定義されていたRFC6724 が RFC3484 を Obsolete した– デフォルトポリシーテーブルの修正– アドレス選択ルールの修正– フォールバック問題の記述– etc...
  • 28.
    28フォールバック問題 フォールバックとは– クライアントが接続先IP アドレスのリストを得る– リストの先頭にある IP アドレスに接続しようとして、失敗すると次のリスト要素の IP アドレスを試す 原因– サーバがそのプロトコル・ IP アドレスでアプリサービスをしていない– ネットワークの接続性が失われている 問題– タイムアウトを繰り返すので、接続まで時間がかかる– 環境によっては数十秒かかる場合もありうる
  • 29.
    29フォールバックの回避 サーバがサービスしていない IPアドレスは DNS に登録しない IP の接続性を健全に保つ ポリシーテーブルを変更する– ポリシーテーブルの参照法は下記のとおり•Windows: netsh interface ipv6 show prefixpolicies•Linux: ip addrlavel show•FreeSBD: ip6addrctl show サーバサイドだけでの対応では完全には解決できない
  • 30.
    30Happy Eyeballs RFC6555、 RFC6556 で定義 従来は TCP Syn の接続失敗を受けて次の TCP Syn を送っていた Happy Eyeballs は IPv6 / IPv4アドレスに両方に対して一気にTCP Syn を送る– Syn/Ack 応答が帰ってきた IP にTCP Ack を送って接続 詳細の動きが不明瞭で実装依存性が高い– 複数 I/F の場合や IPv6 アドレスが複数ある場合は?– IPv6 Syn/Ack が遅れて届いたら?– 今後の展開や運用を注視すべき
  • 31.
  • 32.
    32組み込み機器へのアドレス埋め込み組み込みでは Socket を使うことが多い組み込み機器はいろいろ大変–お客様の環境で DNS が使えない– 名前解決処理に必要なリソースが不足している組み込み機器で IP アドレスをハードコーディングしたいこともある– しかしやめたほうがいい– RFC4085 でこの問題が記述されている
  • 33.
    33アドレスハードコーディングの問題 そもそも IPアドレスは借り物– リナンバリングのリスクが伴う ホスト名は名前指定して、名前解決にはgetaddrinfo() を使うべき– RFC6724 や RFC3484 に従った適切な処理が約束されている– これを自作するということは RFC に従うコストやそれから外れるリスクを自己負担するということ これらのリスク・コスト・インターネットの道義的責任がハードコーディングしないリスク・コストを上回ったとき– 十分な注意・サポートとともにやむをえずハードコーディングすることは考えられる
  • 34.
    34最後に IPv6 はどんどん浸透してきている–アプリで IPv6 を先取りして、時代もお客様も先取りしよう 何かありましたらいつでもこちらまで– IPv6 普及・高度化推進協議会の連絡先•https://www.v6pc.jp/jp/info/inquiry_web.phtml– 大平の連絡先•ohhira@src.ricoh.co.jp•kohki@lemegeton.org•Twitter : @torawarenoaya•facebook : http://www.facebook.com/kohki.ohhira•LinkedIn : http://jp.linkedin.com/pub/kohki-ohhira/10/7ba/6a2

[8]ページ先頭

©2009-2025 Movatter.jp