狠狠撸
Submit Search
笔贬笔プログラミングの滨笔惫6対応の実际
?
1 like
?
1,943 views
Tetsuji Koyama
Follow
2008/11/27 Internet Week 2008 「実践!IPv6 Webサービス構築」で発表した資料。
Read less
Read more
1 of 41
Download now
More Related Content
笔贬笔プログラミングの滨笔惫6対応の実际
1.
PHPプログラミングの IPv6対応の実際 小山 哲志 (株)ビート?クラフト koyama@beatcraft.com 1
2.
講演者について ?小山哲志 (こやま てつじ) ?株式会社ビート?クラフト所属 ?Webアプリ/サービス開発者 ?アジャイルメディアネットワーク広告 配信サーバなど ?日本PHPユーザ会スタッフ ?IW2008プログラム委員 2
3.
セッションの趣旨 ?IPv4アドレス枯渇に対するWeb業界のア クションが遅い ?IPv6にサービスを対応させるにしても、 使っているプログラミング言語はどこま で大丈夫? ?各言語のサーベイが必要 3
4.
まずお詫び ?Web開発で用いられる4大言語 ?Perl ?Python ?Ruby ?PHP ?本来は上記全ての言語のIPv6対応を解説 したい ?PHP以外は講演者が見つからなかった 4
5.
本日の内容 ?IPv6対応とはどういうことか? ?PHP本体のIPv6対応 ?外部Extension/PEARの対応 ?まとめ 5
6.
本日の内容 ?IPv6対応とはどういうことか? ?PHP本体のIPv6対応 ?外部Extension/PEARの対応 ?まとめ 6
7.
IPv4とIPv6の違い ?アドレス長が違う ?IPv4: 32ビット (xxx.xxx.xxx.xxx) ?IPv6:
128ビット (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff) ?IPv4と違い、IPv6はインターフェースに 複数のアドレスが付くのが普通 ?どのアドレスをsrcにするか? 7
8.
IPv6対応とは? ?IPv4でしか動かないものを、 IPv6のみで動くようにすること ではなく IPv4でもIPv6でも、両方で動くようにす ること。 ?プロトコルに依存しないプログラミング 8
9.
OSの対応は完了している ?最新のOSであれば問題なし ?Linux,BSD(MacOS),その他UNIX ?WindowsXP,Vista ?新APIに従ったアプリケーションならば 大丈夫 ?PHPもOSから見ればアプリケーション 9
10.
ホスト名→アドレス ?リゾルバ ?/etc/hosts ?DNS ?etc.. 10
11.
API変更 ?IPv4 ?gethostbyname ?gethostbyaddr ?IPv4+IPv6 ?getaddrinfo ?getnameinfo 11
12.
何故APIの変更が必要か? ?これまでのアドレス情報(sockaddr) ?IPv4決めうち ?これからのアドレス情報 ?複数の情報が返る可能性 ?A,AAAA両方設定されているかも 12
13.
本日の内容 ?IPv6対応とはどういうことか? ?PHP本体のIPv6対応 ?外部Extension/PEARの対応 ?まとめ 13
14.
PHPの使われ方 ?Apache(やその他のWebサーバの)モ ジュールとして ?mod_php ?CGIとして ?コマンドラインとして 14
15.
mod_php/CGI ?ネットワーク入出力はhttpdが面倒を見 てくれる ?PHP自体はIPv6対応の必要なし ?アドレス解析部分は除く ?Apacheは問題なくIPv6を扱える 15
16.
httpdに頼れない場合 ?PHPで独自にネットワーク接続をする ?他のWebサービスにアクセスする ?メール送受信 ?FTP送受信 ?etc... 16
17.
PHPのネットワークIO ?streamモデル ?ソケットを直接使わなくても、ネット ワーク入出力ができる ?ライブラリのほとんどはこれを利用して いるが、例外あり 17
18.
streamのIPv6対応 ?php_network_getaddresses() ?main/network.c ?getaddrinfoを用いて、セオリー通りに プログラミングしている ?php_stream_xport_create() ?main/streams/transports.c ?問題なし 18
19.
streamはOK $cont = file_get_contents('http://ipv6.google.com/'); $fp
= fsockopen('ipv6.google.com', 80); $out = "GET / HTTP/1.1rn"; $out .= "Host: ipv6.google.comrn"; $out .= "Connection: Closernrn"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); 19
20.
ext/sockets ?streamではないネットワーク入出力 ?socketそのままのAPI ?bind,listen,acceptもある ?一応IPv6対応しているが、AF_INET6を明 示的に指定する必要がある ?IPv6→IPv4フォールバックができない ?要注意! 20
21.
DNS Query ?dns_get_record (PHP関数) ?AAAAも含めて、すべてのレコードが ちゃんと返ってくる ?ただしBSD(MacOS含む),Windowsでは 実装されていない ?PEAR::Net_DNSを使う 21
22.
gethostbyname ?PHP関数 ?同名のC APIの単純なラッパー ?IPv6対応のコードは一応入っている ?でもOSによっては動かない ?Linux,MacOSはだめ ?gethostbyaddrも同様 22
23.
本日の内容 ?IPv6対応とはどういうことか? ?PHP本体のIPv6対応 ?外部Extension/PEARの対応 ?まとめ 23
24.
extension/PEAR ?標準extension ?soap, ftp, xmlrpc ?PECL ?PEAR ?Net_IPv6 ?Net_Socket ?Net_POP3 ?Net_IMAP ?Net_Server 24
25.
ext/soap ?SOAP ?HTTPでXMLを用いたRPC ?http_connect(): php_http.c ?php_stream_xport_createを使ってい る ?streamの上で動いているのでOK 25
26.
ext/ftp ?FTP ?ファイル転送プロトコル ?php_network_connect_socket_to_hostを 呼び出している ?その下でphp_network_getaddresses ?問題なし 26
27.
PECL ?独立パッケージのextension ?ネットワーク関連のものはいくつかある ?外部ライブラリのブリッジのみ ?IPv6対応しているかどうかはライブラ リ次第 27
28.
PEAR::Net_IPv6 ?IPv6アドレス解析クラス ?メソッドは3つだけ ?Uncompress ?Compress ?CheckIPv6 28
29.
PEAR::Net_IPv6つづき require_once 'Net/IPv6.php'; $v6addr =
'fe80::1'; $uc = Net_IPv6::uncompress($v6addr); echo $uc; // fe80:0:0:0:0:0:0:1 29
30.
PEAR::Net_Socket ?socketのOO API ?fsockopen/pfsockopenを呼び出している ?つまりstreamを使う ?connect時にIPv4を前提にしたアドレス チェックを行なっている ?ホスト名が渡されるとgethostbynameで 名前解決する 30
31.
PEAR::Net_Socketつづき ?IPv6なアドレスやAAAAしかないホスト名 が渡されると、この部分は無効になる ?結果的にPHP内部で名前解決される ? OK! if (!$addr)
{ return $this->raiseError('$addr cannot be empty'); } elseif (strspn($addr, '.0123456789') == strlen($addr) || strstr($addr, '/') !== false) { $this->addr = $addr; } else { $this->addr = @gethostbyname($addr); } 31
32.
PEAR::Net_Socketつづき require_once 'Net/Socket.php'; $sock =
new Net_Socket; $sock->connect('ipv6.google.com', 80); $out = "GET / HTTP/1.1rn"; $out .= "Host: ipv6.google.comrn"; $out .= "Connection: Closernrn"; $sock->write($out); while (!$sock->eof()) { echo $sock->gets(128); } $sock->disconnect(); 32
33.
PEAR::Net_POP3 ?メール取得プロトコルPOP3 ?Post Office Protocol
version3 ?PEAR::Net_Socketを使っている ?OK! 33
34.
PEAR::Net_IMAP ?メール取得プロトコルIMAP ?Internet Message Access
Protocol ?PEAR::Net_Socketを使っている ?OK! 34
35.
PEAR::Net_SMTP ?メール転送プロトコルSMTP ?Simple Mail Transfer
Protocol ?PEAR::Net_Socketを使っている ?OK! 35
36.
PEAR::HTTP_Request ?HTTP送受信ライブラリ ?PEAR::Net_Socketを使っている ?OK! 36
37.
PEAR::Net_Server ?PHPでサーバを作るクラス ?bindしてlistenするもの ?sockets extensionを利用 ?IPv4/IPv6で同時に待ち受けるサーバは作 れない 37
38.
PEAR::Net_DNS ?DNS問い合わせを行なうクラス ?socketはfsockopenを使っている ?AAAAも含めて問い合わせできるが、RR Typeを指定しなくてはいけない 38
39.
本日の内容 ?IPv6対応とはどういうことか? ?PHP本体のIPv6対応 ?外部Extension/PEARの対応 ?まとめ 39
40.
まとめ ?fsockopen/Net_Socketがベースになって いるものが多い。 ?自動的にIPv6名前解決、接続できる ?IPv6アドレス解析はまだまだ不十分 ?マルチキャスト/エニーキャストの考慮 はない ?PHPで必要かどうかも疑問 40
41.
お願い ?まだまだ調査不足を実感しています ?私もIPv6でサービスを運用した経験は ありません ?とりあえずIPv6触ってみませんか? ?他言語の調査をしてくれる方大募集 41
Download