PageRenderTime 23ms CodeModel.GetById 42ms RepoModel.GetById 0ms app.codeStats 0ms

/PyConJP2011/README.rst

https://github.com/takano32/ipv6
ReStructuredText | 563 lines | 333 code | 230 blank | 0 comment | 0 complexity | b50fc1e7410658e696f00f9a8f0a7097 MD5 | raw file
  1. ===================================
  2. 5分でわかるIPv6
  3. ===================================
  4. - 5分でわかるIPv6 @ PyCon JP 2011
  5. - 2011年8月27日
  6. - 産業技術大学院大学
  7. - 高野光弘 / @takano32 <tak at no32.tk>
  8. .. image:: 3D32.png
  9. ----
  10. お前誰よ
  11. ----------
  12. .. image:: takano32.jpg
  13. :align: left
  14. @takano32 a.k.a. 高野光弘
  15. - グリー株式会社 開発本部 インフラ統括部
  16. - サーバ群を指揮するようなツールとか作ってます
  17. - 日本UNIXユーザ会
  18. - 同年代から暗黒UNIXおじさんと呼ばれる
  19. - Rubyコミッタ / IA-64メンテナ
  20. - 前職ではIA-64やAMD64やIntel64を対象にした仮想計算機機構を作ってた
  21. - IA-64でRuby 1.9.3のFiber#resumeが落ちるのはぼくのせいです
  22. ----
  23. お前誰よ
  24. ----------
  25. sinsai.info
  26. ^^^^^^^^^^^
  27. .. image:: sinsai.info_logo.png
  28. 開発リーダー
  29. ^^^^^^^^^^^^
  30. .. image:: sinsai.info_staff.png
  31. 協賛
  32. .. image:: sinsai.info_footer.png
  33. ----
  34. お前誰よ
  35. ----------
  36. エキスパートPython
  37. ^^^^^^^^^^^^^^^^^^
  38. .. image:: expert_python.jpg
  39. :height: 320px
  40. - @t2y に誘われて査読
  41. - すみっこにちょろっと名前が載っています
  42. ----
  43. 今日のアジェンダ
  44. ----------------
  45. IPv6の暗黒面とかの話をします
  46. - ネットワーク屋の常識とソフトウェア屋の常識
  47. - ソフトウェアエンジニアがギャーってなる例とか紹介します
  48. - IPv6の仕様については最低限しか触れません
  49. - 5分でIPv6の仔細を理解できたらすごすぎ
  50. - 対象者はあーIPv4のグローバルアドレスなくなるんだくらいからで
  51. ヤバイよという概要説明するカンジ
  52. ----
  53. 復習: インターネットの恐ろしさ
  54. ------------------------------
  55. IPv6の前にIPv4もコワイ
  56. ex. 127.0.0.1 / ループバックアドレス
  57. - 自身のIPアドレスであるらしい
  58. - みんなそう指定してるから指定してるでしょ
  59. - それ正しいんです
  60. - 現在では 127.0.0.0/8 という説が有力
  61. - つまり 127.x.y.z でよいという説が有力
  62. - ping 127.16.32.64
  63. - Linux / 0% packet loss
  64. - Darwin / **100% packet loss**
  65. 日常的に使っているものもよくわからない
  66. ----
  67. アドレス表記
  68. ------------
  69. ex. リンクローカルアドレス
  70. - IPv4ではよくわかんないが勝手に 169.254.0.0/16 とか割り当てるやつの正式名称
  71. ..
  72. - IPv6ではメインの通信というよりアドレスの自動設定や近隣探索に利用
  73. - プライベートアドレスの利用が氾濫し現状と変化しない使い方を懸念
  74. - プライベートアドレスという概念は現在では廃止されている
  75. - とりあえずIPv6機構が有効になっていれば単一のマシンで使える
  76. - Mac とかなら手元で ifconfig すればすぐに使える
  77. - 今回はこのアドレスを例にアドレス表記などについておさらい
  78. ----
  79. アドレス表記 (Contd.)
  80. ---------------------
  81. - IPv4 リンクローカルアドレス
  82. - 169.254.0.0/16
  83. - IPv6 リンクローカルアドレス
  84. - fe80::/10
  85. - ex. fe80::C0FF:EE
  86. - 続きはRFC 1884
  87. - ところでみなさん http://192.168.32.16/ とかアクセスしますよね
  88. - IPv6ではどう書くんでしょうか
  89. - 基本はサイトローカルアドレスと同じです
  90. - see also RFC 5156 `2.3. IPv4-Compatible Addresses`
  91. ----
  92. アドレス表記 (Contd.)
  93. ---------------------
  94. 正解とポイント
  95. - http://[fe80::01%en0]:8080/
  96. - コロン区切り表記に由来してポート番号がわからなくなるので [] が必要
  97. - インターフェイスを指定しないと行き先がわかんない / 続きはRFC 1884
  98. - ゾーンの扱いが難しい / ゾーンというのは上記では `en0` の部分
  99. - **ゾーンを指定しないと行き先が分からない**
  100. - **コマンドによってゾーンの扱いはことなる**
  101. - ブラウザだとインターフェース指定がない
  102. - 起動するたびに **-i eth0** とか指定するブラウザがあったらキモイ
  103. - http://[fe80::01%en0]:8080/ のようなURL指定になる
  104. - **そんな不思議なURLで大丈夫か**
  105. ----
  106. User Agentのまとめ
  107. ------------------
  108. ================ ====================================
  109. User Agent IPv6 linklocal address Ready?
  110. ================ ====================================
  111. wget NG
  112. w3m NG
  113. Lynx OK!
  114. Opera 11.50 NG
  115. Chrome dev NG
  116. Chrome canary NG
  117. Firefox 5.0.1 OK!
  118. ================ ====================================
  119. - w3m vs. lynx
  120. - 国内からコミットの多いw3mがコケてる
  121. - Firefoxがんばってる
  122. - 探すと Host: ヘッダーに関する議論もフォーラムでしてる
  123. - Chr*meェ
  124. - IPv6にしても困らないって声を大にして言ってるところのブラウザ
  125. - なんだよウソじゃん困るやんけ
  126. もはや **疑心暗鬼になるレベル**
  127. ----
  128. 不正なアドレス 2.0
  129. ------------------
  130. .. image:: opera.png
  131. ネットワーク屋が得意なプロトコルスタックを改修してもムダ
  132. ソフトウェア屋の対応が必要 レイヤーが複雑なWebアプリケーションは悲惨
  133. ----
  134. ex. PHP powered by Zend Engine
  135. ------------------------------
  136. 我らがPHPでURIをパースしてみた
  137. ::
  138. takano32% php -v
  139. PHP 5.3.6 (cli) (built: Jun 3 2011 16:17:53) (DEBUG)
  140. Copyright (c) 1997-2011 The PHP Group
  141. Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
  142. ::
  143. takano32% php -r 'var_dump(parse_url("http://[fe80::1%en0]:7890/"));'
  144. array(4) {
  145. ["scheme"]=>
  146. string(4) "http"
  147. ["host"]=>
  148. string(13) "[fe80::1%en0]"
  149. ["port"]=>
  150. int(7890)
  151. ["path"]=>
  152. string(1) "/"
  153. }
  154. - ソース読んでないけどこれは実装が適当すぎる例ですね
  155. - host [] が取り除かれないと他の用途で使えません
  156. ----
  157. ex. Sinatra powered by Ruby
  158. ---------------------------
  159. Sinatra / sinatra / lib / sinatra / base.rb
  160. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb
  161. ::
  162. takano32% date
  163. Tue Jul 26 23:45:54 JST 2011
  164. たぶん今も同じコード
  165. .. code-block:: ruby
  166. set :run, false # start server via at-exit hook?
  167. set :running, false # is the built-in server running now?
  168. set :server, %w[thin mongrel webrick]
  169. set :bind, '0.0.0.0'
  170. set :port, 4567
  171. えっちょっとなんかすごいのがチラついた
  172. .. code-block:: ruby
  173. set :bind, '0.0.0.0'
  174. IPv6というものは **アウトオブ眼中** という例
  175. - IPv4の10進数表記をやめて set :bind, nil で対応できる
  176. - っていうか **放置してればIPv6でも使えるのに** 余計なことしてる
  177. ----
  178. 他人ごとではない
  179. ----------------
  180. 突撃隣のライブラリフレームワーク
  181. IPv6 Readyなんでしょうか
  182. - urlparse
  183. - SimpleHTTPServer
  184. - Django
  185. - Flask
  186. ----
  187. urlparse
  188. --------
  189. .. code-block:: python
  190. #!/usr/bin/env python
  191. import pprint
  192. pp = pprint.PrettyPrinter(indent = 4)
  193. from urlparse import urlparse
  194. result = urlparse('http://[fe80::1%en0]:7890/')
  195. print pp.pformat(result)
  196. print 'hostname: ' + result.hostname
  197. print 'port: ' + str(result.port)
  198. 出力結果は以下の通り
  199. ::
  200. ParseResult(scheme='http', netloc='[fe80::1%en0]:7890',
  201. path='/', params='', query='', fragment='')
  202. hostname: fe80::1%en0
  203. port: 7890
  204. 予想外にもhostnameとportがパースできている
  205. これは好感触
  206. ----
  207. SimpleHTTPServer
  208. ----------------
  209. python -m SimpleHTTPServer 8000
  210. ::
  211. takano32% python -m SimpleHTTPServer 8000
  212. Serving HTTP on 0.0.0.0 port 8000 ...
  213. 0.0.0.0 を指定してバインドしてる
  214. ソースコードを読んでみましたがガッツリ **0.0.0.0** って書いてありました
  215. ----
  216. Django
  217. ------
  218. - Django
  219. - https://www.djangoproject.com/
  220. ::
  221. % python manage.py runserver
  222. Validating models...
  223. 0 errors found
  224. Django version 1.3, using settings 'djangosite.settings'
  225. Development server is running at http://127.0.0.1:8000/
  226. Quit the server with CONTROL-C.
  227. - 127.0.0.1
  228. - しょうがないのでソースコードを読んでみる
  229. ----
  230. Django
  231. ------
  232. BaseRunserverCommand class
  233. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  234. core/management/commands/runserver.py
  235. .. code-block:: python
  236. def handle(self, addrport='', *args, **options):
  237. self.use_ipv6 = options.get('use_ipv6')
  238. if self.use_ipv6 and not socket.has_ipv6:
  239. raise CommandError('Your Python does not support IPv6.')
  240. if args:
  241. raise CommandError('Usage is runserver %s' % self.args)
  242. self._raw_ipv6 = False
  243. if not addrport:
  244. self.addr = ''
  245. self.port = DEFAULT_PORT
  246. else:
  247. m = re.match(naiveip_re, addrport)
  248. if m is None:
  249. raise CommandError('"%s" is not a valid port number '
  250. 'or address:port pair.' % addrport)
  251. self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups()
  252. - 考慮はされている
  253. - BaseRunserverCommandにどうやってプロパティを設定するのか
  254. ----
  255. Django
  256. ------
  257. BaseRunserverCommand class
  258. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  259. BaseRunserverCommandにどうやってプロパティを設定するのか
  260. カンでやったらできた
  261. ::
  262. python2.7 manage.py runserver '[::]:8080'
  263. Validating models...
  264. 0 errors found
  265. Django version 1.3, using settings 'djangosite.settings'
  266. Development server is running at http://[::]:8080/
  267. Quit the server with CONTROL-C.
  268. **IPv6で使えるようになった**
  269. ----
  270. Flask
  271. -----
  272. - Flask
  273. - http://flask.pocoo.org/
  274. .. code-block:: python
  275. #!/usr/bin/env python
  276. from flask import Flask
  277. app = Flask(__name__)
  278. @app.route("/")
  279. def hello():
  280. return "hello"
  281. if __name__ == "__main__":
  282. app.run()
  283. 実行
  284. ::
  285. % python hello_flask.py
  286. * Running on http://127.0.0.1:5000/
  287. - 127.0.0.1
  288. - しょうがないのでソースコードを読んでみる
  289. ----
  290. Flask class
  291. -----------
  292. .. code-block:: python
  293. def run(self, host='127.0.0.1', port=5000, **options):
  294. """Runs the application on a local development server. If the
  295. :attr:`debug` flag is set the server will automatically reload
  296. for code changes and show a debugger in case an exception happened.
  297. 何も考えていなさげ
  298. .. code-block:: diff
  299. @@ -9,5 +9,5 @@ def hello():
  300. return "hello"
  301. if __name__ == "__main__":
  302. - app.run()
  303. + app.run('::')
  304. host引数を与えてみた
  305. ::
  306. % python hello_flask.py
  307. * Running on http://[::]:5000/
  308. **IPv6で使えるようになった**
  309. ..
  310. - Pyramid
  311. - https://docs.pylonsproject.org/projects/pyramid/1.1/index.html
  312. ----
  313. まとめ
  314. ------
  315. もっと生産的な意見を提示しようと思っていたんだけれどPython界は思ったより平和でした
  316. ただし油断しているとIPv6は **オウトオブ眼中**
  317. - **どのレイヤーで問題が起こるかわからない** ので必要なときには専門外のソースコードにもダイブする勇気を
  318. - 同じ問題意識を共有し世界のサービスがギャーってならないといいですね
  319. - 余裕があれば啓蒙活動をしましょう
  320. - 今回の例は氷山の一角でIPv6が広く使われはじめたら何が起こるか分かりません
  321. - ネットワーク屋が言う動くを真に受けすぎるとやられる可能性大
  322. - さしあたり LSN or CGN でインターネットのギャーありそう
  323. - Ajax使ってるサービスはNAPTのテーブル溢れさせる可能性高い
  324. ----
  325. 宣伝
  326. ----
  327. キネクトハッカーズマニュアル
  328. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  329. .. image:: kinect_cover.png
  330. - 発売日 / 8月25日
  331. - 定価 / 2480+
  332. - @hagino3000 に誘われて査読
  333. - すみにちょろっと名前が(ry