KYな雑記帳

個人的なメモ帳

勉強会備忘録:リアルタイム通信技術の基礎知識

Macのトラックパッドは羨ましいなと最近思い始めました。
さて、この記事は 1/21(木)に行われた勉強会に参加した備忘録です。

参加した勉強会は下記リンクの、ネイティブアプリエンジニアが知っておくべきリアルタイム通信技術の基礎です。
atnd.org

モバイルにおける通信特性

  • キャリアにおける通信制限がある
    • 128kbps
  • 混雑するとさばききれない
  • この辺りを考慮する必要がある

伝送方式

  • サーバ・クライアント方式
    • リモート通信
    • 今回の話のメインがこの方式

モバイルの通信プロトコル

双方向通信

  • 双方向通信とは?
    • サーバーからもクライアントからも通信データのやりとり
    • サーバープッシュが手軽にできる
  • 手法
    • Server Sent Event
    • WebSocket
    • RUDP

HTTPにおける双方向通信

  • ワンリクエスト・ワンレスポンスが前提
  • 疑似的な双方向通信にしかならない
  • パケットの肥大化

Websocket通信

  • 純粋な双方向通信を行うためのプロトコルTCP上で動作
  • コネクションは張りっぱなし
  • メリット
    • ヘッダが軽量
    • リアルタイム性が高い
    • サーバ負荷も低い
    • バイナリデータのやりとり

通信データの軽量化

  • MessagePack
    • 高速
    • 多くの言語に対応
      • サーバークライアントの技術選択の幅が広がる

通信データ量が小さいことのメリット

  • キャリアにおける通信制限をすりぬける
    • ダウンロードが走らなければ
    • 画面遷移などは通信制限にかかっていてもスムーズに

リアルタイム通信での同期種類

  • 完全同期型
  • 非同期型
    • 画面レベルが多少ずれていてもOK
    • MMOとか
    • 今回のメイン
  • サーバー集中処理
  • クライアント集中処理

非同期型 サーバー集中処理

  • 1, クライアントでユーザ入力
  • 2. サーバーで入力を解釈
  • 3. サーバーでデータ更新
  • 4. クライアントで結果表示
  • ※クライアント側での不正ができない

クライアント設計

  • クライアントはViewer
  • MVC
  • 例:キャラクターオブジェクト
    • 画面タッチ
    • Controller : 移動命令
    • Model : データで更新
    • View : 通知に応じてキャラクターを動かす
    • サーバー・ユーザ両方の入力に対しても挙動が変わらない

非同期型 クライアント分散処理

  • 1. ユーザー入力
  • 2. クライアント:計算処理、データ表示
  • 3. サーバー:データ更新
  • ユーザーの不正対策が必要
    • 通信の暗号化など

同期種類

サーバー集中

  • 通信切断
    • ゲーム進行は停止しない
  • ゲーム進行
    • 常に通信が必要
  • 処理負荷
    • サーバー

クライアント分散

ホストゲスト方式

  • ホスト端末
  • ゲスト端末
  • サーバー
  • 通信頻度が高い
  • ホスト端末がゲスト端末の入力を解釈して結果を各ゲスト端末に送る
    • ホスト端末の処理負荷が高い
  • ホスト端末がネットワークから切れた時の対処が必要

全ホスト方式

  • 全端末がホスト
  • サーバー
  • ゲームの結果は同期せずに入力を各端末に送り、各端末で入力の解釈・処理を行う
  • 通信頻度が低い
  • 1ホストに環境が依存しない
  • 結果の同期ずれは??
    • 入力に対して常に同じ結果が生じるようにする
      • 乱数シード値を共有する

感想

  • 全ホスト方式というのは初めて聞いた。
  • ホストゲスト方式と全ホスト方式はユーザーからしたらどっちが安全に働くのだろうか、という疑問