BSDソケットによるIPv6プログラミングを紐解く

Similar documents
IPv6 普及 高度化推進協議会 IPv6/IPv4 共存 WG アプリケーションの IPv6 対応検討 SWG 2011 年 9 月に発足 IPv6 移行ガイドライン策定 IPv6 Ready ロゴプログラム Web アプリケーションガイドライン策定基盤となる Socket プログラミングの IP

(Microsoft PowerPoint - IPv6_summit_r2.ppt [\214\335\212\267\203\202\201[\203h])

情報ネットワーク演習 2007 年 10 月 11 日 ( 木 )

Microsoft PowerPoint pptx

TCP UDP TCP UDP send()sendto()sendmsg() recv()recvfrom()recvmsg() OS Passive Active TCP UDP IP TCP UDP MTAMail Transf

AsteriskのIPv6対応について

演算増幅器

通信プログラムの試作ーーー UDP を用いたじゃんけんゲームシステム ーーーー裘彬濱 南山大学情報理工学部 ソフトウェア工学科青山研究室

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - EGX100によるH663通信手引

情報ネットワーク演習 2006年10月5日

(Microsoft PowerPoint - janog23-server-ipv6-rel-public.ppt [\214\335\212\267\203\202\201[\203h])

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

1) // 2) I/O 3) Japan Advanced Institute of Science and Technology 2013/07/26 1

PowerPoint プレゼンテーション

プログラミングI第10回

Chapter - UDP のプログラミング - UDP ネットワークプログラミングで TCP の次に多い通信方法が UDP だと思われます UDP はデータが宛先に届いたかどうかを関知しないため データの到着を保障しない点が TCP と異なります そのため UDP を使った通信を行うプログラムを書

クライアントOSのIPv6実装事情

Chapter - TCP通信の基礎 - TCPによるプログラミングの流れ TCPによる通信は サーバとクライアントの者間で行われます クライアントがサーバに TCPによるプログラミングの流れ 話通信は 両端の紙コップを糸で繋いではじめて利用可能になります ソケットも同様で 通 信相手のソケットと仮

IIJ GIOリモートアクセスサービス Windows 7 設定ガイド

memo

ソケット API プロセス間通信の汎用 API プロセス : プログラムのひとつの単位 ex)./a.out とかやると 1 つのプロセスが立ち上がる ソケット API IPv4 IPv6 UNIX domain (UNIX 計算機内プロセス間通信 ) 本実験では IPv4 の TCP および UD

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

Taro-ポインタ変数Ⅰ(公開版).j

Webサービス, 軽量プログラミング言語のIPv6対応Perl編

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

AquesTalk プログラミングガイド

4 実験結果 // 用意されたヘッダファイル #include < stdio.h> #include < fcntl.h> #include < netdb.h> #include < sys/types.h> #include < sys/socket.h> #include < sys/sta

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

プログラミング基礎

Microsoft Word - no15.docx

目次 Windows 2003 への新規インストール... 3 Windows 2008 への新規インストール... 4 Windows 2012 への新規インストール... 6 Microsoft SQL のサポート... 8 IPv4/IPv6 のサポート... 8 制限事項... 9 Web

ファイル入出力

AquesTalk Win Manual

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft Word - Cプログラミング演習(12)

ほっといたら IPv4 運用に影響する IPv6 の話 アンカーテクノロジー株式会社 國武功一

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Taro-スタック(公開版).jtd

Microsoft PowerPoint - CproNt02.ppt [互換モード]

ネットワークプログラミング

AquesTalk for WinCE プログラミングガイド

目次 はじめに KDDIのIPv6への取り組み auひかりのipv6 World IPv6 Dayに起きたこと World IPv6 Dayのその後 1

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

rzab6pdf.ps

エラー処理・分割コンパイル・コマンドライン引数

AquesTalk2 Win マニュアル

kiso2-03.key

Transcription:

BSD Socket による IPv6 プログラミングを 紐解く 株式会社リコー研究開発本部基盤技術開発センター大平浩貴 ( おおひらこうき ) 1

自己紹介 1999 年頃から IPv6 にかかわる IETF 行ったり 端末 OS 触ったり 複合機のネットワークを触ったり IPsecやったり プログラミングはあまり得意ではないけど 2

今回の説明の概要 通信プログラムの基本 BSD Socket 元々 C 言語で作られたネットワークAPI 他の言語でもSocketから派生したAPIを持っていることが多い LLプログラマでも知識として知っておくことをお勧め 今回はクライアントに限定して説明 名前解決やフォールバックなど いろいろな知識が習得できる 別途サーバプログラミングも勉強すると さらに理解が深まります 3

IPv6 のプログラム解説 Socket プログラミングについて公開済み IPv6/IPv4 共存 WG アプリケーション IPv6 化検討 SWG http://www.v6pc.jp/jp/wg/coexistencewg/v6app-swg.phtml プログラミングの解説は下記のとおり クライアント & サーバプログラミングの解説 上記協議会 Webサイトの解説 & サンプルプログラム http://www.v6pc.jp/jp/upload/pdf/socket-20121203.pdf http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf 昨年のIW T7セッション https://www.nic.ad.jp/ja/materials/iw/2012/proceedings/t7/ 4

IPv6 プログラミングとは IPv4 対応プログラム ( シングルスタック ) ひとつのプロトコルに対応していた IPv6/IPv4 両対応プログラム ( デュアルスタック ) 複数のプロトコル 複数アドレスの中のどれでサーバに接続するか選ばなければならない ただ単に関数を変更するだけではだめどのプロトコル アドレスを使うか選択する機構が必要 5

Socket プリミティブの紹介 6

シングルスタック デュアルスタックそれぞれの流れ シングルスタックの流れ ホスト名解決 サービス名解決 Socket 生成 Connect 実行 デスクリプタによる入出力 クローズ デュアルスタックの流れ ホスト名解決 サービス名解決 得られた複数のプロトコル アドレスでループ Socket 生成 Connect 実行 接続失敗したら 次のプロトコル アドレスを選択 接続成功したら デスクリプタによる入出力 クローズ 7

ホスト名 サービス名解決 IPv4 ホスト名 :gethostbyname() で hostent 構造体を得る サービス : getservbyname() で servent 構造体を得る デュアルスタック getaddrinfo() で addrinfo 構造体のリストを得る リストの開放も可能で freeaddrinfo() 関数による 注意 gethostbyname2() は IPv6 を扱えるが使うべきではない 8

addrinfo 構造体と sockaddr 構造体 addrinfo 構造体 複数のアドレス情報をLinked Listで保持する 内部でアドレスを保持するsockaddr 構造体へのリンクを持つ sockaddr 構造体 各種アドレス情報を汎化した構造体 実体はsockaddr_in6(v6) やsockaddr_in(v4) 9

sockaddr 構造体の種別 sockaddr 構造体のサブクラス sockaddr 構造体はネットワークアドレスを記憶する sockaddr_in IPv4 アドレスの構造体 (in は Internet の略 ) sockaddr_in6 IPv6 アドレスの構造体 sockaddr_* いろいろなプロトコルのアドレス sockaddr_storage どのプロトコルのアドレスが書き込まれても記憶できるだけの十分な容量を持った構造体 10

逆引き IPv4 アドレス :gethostbyaddr() で hostent 型構造体を得る サービス :getservbyport() で servent 構造体を得る デュアルスタック getnameinfo() と addrinfo 構造体からホスト名やサービス名の文字列を取得できる いろいろなオプションが指定可能 NI_NOFQDN FQDN ではなくホスト名だけ NI_DGRAM UDP のポート情報を得る NI_NUMERICHOST 逆引きせずアドレスの文字列表現を返す etc 11

ソケット生成 コネクト デュアルスタックの場合 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); 12

自分自身の IP アドレスを得るには? 環境依存 UNIX ライク OS なら ioctl 関数を利用するのが一般的 オープンソース OS の場合は ifconfig のソースを参照するとよい FreeBSD の場合 /usr/src/sbin/ifconfig/* ubuntu の場合 net-tools パッケージ 13

実際のソースコードの紹介 14

シングルスタック デュアルスタックそれぞれの流れ シングルスタックの流れ ホスト名解決 サービス名解決 Socket 生成 Connect 実行 デスクリプタによる入出力 クローズ デュアルスタックの流れ ホスト名解決 サービス名解決 得られた複数のプロトコル アドレスでループ Socket 生成 Connect 実行 接続失敗したら 次のプロトコル アドレスを選択 接続成功したら デスクリプタによる入出力 クローズ 15

実際のソースコード (1) Include の指定 #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <netdb.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> 16

実際のソースコード (2) 変数定義 ~ 名前解決 struct addrinfo hints, *res, *res0; const char * target_name ="www.v6pc.jp"; const char * target_port = "http"; int s, error; size_t l;char buf[256]; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(target_name, target_port, &hints, &res0); if(error){ exit(1); } 17

実際のソースコード (3) 接続 ~ フォールバック ~ 通信 ~ 終了 for (res = res0; res; res = res->ai_next) { fprintf(stderr, "trying %s port %s n", 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); continue; } write(s,"get / r n", 7); while ((l = read(s, buf, sizeof(buf))) > 0) write(stdout_fileno, buf, l); close(s); exit(0); } exit(1); 18

フォールバック問題 19

フォールバック問題 フォールバックとは 前述の名前解決結果の Linked List を辿ること 問題 タイムアウトを繰り返すので 接続まで時間がかかる 原因 サーバがそのプロトコル IP アドレスでアプリサービスをしていない サーバ側に問題 ネットワークの接続性が失われている 経路に問題 サーバへの到達姓のないアドレスで通信をしようとしている クライアント側に問題 20

フォールバックの回避 サーバがサービスしていない IP アドレスは DNS に登録しない IP の接続性を健全に保つ ポリシーテーブルを変更する ポリシーテーブルの参照法は下記のとおり Windows: Linux: FreeSBD: netsh interface ipv6 show prefixpolicies ip addrlavel show ip6addrctl show サーバ 経路 クライアントと さまざまな要素が考えられる 過渡期なので注意が必要 21

最後に 22

最後に C 言語によるクライアントプログラミングのまとめ 基本的な流れはわかりやすい 名前解決 ~ 接続 ~ 通信 ~ 切断 名前解決のデータ構造に注意 Linked List 形式でアドレスを保持 多彩なアドレスを構造体の継承で表現している IPv6 はどんどん浸透してきている アプリで IPv6 を先取りして 時代もお客様も先取りしよう 何かありましたらいつでもこちらまで kohki@lemegeton.org Twitter: @torawarenoaya facebook: http://www.facebook.com/kohki.ohhira 23