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