Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WiFi Direct + VpnServiceでsim無しAndroidをweb世界に社会復帰させる話

4,290 views

Published on

Android+WiFiDirect+VpnService

Published in: Mobile
  • Be the first to comment

WiFi Direct + VpnServiceでsim無しAndroidをweb世界に社会復帰させる話

  1. 1. WiFi Direct + VpnServiceでsim無し Androidをweb世界に社会復帰させる話 空中清高 @soranakk
  2. 2. 空中 清高 @soranakk 所属:株式会社ディー・エヌ・エー オートモーティブ事業本部 MOV Androidアプリエンジニア
  3. 3. 背景
  4. 4. Android端末2台 1台はSIM刺さってる 1台はSIM刺さってない SIM刺さってない端末でHTTP通信する 環境
  5. 5. WiFi Direct Android device間でP2P通信ができる 前提1
  6. 6. VpnService AndroidでVPNを繋ぐときに利用する 外部通信用のPacketが全て流れてくる 前提2 VpnService
  7. 7. Android端末2台 1台はSIM刺さってる 1台はSIM刺さってない SIM刺さってない端末でHTTP通信する 環境
  8. 8. え??それテザリングでよくない?? ● SSIDとpassの事前共有 ● 接続端末のセキュリティ ● コスト ● WiFi Directとの共存
  9. 9. WiFi Directの使い方
  10. 10. WiFi Directの使い方 ここに詳しい解説記事があるので、 ぜひ読むとよいと思います! WIFI DIRECTでP2P通信を行う(1) https://techbooster.org/android/device/9960/ WIFI DIRECTでP2P通信を行う(2) https://techbooster.org/android/device/9981/
  11. 11. WiFi Directの使い方(Client) contextからWifiP2pManagerを取得する wifiP2pManagerを初期化してwifiChannelを取得する wifiChannelを使って周囲のデバイスを探索する
  12. 12. WiFi Directの使い方(Client) 結果をBroadcastReceiverで受け取る 4種類のActionがある
  13. 13. WiFi Directの使い方(Client) ・WIFI_P2P_STATE_CHANGED_ACTION WiFi Directの利用可否が変わったことが通知されます ・WIFI_P2P_PEERS_CHANGED_ACTION 接続できるデバイスを検出したら通知されます ・WIFI_P2P_CONNECTION_CHANGED_ACTION 接続状態が変更されたときに通知されます ・WIFI_P2P_THIS_DEVICE_CHANGED_ACTION 自身の状態が変更されたときに通知されます
  14. 14. WiFi Directの使い方(Client)
  15. 15. WiFi Directの使い方(Client) 周囲のデバイス一覧を要求する 結果がPeerListListenerに返ってくる
  16. 16. WiFi Directの使い方(Client) なんらかの方法で接続端末を選んで接続処理を行う
  17. 17. WiFi Directの使い方(Client) 接続設定を行ってconnectを呼び出す connectの結果はさっきのBroadcastReceiverで受け取る
  18. 18. WiFi Directの使い方(Client) 接続に成功したら接続先(Host)の情報を要求する 結果がConnectionInfoListenerに返ってくる
  19. 19. WiFi Directの使い方(Client) hostのaddressが取得できるので、 あとはSocketを開いてデータをやり取りする
  20. 20. WiFi Directの使い方(Server) Clientとほとんど同じ 1.wifiManager.discoverPeersを呼び出して Clientからの接続を待つ
  21. 21. WiFi Directの使い方(Server) 2.Clientから接続処理が行われると WIFI_P2P_CONNECTION_CHANGED_ACTION が飛んでくる
  22. 22. WiFi Directの使い方(Server) 3.ConnectionInfoListenerでaddressが取得できるので あとはお好きなように
  23. 23. Socketの使い方なんて知らないよ?😅
  24. 24. Socketの使い方(Client) Client側はIP Addressを指定してSocketを開く inputStreamとoutputStreamが手に入るので入出力する
  25. 25. Socketの使い方(Server) Server側はServerSocketを開いて接続されるまで待機 接続後は同じくin outが手に入るので入出力する
  26. 26. VpnServiceの使い方
  27. 27. VpnServiceの使い方
  28. 28. VpnServiceの使い方 VpnServiceを継承したクラスを作る vpnInterfaceを作成するとfileDescriptorが手に入るので これを使って入出力する inputは端末から入力、outputは端末への出力
  29. 29. VpnServiceの使い方 Builderを使ってVpnの設定を行う どの宛先の通信を捕まえるかやDNSサーバーの指定等
  30. 30. VpnServiceの罠1 VpnServiceでaddRoute(“0.0.0.0”, 0)を指定しても DNSパケットはキャッチできない
  31. 31. VpnServiceの罠1 addDnsServer("8.8.8.8")のようになんらかのDNSServer 設定をしておくとキャッチできる
  32. 32. VpnServiceの罠2 パケットが無限ループしてしまう
  33. 33. VpnServiceの罠2 VpnServiceでaddRoute(“0.0.0.0”, 0)を指定すると 全ての通信をキャッチすることになる →VpnServiceの中でのSocket通信でも Socketに流したパケットをまたVpnServiceが捕まえる パケットが無限にVpnServiceの中をさまよう
  34. 34. VpnServiceの罠2 SocketをVpnの対象から外す必要がある
  35. 35. まとめ
  36. 36. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  37. 37. よっしゃ、もう完成したね?😙
  38. 38. HTTPってどうやって動いてるの?🙄 問題1
  39. 39. そもそもHTTPの仕組みを知らない → 流れてくるbyteデータを解釈できない → Packetに分割できない (例)WiFi Directで受け取った829byteに 何個のPacketデータが入ってる? 問題1
  40. 40. HTTP TCP IP HTTPはTCPというプロトコル上で動いている TCPはIPの上位プロトコルの一つ HTTPの仕組み
  41. 41. ・URLのHOSTを抽出 (例)http://host.com/fizz/buzz → host.com ・HOSTからIP addressを解決 ・IP address宛てにTCP通信開始 ・TCP上でHTTP通信を実行 Response 200 OKをもらったら成功 HTTP通信の仕組み
  42. 42. IP addressを元に通信する規格 お互いにuniqueなIP addressを持つ IPの上で様々な通信プロコトルが動く TCP, UDPなど IP
  43. 43. IP Packet IP Header IP Payload IP Packet
  44. 44. IP Packet IP Header IP Payload IP Packet TCP Header TCP Payload TCP Packet
  45. 45. IP Packet IP Header IP Payload IP Packet TCP Header TCP Payload TCP Packet HTTP Data
  46. 46. IP Packet IP Packet IP Header TCP Header TCP Payload
  47. 47. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  48. 48. よっしゃ、もう完成したね?😙
  49. 49. Socketからのデータ足りなくない?🙄 問題2
  50. 50. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  51. 51. VpnService Packetが丸ごと届く JavaのSocket通信 PacketのHeaderが除かれて届く 問題2
  52. 52. JavaのSocketはHeaderの処理を 内部で行ってくれる VpnServiceはHeaderも含め、すべての Packetを入出力する → 無いものは作るしかない Headerが無い
  53. 53. VpnService vs Socket VpnService IP Packet IP Header TCP Header TCP Payload
  54. 54. VpnService vs Socket Socket TCP Payload
  55. 55. VpnService SIM無 WiFi Direct IP Header TCP Header TCP Payload IP Header TCP Header TCP Payload
  56. 56. WiFi Direct SIM有 IP Header TCP Header TCP Payload TCP Payload Socket
  57. 57. WiFi Direct IP Header TCP Header TCP Payload IP Header TCP Header TCP Payload Socket TCP Payload
  58. 58. VpnService SIM無 WiFi Direct IP Header TCP Header TCP Payload IP Header TCP Header TCP Payload
  59. 59. IP Packet Source Address Destination Address Options Payload Header ChecksumTTL Protocol Identification Total Length Flags Fragment Offset Version IHL TOS
  60. 60. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  61. 61. よっしゃ、もう完成したね?😙
  62. 62. HeaderだけのPacketが届くんだけど?😐 問題3
  63. 63. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  64. 64. 3 way handshake TCP接続を確立するときの処理で Headerを使って処理する 問題3
  65. 65. 3 way handshake IP Header TCP Header A B
  66. 66. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  67. 67. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  68. 68. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  69. 69. TCP Packet Flags N S C W R E C E U R G A C K P S H R S T S Y N F I N
  70. 70. TCP Packet Flags N S C W R E C E U R G A C K P S H R S T S Y N F I N
  71. 71. 3 way handshake S Y N VpnService SIM有
  72. 72. 3 way handshake S Y N A C K VpnService SIM有
  73. 73. 3 way handshake A C K VpnService SIM有
  74. 74. よっしゃ、もう完成したね?😙
  75. 75. Packet渡しても動かないぞ?😢 問題4
  76. 76. TCPの応答確認 Packetが正常に送受信できているか 確認する仕組み Headerを使って処理する 問題4
  77. 77. Checksum計算 Packetが正常に送受信できているか 確認する仕組み Headerを使って処理する 問題4
  78. 78. Headerを使って処理する😇
  79. 79. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  80. 80. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  81. 81. Sequence number:送信済みデータ量 Acknowledgment number:受信済みデータ量 3 way handshakeのときに初期値を設定 TCPの応答確認
  82. 82. IP Packet Source Address Destination Address Options Payload Header ChecksumTTL Protocol Identification Total Length Flags Fragment Offset Version IHL TOS
  83. 83. IP Packet Source Address Destination Address Options Payload Header ChecksumTTL Protocol Identification Total Length Flags Fragment Offset Version IHL TOS
  84. 84. IP PacketのChecksumは Header部分のみが対象 Payload部分は確認しない (上位プロコトルに任せる) IP PacketのChecksum計算
  85. 85. Checksumは1の補数という概念を 使って計算する Checksum計算
  86. 86. 1の補数??🙄
  87. 87. ある数の1の補数はビット反転した数 例として2bitの数を考えます 10 の1の補数は 01 11 の1の補数は 00 自身と1の補数との和は必ず 11 になる 1の補数
  88. 88. 1の補数和と繰り上がり 1の補数和は繰り上がりが発生したら、 発生した回数だけ1を足す。 11 + 10 = 01 + 01 = 10 11 + 11 = 10 + 01 = 11 10 + 10 + 10 + 10 = 00 + 10 = 10
  89. 89. 1.Checksumを0にする 2.1の補数和を計算する 3.計算した補数和の1の補数を取る 4.3で計算した値をChecksumにする Checksum計算
  90. 90. 1.1の補数和を計算する 2.計算した補数和の1の補数を取る 3.0になっていればチェックOK Checksumの確認方法
  91. 91. TCP PacketのChecksumは Header + Payload全体が対象 ただし、Headerは擬似Headerに 変換してから計算する TCP PacketのChecksum計算
  92. 92. 擬似Header??😶
  93. 93. TCP Packet Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset
  94. 94. チェックサム計算用TCP擬似ヘッダ Flags0 0 0 Acknowledgment number Sequence number Source port Destination port Options Urgent pointerChecksum Window Size Payload Data offset Source Address Destination Address 0 0 0 0 0 0 0 0 Protocol TCP length
  95. 95. よっしゃ、もう完成したね?😙
  96. 96. MTU設定とByteBuffer 一度の送信で最大どのくらいのサイズの Packetを流すか Headerを使って処理する 問題5
  97. 97. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  98. 98. BUFFER_SIZEを調節することで 間接的に設定できる 問題5
  99. 99. よっしゃ、もう完成したね?😙
  100. 100. IPv4 と IPv6 これまでの話は全てIPv4の話 そもそもIPv6はPacketの形が違う 問題6
  101. 101. IPv4とIPv6のどちらを使うかは動的 おそらくDNSのレスポンスのよいほうを 利用しているような動きをしている 問題6
  102. 102. ドメイン名からIP Addressを解決する UDPを使って通信する DNS
  103. 103. IP通信の上で動くプロトコル TCPと対をなす存在 JavaでのUDPはDatagramSocketを使う もちろんHeaderは無い UDP
  104. 104. もちろんHeaderは無い😭
  105. 105. Port指定は両方ともある UDPには3 way handshakeやSequence numberによる接続確認は無い TCP vs UDP
  106. 106. よっしゃ、もう完成したね?😙
  107. 107. まとめ
  108. 108. WiFi Direct 全体図 VpnService SIM有 SIM無 Socket
  109. 109. Thank you 空中清高 @soranakk

×