156 Views
February 23, 13
スライド概要
iPhone 5 の Wi-Fi ちゃんと動いてましたか? 自分は使えていませんでした。しかも iPhone 5 購入直後から。そんなお話を、2013/02/23 に横浜馬車道で開催された yidev 横浜 iPhone 開発者勉強会でお話してきました。せっかくの開発者のみなさんなので、後半はネットワークの基礎についてを主軸にしつつ。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 4,073 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
iPhone 5 の Wi-Fi まし ちゃんと動いてますか︖ た 〜 なぜか噂にもならなかった身近なお話 〜 EZ-NET 熊⾕友宏 @EasyStyleGK http://program.station.ez-net.jp/
iPhone 5 の Wi-Fi、ちゃんと使えてましたか︖ 自分は使えていませんでした。 しかも iPhone 5 購入直後から。
新しくなった App Store を眺めていると … • 一覧が出るのに数分以上、待たされる。 • 数回に 1 度、読込が打ち切られる。 きっと iPhone 5 が人気で重いんだろうな〜
ちがいました。 おかしいのは、自分の iPhone 5 でした。 • 他のアプリでも通信エラーが発生 • コネクションロストとは比較的重傷 • そういえば Safari の閲覧も遅い iPhone 3GS さえ問題ないのに! iPhone 4 でも問題ないのに! iPhone 4S なら問題ないのに!
そういえば Wi-Fi だと全般的に遅いかも … • Wi-Fi のときに通信で異常に待たされる • 3G や LTE なら問題ないみたい
ping ツールで調べてみると … 36 bytes from 8.8.8.8 icmp_seq=11 ttl=128 time=3ms 36 bytes from 8.8.8.8 icmp_seq=12 ttl=128 time=3ms Request timeout for icmp_seq 13 実に ping パケット 70% 消失︕ Request timeout for icmp_seq 14 ※icmp_seq=15 ただし Wi-Fi に限る 36 bytes from 8.8.8.8 ttl=128 time=3ms Request timeout for icmp_seq 16 : : --- 8.8.8.8 ping statistics --578 packets transmitted, 178 packets received, lost 69.3%
もしかして⾃分だけ︖ ツイッターで問いかけてみる 誰も噂にもしない … インターネットで調べてみる Wi-Fi の暗号化が AES だと、 Wi-Fi が切断されてしまう人は居る様子 でも、今回の現象とは違うみたい
おっと、反応がありました。 どうかされましたか? iPhone 5 の Wi-Fi 通信で ping パケットが消失します! ping って iTunes の ping サービスのことですか? ?
気を取り直して … iPhone 5 で Wi-Fi 通信が できません。 同じ LAN の Windows と 通信できません。 契約しているプロバイダを 教えてもらっていいですか? ? とりあえず、ありがとうございます!
しかし、これは困りました。 EZ-NET IP Phone iPhone をひかり電話子機にするアプリ 自宅ではいつも EZ-NET IP Phone で iPhone を NTT ひかり電話の子機にして使っているので、 Wi-Fi が使えないのは極めて不便です。 ※ ステルスマーケティング
問題を整理してみる
問題を整理すると … Wi-Fi 接続で通信エラーが多発する • Windows 7, 8 が相手だとパケット消失 (Windows XP が相手なら正常) • NOPPHIX 5.3.1 (Kernel 2.6.24.4) も異常 • Mac 相手の通信だと正常♪
問題を整理すると … ルータ相手でも機種によって通信エラー • PCI MZK-RP150N だとパケット消失 • FON2405E だと Wi-Fi から即切断 • BUFFALO AG54 は ping がハングアップ • BUFFALO WHR-G301N だと正常 • BUFFALO WHR-G300N だと正常 • Apple Time Capsule 相手だと正常♪
⼤事なこと ルータ相手の通信がダメなので、 NAPT を使うと、その先の通信は全滅。
もうひとつ⼤事なこと これらの障害は どれも iPhone 5 でだけ発生する ということ。
パケットキャプチャで調べてみると … iPhone 5 から通信を始めるとき Windows さん、 どこに居ますか? ここにいますよ。 そちらに居ましたか。 パケット送りますね。 パケット来た! ここまでは OK ︕
パケットキャプチャで調べてみると … Windows が返信パケットを返すとき さて iPhone 5 さんに お返しのパケットを送ろう … iPhone 5 さん、 今はどこに居ますか? 今は面倒だ。 無視! あれ、居なくなってる! パケット送れない!! なんと iPhone 5 が無視を決め込む︕
パケットキャプチャで調べてみると … でも Mac からの問いかけには iPhone 5 さん居ない。 困ったなぁ … 無視、無視。 iPhone 5 さん、居ます? !!! ここに居るよ〜! Apple 同⼠だと仲がいいのね。
他で語られない不思議 他の人でも遭遇しそうな問題なのに、 なんで騒がれていないのだろう … ⾃分の iPhone 5 だけの不具合なのか…
ちがった︕ そんな頃合いに 我が家に訪れた iPad mini。 いきなり、同じ問題が発⽣︕ iPad 1 ではこの問題は発⽣しないので 新型 iPhone & iPad 共通の Wi-Fi の不具合では︖
解消⽅法
問題の解消⽅法 2013年1月29日までは … 1. iPhone 5 を再起動する – ただし、数日後には再発 2. 通信相手の ARP テーブルに iPhone 5 の MAC アドレスを登録する – NAPT ルータに登録できれば、 それ以降の通信全てを正常化可能
問題の解消⽅法 でも、これからは … iOS 6.1 にアップデートする きっと、ただそれだけ iOS 6.1 にアップデートしたのを境に、 今のところ問題は発生していません。
ここからが本題 せっかくの開発者な皆様なので もう少し踏み込んでみたいと思います。 開発の役に立つかは判りませんが!
知ってる⼈なら知ってる ネットワークの基礎のおはなし
ping ってなに︖
ping とは • ICMP プロトコルを使い、ネットワーク上 のある宛先に到達可能か調べる仕組み。 • Echo Request を送信し、Echo Reply を 受け取ることで、到達できると判断する。 • ICMP は OSI 参照モデルの第3層「ネッ トワーク層」に位置するプロトコル。 言葉で語ると小難しいですが …
ICMP Echo Request-Reply やることはこれだけ Echo Request パケット送信 IP Echo Reply パケット送信 IP • Request は IP アドレスで宛先を指定。 • Reply は送信元 IP アドレスへ返信。 • 送信元が Reply を受け取ったら終了。
ICMP Echo Request-Reply 到達不能と見なされる場面 Echo Request パケット送信 IP しばらく待ったけど Reply ないから、 相手はきっとオフラインだな … • Request を送ってしばらくしても返答が なければ、相⼿が落ちていると⾒なす。 • タイムアウト制。
ping で判ること • 宛先から返事があるかどうか。 • 普通は、返事を返してくれる約束。 • ただし、返してくれない場合もある。 iPhone 5 も返事を返してくれませんでした。
OSI 参照モデル ICMP プロトコルの位置づけ的には HTTP とか いろいろ 有名な TCP や UDP IP とか ICMP ARP とか Ethernet 物理的な 配線とか 第7層 アプリケーション層 第6層 プレゼンテーション層 第5層 セッション層 第4層 トランスポート層 第3層 ネットワーク層 第2層 データリンク層 第1層 物理層
実際のネットワークに照らし合わせると 第4層 トランスポート層 TCP や UDP で機器に直接アクセス 第3層 ネットワーク層 IP アドレスを使って相手を特定 複数のLAN を直通運転(ルーティング) 第2層 データリンク層 MAC アドレスで相手を特定 ひとつのネットワークを形成(LAN) 第1層 物理層 機械的なネットワークのつながり 有線や無線で電気的に繋がっている ソケット(IP アドレスとポート番号)で相手を特定
階層構造のメリット 自分より下の階層は 意識しなくていい! TCP や UDP で通信するプログラムを作っているとき、 MAC アドレスなんて考えたこともなかったはず。
下の階層がそれ以下の通信をやってくれる きた♪ “192.168.1.11” さんの “80” 番ポートへアクセスしよう … IP: 192.168.1.11 Port: 80 IP: 192.168.1.1 MAC: 8C-7B-9D-34-53-32 この宛先へ 送信お願い︕ このソケット宛に 荷物届きましたよ。 第4層 トランスポート層 第4層 Port: 80 IP: 192.168.1.11 この IP へ 送信お願い︕ 第3層 ネットワーク層 この IP 宛に 荷物届きましたよ。 この IP アドレスは あっちの LAN に居るのか … 第3層 自分より下の階層の動きを 知らなくて済むのがメリット 第2層 データリンク層 第2層 この IP へ 送信お願い︕ 電送お願い︕ 第1層 物理層 この IP は… あの MAC の機器が持ってるのか … Mac アドレスのタグをつけて…と。 あ、うちの MAC 宛だ︕ Port: 80 8C-7B-9D-34-53-32 IP: MAC: 192.168.1.11 電送︕ あ、 何か来た︕ 第1層
実際にはもうちょっと複雑 PC PC ルーター 第4層 トランスポート層 スイッチング HUB 第4層 トランスポート層 第3層 ネットワーク層 第3層 ネットワーク層 第3層 ネットワーク層 第2層 データリンク層 第2層 データリンク層 第2層 データリンク層 第2層 データリンク層 第1層 物理層 第1層 物理層 第1層 物理層 第1層 物理層
ICMP は第3層の通信だから … Echo Request 送信♪ IP ネットワークの根本部分が 正常に機能しているか検証するのに役⽴つ 第4層 第4層 トランスポート層 トランスポート層 Echo Reply しなくちゃ︕ 第3層 ネットワーク層 第3層 ネットワーク層 第3層 ネットワーク層 第2層 データリンク層 第2層 データリンク層 第2層 データリンク層 第2層 データリンク層 第1層 物理層 第1層 物理層 第1層 物理層 第1層 物理層
ところで、この部分 … IP: 192.168.1.11 Port: 80 IP: 192.168.1.1 MAC: 8C-7B-9D-34-53-32 この宛先へ 送信お願い︕ 第4層なぜ、IP トランスポート層 第4層 を指定するだけなのに、 第2層で MAC アドレスが判るのでしょう。 第3層 ネットワーク層 第3層 この IP は … あの MAC の機器が持ってるのか … Mac アドレスのタグをつけて…と。 第2層 データリンク層 第2層 第1層 物理層 第1層
そこで登場するのが ARP Address Resolution Protocol
ARP とは • IP アドレスを使って、それに対応する MAC アドレスを検索する仕組み • 対応する MAC アドレスを取得することで、 その機器がどこに繋がっているかが判る • OSI 第2層(データリンク層)の機能
やることは簡単 第2層 データリンク層 M あ、私だ! はい! M この IP 持ってる人、 私に返事して! AC AC いた! 違う〜 違うなぁ • 所属する LAN 全体に、指定した IP アドレス を持っている⼈が居ないか尋ねる。 • 指定された IP を持っている⼈が返事をする。
居ない場合はもちろん … 第2層 データリンク層 M この IP 持ってる人、 私に返事して! 違う〜 AC いない! 違う〜 違うなぁ • しばらくしても誰も返事を返さないと、 その IP アドレスは存在しないものとされる。 • タイムアウト制。
今回の発端の問題もここでした Windows が iPhone 5 を探すけれど … 第2層 データリンク層 M あ、自分だけど、 知〜らないっと! この IP 持ってる人、 私に返事して! AC いない! 違う〜 違うなぁ これではどうにもならないですね。
そんな致命的な不具合も … ARP ならソフトウェアの部分だから、 きっと iOS のアップデートで直る日が来るはず。 そう信じていたら、ついに2013年1月29日 iOS 6.1 で解消されました! たぶん、ですけど。
めでたし めでたし
ところで そもそも同じ LAN 内に居ない相⼿の MAC アドレスはどうやって探すのでしょう。
答え 探しません。 ディフォルトゲートウェイに丸投げします。
ディフォルトゲートウェイとは • IP ネットワークで、宛先が同⼀ネット ワークではない場合の送信先 • ディフォルトゲートウェイが適切な宛先へ 転送してくれる • 通常、ディフォルトゲートウェイは 複数の LAN が乗り⼊れるルーター ネットワーク管理者があらかじめ用意してくれている
こんなとき、ディフォルトゲートウェイ この IP に送信したいな。 あ、でも同じネットワークじゃないや … ARP で聞いても無駄だな。 ディフォルトゲートウェイさん、 転送お願い︕ この宛先の IP は、 ここのネットワークのアドレスだな。 承知した。 この IP 宛に パケット来てるぞ! では送る。 私宛てだ︕
これが無数に集まって、インターネット 送信 OK!
ところで そもそもどうやって、その宛先が 同じネットワークじゃないことを知るの︖
答え サブネットマスク を使います。
サブネットマスクとは • IP アドレスのクラスを決めるマスク値 • クラスによって、IP アドレスのうちの どこまでがネットワークアドレスか決まる • ネットワークアドレス部分が同じ場合、 その IP アドレスは同じネットワークに在る ネットワーク管理者があらかじめ用意してくれている
IP アドレスとは 例えば 192.168.100.129 • IP ネットワークで機器を特定するアドレス • 8 ビットを 4 セットで表現する。 • ネットワーク部とホスト部で構成される。 • 今時は、どこがネットワーク部に当たるかは サブネットマスクによって決まる。
サブネットマスクとは 例えば 255.255.240.0 • IP アドレスのネットワーク部とホスト部の 境⽬を知るのに使うマスク値 • 32 ビットを通して、左から 1 が続き、ある 場所を境に、その右は全て 0 が続く。 • 1 に当たるところがネットワーク部。 0 に当たるところがホスト部。
サブネットマスクの値 サブネットマスクの値は ネットワーク構築時に既に決まっています。 ネットワーク管理者があらかじめ各機器に設定する
サブネットマスクの 使い⽅を⾒て⾏きます。
IP アドレスとサブネットマスク IP アドレス 192.168.100.129 サブネットマスク 255.255.240.0 この IP アドレスの ネットワーク部とホスト部を計算してみます。
IP アドレスを2進数に直すと IP アドレス 192.168.100.129 は … 1100 0000 1010 1000 0110 0100 1000 0001 サブネットマスク 255.255.240.0 は … 1111 1111 1111 1111 1111 0000 0000 0000 ここがネットワーク部 ネットワーク部は ここがホスト部 (マスクビット 0 の部分を 0 で埋めて) 1100 0000 1010 1000 0110 0000 0000 0000 ホスト部は (マスクビット 1 の部分を 0 で埋めて) 0000 0000 0000 0000 0000 0100 1000 0001
これを 10 進数に整えると ネットワーク部は 1100 0000 1010 1000 0110 0000 0000 0000 192 . 168 . 96 . 0 これがネットワークアドレス ホスト部は 0000 0000 0000 0000 0000 0100 1000 0001 1,153 これがネットワーク内でのホスト番号
同⼀ネットワーク 同一ネットワークというのは … ネットワーク部が同じ IP アドレスのこと ⾃分の IP と、宛先の IP アドレスを、 ⾃分のサブネットマスクを使って、 同⼀ネットワークにあるかを判断しています。
サブネットマスクの表記 サブネットマスクには いくつかの表記⽅法があります。 8 ビット毎の数値を記載する⽅法 192.168.100.129/255.255.240.0 ビットが 1 になっている個数を記載する⽅法 192.168.100.129/20
こんな事柄を組み合わせながら、 ネットワークは作られています。 まだまだ、 ネットワークの世界は広いですけど。
今回の iPhone 5 の Wi-Fi がおかしい原因も こんな知識を使って追いかけてました。 知っておくと、いつかどこかで 何かのときに役に⽴つかもしれません。
以上 ネットワークに関する 基本的な知識でした。