PHPプログラミングのIPv6対応の実際

41
PHPプログラミングの IPv6対応の実際 小山 哲志 ()ビート・クラフト [email protected] 1

description

2008/11/27 Internet Week 2008 「実践!IPv6 Webサービス構築」で発表した資料。

Transcript of PHPプログラミングのIPv6対応の実際

Page 1: PHPプログラミングのIPv6対応の実際

PHPプログラミングのIPv6対応の実際

小山 哲志(株)ビート・クラフト

[email protected]

1

Page 2: PHPプログラミングのIPv6対応の実際

講演者について

•小山哲志 (こやま てつじ)

•株式会社ビート・クラフト所属•Webアプリ/サービス開発者

•アジャイルメディアネットワーク広告配信サーバなど

•日本PHPユーザ会スタッフ

• IW2008プログラム委員

2

Page 3: PHPプログラミングのIPv6対応の実際

セッションの趣旨

• IPv4アドレス枯渇に対するWeb業界のアクションが遅い

• IPv6にサービスを対応させるにしても、使っているプログラミング言語はどこまで大丈夫?

•各言語のサーベイが必要

3

Page 4: PHPプログラミングのIPv6対応の実際

まずお詫び

•Web開発で用いられる4大言語

•Perl• Python• Ruby

• PHP•本来は上記全ての言語のIPv6対応を解説したい

•PHP以外は講演者が見つからなかった

4

Page 5: PHPプログラミングのIPv6対応の実際

本日の内容

• IPv6対応とはどういうことか?

• PHP本体のIPv6対応

•外部Extension/PEARの対応

•まとめ

5

Page 6: PHPプログラミングのIPv6対応の実際

本日の内容

• IPv6対応とはどういうことか?

• PHP本体のIPv6対応

•外部Extension/PEARの対応

•まとめ

6

Page 7: PHPプログラミングのIPv6対応の実際

IPv4とIPv6の違い

•アドレス長が違う• IPv4: 32ビット (xxx.xxx.xxx.xxx)

• IPv6: 128ビット (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff)

• IPv4と違い、IPv6はインターフェースに複数のアドレスが付くのが普通

•どのアドレスをsrcにするか?

7

Page 8: PHPプログラミングのIPv6対応の実際

IPv6対応とは?

• IPv4でしか動かないものを、IPv6のみで動くようにすることではなくIPv4でもIPv6でも、両方で動くようにすること。

•プロトコルに依存しないプログラミング

8

Page 9: PHPプログラミングのIPv6対応の実際

OSの対応は完了している

•最新のOSであれば問題なし

•Linux,BSD(MacOS),その他UNIX

•WindowsXP,Vista•新APIに従ったアプリケーションならば大丈夫

•PHPもOSから見ればアプリケーション

9

Page 10: PHPプログラミングのIPv6対応の実際

ホスト名→アドレス

•リゾルバ•/etc/hosts• DNS• etc..

10

Page 11: PHPプログラミングのIPv6対応の実際

API変更

• IPv4• gethostbyname• gethostbyaddr

• IPv4+IPv6

• getaddrinfo• getnameinfo

11

Page 12: PHPプログラミングのIPv6対応の実際

何故APIの変更が必要か?

•これまでのアドレス情報(sockaddr)

• IPv4決めうち

•これからのアドレス情報•複数の情報が返る可能性•A,AAAA両方設定されているかも

12

Page 13: PHPプログラミングのIPv6対応の実際

本日の内容

• IPv6対応とはどういうことか?

• PHP本体のIPv6対応

•外部Extension/PEARの対応

•まとめ

13

Page 14: PHPプログラミングのIPv6対応の実際

PHPの使われ方

•Apache(やその他のWebサーバの)モジュールとして

•mod_php•CGIとして

•コマンドラインとして

14

Page 15: PHPプログラミングのIPv6対応の実際

mod_php/CGI

•ネットワーク入出力はhttpdが面倒を見てくれる

•PHP自体はIPv6対応の必要なし

•アドレス解析部分は除く•Apacheは問題なくIPv6を扱える

15

Page 16: PHPプログラミングのIPv6対応の実際

httpdに頼れない場合

•PHPで独自にネットワーク接続をする

•他のWebサービスにアクセスする

•メール送受信•FTP送受信

•etc...

16

Page 17: PHPプログラミングのIPv6対応の実際

PHPのネットワークIO

• streamモデル

•ソケットを直接使わなくても、ネットワーク入出力ができる

•ライブラリのほとんどはこれを利用しているが、例外あり

17

Page 18: PHPプログラミングのIPv6対応の実際

streamのIPv6対応

•php_network_getaddresses()•main/network.c• getaddrinfoを用いて、セオリー通りにプログラミングしている

•php_stream_xport_create()•main/streams/transports.c

•問題なし

18

Page 19: PHPプログラミングのIPv6対応の実際

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

Page 20: PHPプログラミングのIPv6対応の実際

ext/sockets

• streamではないネットワーク入出力

• socketそのままのAPI

• bind,listen,acceptもある

•一応IPv6対応しているが、AF_INET6を明示的に指定する必要がある

• IPv6→IPv4フォールバックができない

•要注意!

20

Page 21: PHPプログラミングのIPv6対応の実際

DNS Query

•dns_get_record (PHP関数)

• AAAAも含めて、すべてのレコードがちゃんと返ってくる

•ただしBSD(MacOS含む),Windowsでは実装されていない

•PEAR::Net_DNSを使う

21

Page 22: PHPプログラミングのIPv6対応の実際

gethostbyname

•PHP関数

•同名のC APIの単純なラッパー

• IPv6対応のコードは一応入っている

•でもOSによっては動かない

•Linux,MacOSはだめ

•gethostbyaddrも同様

22

Page 23: PHPプログラミングのIPv6対応の実際

本日の内容

• IPv6対応とはどういうことか?

• PHP本体のIPv6対応

•外部Extension/PEARの対応

•まとめ

23

Page 24: PHPプログラミングのIPv6対応の実際

extension/PEAR

•標準extension

• soap, ftp, xmlrpc• PECL• PEAR

•Net_IPv6•Net_Socket• Net_POP3•Net_IMAP•Net_Server

24

Page 25: PHPプログラミングのIPv6対応の実際

ext/soap

•SOAP•HTTPでXMLを用いたRPC

• http_connect(): php_http.c• php_stream_xport_createを使っている

• streamの上で動いているのでOK

25

Page 26: PHPプログラミングのIPv6対応の実際

ext/ftp

•FTP•ファイル転送プロトコル

•php_network_connect_socket_to_hostを呼び出している

•その下でphp_network_getaddresses

•問題なし

26

Page 27: PHPプログラミングのIPv6対応の実際

PECL

•独立パッケージのextension

•ネットワーク関連のものはいくつかある•外部ライブラリのブリッジのみ• IPv6対応しているかどうかはライブラリ次第

27

Page 28: PHPプログラミングのIPv6対応の実際

PEAR::Net_IPv6

• IPv6アドレス解析クラス

•メソッドは3つだけ

•Uncompress• Compress

• CheckIPv6

28

Page 29: PHPプログラミングのIPv6対応の実際

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

Page 30: PHPプログラミングのIPv6対応の実際

PEAR::Net_Socket

• socketのOO API

• fsockopen/pfsockopenを呼び出している

•つまりstreamを使う

•connect時にIPv4を前提にしたアドレスチェックを行なっている

•ホスト名が渡されるとgethostbynameで名前解決する

30

Page 31: PHPプログラミングのIPv6対応の実際

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

Page 32: PHPプログラミングのIPv6対応の実際

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

Page 33: PHPプログラミングのIPv6対応の実際

PEAR::Net_POP3

•メール取得プロトコルPOP3

• Post Office Protocol version3• PEAR::Net_Socketを使っている

•OK!

33

Page 34: PHPプログラミングのIPv6対応の実際

PEAR::Net_IMAP

•メール取得プロトコルIMAP

• Internet Message Access Protocol• PEAR::Net_Socketを使っている

•OK!

34

Page 35: PHPプログラミングのIPv6対応の実際

PEAR::Net_SMTP

•メール転送プロトコルSMTP

• Simple Mail Transfer Protocol• PEAR::Net_Socketを使っている

•OK!

35

Page 36: PHPプログラミングのIPv6対応の実際

PEAR::HTTP_Request

•HTTP送受信ライブラリ

•PEAR::Net_Socketを使っている

•OK!

36

Page 37: PHPプログラミングのIPv6対応の実際

PEAR::Net_Server

•PHPでサーバを作るクラス

•bindしてlistenするもの

• sockets extensionを利用

• IPv4/IPv6で同時に待ち受けるサーバは作れない

37

Page 38: PHPプログラミングのIPv6対応の実際

PEAR::Net_DNS

•DNS問い合わせを行なうクラス

• socketはfsockopenを使っている

•AAAAも含めて問い合わせできるが、RR Typeを指定しなくてはいけない

38

Page 39: PHPプログラミングのIPv6対応の実際

本日の内容

• IPv6対応とはどういうことか?

• PHP本体のIPv6対応

•外部Extension/PEARの対応

•まとめ

39

Page 40: PHPプログラミングのIPv6対応の実際

まとめ

• fsockopen/Net_Socketがベースになっているものが多い。

•自動的にIPv6名前解決、接続できる

• IPv6アドレス解析はまだまだ不十分

•マルチキャスト/エニーキャストの考慮はない

•PHPで必要かどうかも疑問

40

Page 41: PHPプログラミングのIPv6対応の実際

お願い

•まだまだ調査不足を実感しています•私もIPv6でサービスを運用した経験はありません

•とりあえずIPv6触ってみませんか?

•他言語の調査をしてくれる方大募集

41