【追記あり】 モバイルインターネット環境の通信速度を TCP BBR が有効な ShadowsocksR で10倍速にする

追記 kazuho さんからの指摘いただいた通りTCP BBRアルゴリズムがモバイル環境の通信速度向上に影響を与えているわけでは無く、キャリア/ISPが制御している回線(本記事ではIIJmio回線)を、BBR+SSRという特殊なコネクションにより、トラフィックシェイピングの挙動を変えてしまい*1、そのため帯域幅が増えたと推測されます。この利用方法では、TCPの公平性に悪影響を与えてしまう行為になる可能性があり、一般良識の範囲内で試すなど、定常的な利用は控えた方が良いでしょう。

さらに追記

モバイルキャリアのボトルネック測定をすることによって、TCP輻輳制御の公平性に悪影響を与えてしまっているかどうか観測できそうです。


まずこの結果を見て欲しい。同じ時間・場所に、同じ端末、同じ回線(IIJmio タイプD)測定した、fast.com のインターネット速度の結果だ。

f:id:secondlife:20190413171835p:plain

ダウンロード速度が片方は約4Mbps、片方は48Mbpsだ。約12倍差である。違いは一つ、TCP BBR が有効な ShadowsocksR (以下SSR) サーバを経由している*2か、である。他にも同時間帯にいくつかのネットワーク回線速度のサイトで速度測定してみたが、軒並み5-12倍ぐらい速い速度だった*3

IIJmioを含む、いわゆる格安MVNOは時間帯によって速度が異なるが、昼時の通信が集中する時間帯はSSR未接続時0.5-0.7Mbpsな速度が、SSR接続時は3〜6Mbpsと、五倍以上の通信速度が出た。また夜の格安MVNOでも高速な速度が出る時間帯も、SSR未接続時は30Mbpsな通信速度がSSR接続時は50Mbpsと、2倍弱ぐらいの速度が出た。

f:id:secondlife:20190419232424p:plain

上記画像は、昼時の iPhone 7 での速度測定。MVNO回線での通信速度向上を一番体感できるのが昼時で、0.5Mbpsな速度だと、様々な画像表示が遅く感じ、例えばニュースアプリを見るとサムネイルがなかなか表示されないが、3Mbpsあると大分ましな速度で表示される。

TCP BBR とは

TCP BBR ( Bottleneck Bandwidth and Round-trip propagation time ) とは、Google が開発した輻輳制御アルゴリズムだ。輻輳制御の新アルゴリズム TCP BBR を GCP に導入 の「BBR とは何か 」の項に詳しい説明が載っているが、TCPスループットの向上・レイテンシの低減が大きなメリットだ。

実際に私も、MacのNetwork Link Conditionerを使い、パケロスと高レイテンシ環境をシュミレートし、通信を行ったところ、サーバのLinuxカーネルがBBRを利用しない設定と比べ、サーバのLinuxカーネルをBBR有効にした環境では、iperf での単純なネットワークテストも、約1.5倍〜2倍速とネットワーク速度の向上が確認できた。

この BBR は、高レイテンシやパケットロスが発生しうるような通信が不安定な環境だと大きく速度改善するため、モバイル回線もこれに該当する環境が想定されるため、モバイル回線のスマートフォンにも適用してみた物が冒頭のモバイルインターネット速度の向上だ。

さてこのTCP BBRの通信を、手元のスマートフォンのモバイルネットワークに手軽適用するにはどうするか、一つの解が SSR を使うことである。

Shadowsocks / ShadowsocksR とは?

中国のグレートファイヤーウォール(以下GFW)を問題無くすり抜けるため、中国のエンジニアが作った、SOCKS プロキシの上で暗号化通信を行う技術・実装が Shadowsocks だ。Shadowsocks にさらに暗号化方式の追加や、難読化手法を追加し、改変した物が ShadowsocksR (以下 SSR) である。

GFWを超える為の様々な技術が詰め込まれ、一般的な TCP パケットと判別をつけることが難しく、2019年4月現在、中国国内から安定したGFW超えが出来ている*4。2018年夏ごろから、以前にも増してVPN通信への規制が強化されたが、SSR は今のところ安定した通信が出来ている。また、Shadowsocks / SSR クライアントは更新される ACL + ブラックリストもしくはホワイトリストにより、例えば中国国内のネットワークやドメインへは直接SSRを通さず接続し、中国国外への接続のみSSR経由の通信をするなど、中国国内で快適に使える機能が多々実装されている。

なお、中国のエンジニアで、Shadowsocks の開発者である Clowwindy 氏や、SSR 開発者の breakwa11 氏は、中国当局の介入が入ったとされ、現在は開発を行っていない。この話しは、一つのコードが中国のインターネットを変えた | Shadowsocksに纏わるストーリー にとてもよくまとまっているので、興味がある方は読んでみてほしい。

SSR のメリット

SSR は、一般的にはGFWを回避するコンテキストによって語れるが、GFW 回避技術や暗号通信以外にも、以下のメリットがある。

  • VPN のように、OS 上のほとんどの通信を SSR 上の通信経由にすることが出来る
  • サーバへの接続がとても速い。モバイル端末からでも2〜3秒で接続できる
  • 各種 OS から一般ユーザが簡単に利用できるクライアントが充実している
  • 設定がQRコード経由で配布できるため、利用ユーザの設定がとても楽。設定をQRコードとして表示できる機能を持っているクライアントアプリも多いため、例えば Mac で設定した SSR の設定を、QR コード読み取りで AndroidiOS で簡単に利用できる

Shadowsocks / SSRオープンソースで開発されていることもあり、各種プラットフォームのエコシステムがとても充実しており、一般ユーザも利用しやすい環境が整っている。なおデメリットとしては、アップロード速度は遅くなることが多かったり、大本の通信が快適なときはかえってレスポンスが悪くなったり、一部アプリの通信では SOCKS プロキシ経由ではうまく動かなかったり等もある。

BBR + SSR サーバの構築方法

TCP BBR の利用には Linux カーネル 4.9 以降がサポートされていればよい。そのため最近のディストリビューションでの導入は簡単だろう。例えば Ubuntu 16.04 LTS でも、カーネルイメージのパッケージを apt で更新して再起動し、sysctl でカーネルパラメータを変更すれば利用が可能だ。Raspberry PI の Raspbian OS も2019年4月のバージョンではカーネル 4.14 なので導入が出来る。

また、BBR の有効化から、SSRサーバの構築は Teddysun 氏が公開している BBR や SSR のインストールスクリプトを利用すると、非常に簡単に導入できるだろう。

の記事では、Raspberry PI への導入と、SSRサーバの設定・コンフィグを一部解説している。上記記事の方法で、 Ubuntu 16.04 / 18.04 LTS なサーバでも BBR + SSR サーバも構築してみたが、簡単に構築出来た。

SSR クライアントからサーバに接続する

SSR クライアントは(Android以外は)たくさんあるので、好きな物を利用すれば良いと思うが、私は iOSShadowrocket を、MacOSShadowsocksX-NG を、AndroidSSRR を使っている。

基本的に複雑な設定はいらず、簡単に設定することが出来るだろう。

おわりに

本エントリーでは、モバイル回線 + スマートフォン環境からも、基本的な通信を SSR を通して BBR を有効なサーバを通すことで、通信が大幅に高速化できる事例を紹介した。MVNOキャリアの回線速度上限に縛られると思っていた速度が、TCP 輻輳制御アルゴリズムの変更で高速化されるとは、今まで知っていた感覚と違っていたので驚いた。

GCP を初め、BBR が有効なサーバ環境が今後増えてくれば、ネットワーク全般の速度が向上し、今後は不要になっていく方法だとは思うが、今現在は SSR + BBR 利用で通信速度向上の恩恵を、取りわけMVNO回線混雑時は受けることができると思う。また BBR + SSR なサーバは Linux を使える人なら簡単に構築出来ると思うので、興味ある方は試してみると面白いと思う。Tokyo リージョンもある VPSVultr VPS は、今紹介リンク経由で登録すると、50$分のクーポンが貰えるので、VPSでカジュアルにSSRサーバを試してみる事も出来る。

謝辞

SSRについて調べていたとき、QiitaのGoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる の記事を読んで、中国本土→日本へのネットワーク速度の向上のみならず、日本のモバイル環境でも高速化する可能性があるのでは?と思って設定・測定してみたので、記事主の fallout 氏に感謝です。

おまけ

回線測定をたくさんした結果

二日でモバイル帯域を7GBぐらい使ってしまった…。

f:id:secondlife:20190413182356p:plain

*1:そのため、cubic + SSR 環境では速度向上は発生しません

*2:そのため、片方は右上にVPN接続時に表示される鍵アイコンが出ている

*3:計測値は東京、SSRサーバは、東京と大阪で、計測先の fast.com や Google スピートテスト (mlab) は大阪もしくは東京経由の転送の模様

*4:ただ、SSRサーバへ、分散したIPから大量のネットワーク接続が一極集中で行われるなど怪しいと判断された場合、通信の内容は関係なく、ネットワーク通信自体が規制される場合もある

すべてが電子決済出来る街、深セン

2016年10月に開かれた、ニコ技深セン観察会第6回に参加し、深センに行ってきた。

深センの有名な電気街、華強北(ファーチャンペイ)は秋葉原の何倍も広く、沢山のお店で安価な商品が大量に並んでいて、よく解らない面白ガジェットやおもちゃも売られ、街中ではドローンが飛んでいるような街、と話には聞いていたが、実際に行ってみると、まんまその通りだった。またハードウェアスタートアップのエコシステムとしての深センも、これだけ様々なヒト・モノ・工場等々が集まっていると、ものすごい速度で開発が進んでいくんだろうな、という漠然とした熱量を感じることができた。

f:id:secondlife:20161107075334j:plain

(ファーチャンペイのビルの一角。このようなビルが無数にある)

しかしながら、個人的に一番衝撃的だったのは、きちんとした商店から、コンビニ、チェーン飲食店、電気街の小さなスペースお店、一つ1~3元*1で売っている路上の屋台まで、すべての店で電子決済が出来ることであった。

(すべての店でWeChatペイ(微信, ウェイシン)用のQRコードが並んでいる)

WeChat の圧倒的シェア

電子決済のプラットフォームはいくつかあるが、その中で深センの街中では一番シェアがある、WeChatペイを使って過ごした。

WeChat は、中国三大Webサービス企業、バイドゥ、アリババ、テンセントのうちの一社、テンセントが提供しているメッセージングを中心としたサービスである。テンセントは、1998年に創業され、当初はICQの模倣サービスであるQQを運営し、メッセージングを中心に、ポータルサイト、ブログ、ゲーム、決済、電子マネーマイクロブログ等々で成長してきた企業だ。なおテンセントは香港証券取引所で2016年10月現在、時価総額約26兆円。アリババと肩を並べるアジアトップの企業でもある。

日本で当たり前の様に LINE が使われている様に、そのテンセントが運用している WeChat が中国本土では使われている。ほとんどのスマフォにインストールされており、非常にシェアが高いプラットフォームである。WeChat アプリにはチャットのメッセージング以外にも、様々な機能を内包しており、そのうちの一つがWeChatペイである。

さて、そのWeChatペイを使ってみようかと WeChat アプリを落として使ってみても、WeChatペイのインターフェイスがなかなか見つからない。WeChatペイを使うには、対応している中国の銀行口座を持つか、誰かから WeChatペイ経由で個人間送金してお金を受け取らないと、アクセスしやすいUI上に表示されないのである。

(WeChatのプロフィール画面。決済機能が有効で無いと、そもそも「ウォレット」というナビゲーションが表示されない)

私は中国の銀行に口座を持つ方から個人間送金でお金を受け取っていたため、そのままWeChatペイを使うことが出来たが、誰も知り合いに居ないと利用するハードルがぐっと上がる。

WeChat ペイでどう支払うのか

実際の店でどうWeChatペイを利用するかだが、以下の3パターンに分類された。他にもパターンがあるのかも知れないが、30回ほど支払いした中では、すべてこのパターンで分類された。なお店頭でウェイシン(微信)と言うか、アプリのアイコンを見せるだけで空気読んで WeChat ペイ払いだと、どの店もすぐ解ってくれた。

店舗側コードのスキャン

チェーン店など、ちゃんとしたPOS端末がある店で多いパターン。店舗側のグラフィカルな端末に、商品や価格とともにQRコードかバーコードが表示され、そのバーコードを手元のWeChatアプリから読み取ることで支払いが完了する。読み取り時に PIN の入力か Touch ID による承認が必要だが、Touch ID なら一瞬で終わる。

(コンビニでのPOS端末での表示)

また、購入後はどのパターンで購入しても支払い明細が WeChat に届く。

自分のコードを店舗側がスキャン

自分のWeChatアプリに支払用のQRコードを表示し、店側のPOS端末やスマートフォンから読み取ることで支払いを完了する。なおこの支払用のQRコードは1分間のみ有効。

(ワンタイムQRコード)

(iPhoneならWeChatアイコン長押しでショートカットから即座に起動。なおこちらも決済機能が有効でないと「マネー」の項目は表示されない。)

店舗QRコードをスキャン

自分で店舗のQRコードを読み取り、必要な金額を入力し支払う。店舗側のコードスキャンの場合、読み取るだけで終わるが、こちらの場合は一意な店舗のQRコードを読み取り支払うことが出来る。つまり、店側はQRコード一つを印刷して置いておくだけで、送金が可能なのだ。

例えば、屋台で忙しく果物を切り売りしているおっちゃんに支払うとき、おっちゃんは決済にたいして何か端末を一切操作をすることなく、買い手側が屋台に張ってあるQRコードをスキャン、金額を入力してOKを押しておっちゃんに見せれば決済完了、という流れ。店側に電子的な端末がなくとも、QRコード一枚で買い物が出来てしまうのである。買い手も店側が品物を準備してるときに自分で決済完了でき、待ち時間も短縮できる。

もちろん、巧妙に作られたダミーアプリで、買い手側が購入したように見せかけることも出来るかも知れないが、即座に店側のスマフォで確認可能なことから、少額決済の場合そこまでリスクをおって買うケースは少なそうである。

(道路上の屋台の机の上に置かれたQRコードQRコードをスキャンしてすぐ支払える)

というわけで、深セン滞在中は WeChat ペイを使って過ごしたが、使えないお店は一切無かった。使えない場所といえば、地下鉄などの交通網で利用(Suicaのような非接触型ICである深セン通を使う)ぐらいだろうか。

また、お店で支払いした後、そのままお店を WeChat 上でフォローし、クーポン情報が受け取れるなど、ビジネス上まぁやるよね、という機能も一通り実装されているようだ。

日本では数年間おサイフケータイを使ってきて、非接触型ICによる支払いの便利さは体験してきた。しかしながらすべての店の支払いで使える WeChat ペイには、さらにそれを上回る体験と衝撃だった。

なお、アリババの決済であるアリペイでも支払える店は多かったが、アリペイは使っていなかったので比較することはできない。

何故深センは、すべての決済が WeChat ペイでできるのか

何故深センは、すべての決済が WeChat でできるのか

まず、一つ目の理由として、中国の決済関係のインフラの進化がここ数年だからであろう。アメリカは昔からクレジットカードが普及し、今やほとんどの店でクレカが使えるため、本来はスマフォ世代の UX で便利になるはずであった Apple Pay や Android Pay は大して広まっていない。それよりクレカの方が便利だから。日本や香港では、クレカが決済インフラの中核になり浸透する前に、交通網で利用されてきたFelicaの非接触型ICによる決済の進化が進み、大抵の店では利用が可能だ。こちらもFelicaがいったん広まってしまい、かつ便利なため、今後も利用され続けるであろう。

そんな中、中国ではここ数年で一気にスマートフォンが普及し、かつ店側も専用のPOS端末が必要なく導入できる。店側もユーザ側も、スマフォ一つで簡単に決済できるとなれば、普及も進むはずである。

二つ目の理由として、決済プラットフォームを見越したであろう、WeChat の普及が上げられる。そもそもテンセントは前述の通り、モバイルアプリメッセージングが流行る前から、メッセージング基盤や決済基盤を持っており、スマートフォンの普及と共に WeChat で時代に合わせたサービスをうまく展開したことで、WeChat 上に一大決済プラットフォームを築けたのであろう。

三つ目の理由としては、ある意味実験的な都市である、深センとしての特異性が考えられる。同じ中国でも、北京や上海では、深センほどは WeChat ペイが普及してないと聞く。深センは40年前はただの農村であったが、そこが経済特区となり、人が集まり、短期間に大きく開発が進み、破壊と再生を繰り返しながら進化している。ファーチャンペイの中心の大通りは、すべての道路をぶちこわして交通インフラを止めてでも大規模な地下鉄の開発が行われていた。私が深センについた日はがれきだった道が、帰るときには新しい道路へと整備されていた。働く人も、大抵10~30代の若者だ。そんな混沌とした街だからこそ、今までに無かった物がサッと受け入れられ伝搬しているのではないのであろうか。

追記・深セン在住の方から、紙幣は偽紙幣をつかまされる恐れがあり、電子マネーのほうが信頼がおけるとのこと。なるほど

深センの面白さ、混沌感

このツアーの主催者、高須さんは、深センに来たら一人一人感じる物は違うと言っていた。私も来る前に深センに一番期待していた物は、電気街の面白さだったのだが、実際に来てみると、WeChat ペイがどこでも使えるという体験が一番面白かったし、その背景にある深センの街自体の混沌とした面白さを体感できたのが、一番の価値だったと思う。

しかしながら、少なくとも今の深センの混沌感は、街が進化すればするほど最適化されてしまい、失われてしまう物だとも感じる。あと何年この混沌感が続くかは解らないが、大変面白く興味深いので、一度は行ってみることをオススメしたい。

(ファーチャンペイの大通り、プラザホテル前。ものすごい勢いで壊して作り直している)

*1:1元 = 2016年10月現在、15円強

アドベントカレンダーを電子書籍で読めるサービスを作った

f:id:secondlife:20140111143236j:plain

 

QiitaAdventarATND のアドベントカレンダーがオフラインの電子書籍で読みたい、と思ったので作った。例えば寿司アドベントカレンダーなら、URLを入れて変換すると、readlistsを裏側で叩いて、こんな感じに生成される。

生成後は readlists の機能を使って、iPhone や iPad に送ったり、dropbox に epub を保存したり、その他いろいろな方法で、様々なデバイスで読むことが出来る(※なお readlists の kindle に送る、は一部文字がおかしくなるのでオススメしない)。また Qiita のアドベントカレンダーは、HTML の要素の関係で必要の無い要素も混じってしまっていて、ちょっとごちゃっとしてしまっているが、これは Qiita チームが HTML の構造を綺麗にしてくれれば解決するので勝手に期待!!1

どうぞご利用下さい。なおこのサービスのソースコードはこちら。

サービスの裏側のこと

当初、readlists-anonymous というライブラリを作っていて、これを公開すればいいや、と思ってたのだけど、CUI じゃほぼ誰も使わなさそうなので Web サービス化した。

作ってみたものの飽きそうなWebアプリはherokuで動かしておく - はこべブログ ♨ でも書かれてるとおり、自分の VPS や自宅サーバに作ると何かのタイミングで動かなくなる未来が見えていたのと、最近の heroku 事情はどうなんだろうと使ってみたかったので、と思って heroku でホスティング。

このサービスは裏で readlists を http 叩いていてネットワークIO待ちが発生し、トータルの処理時間に数十秒かかるんだけど、いちいち worker 化するのもめんどうだよなぁ、と思っていたところ、Web サーバに Thin 使って EventMachine 使えるようにしておくと、EM::defer 使ったバックグランド処理が楽に書ける とのことなのでソレで*1。データは消えても問題ないので、memcached(heroku だと今は MemCachier) plugin に進捗の状態なども入れて管理。簡単ワイワイ

また heroku でどうやれば良いんだろう、という問題解決がオフィシャルサイトのドキュメントにかなり載っているため、ググって stackoverflow 見るより、オフィシャルを見た方が素早く解決して素晴らしい感じ。その他も heroku でハマることは一つも無く、サクサク作って行けた。しかも0円、無料です。

Web のデザイン周りは、Twitter Bootstrap, Bootswatch, Font Awesome とそれを CDN でホスティングしてくれる Bootstrap CDN で。favicon も無いと寂しいので、Icon Generator でとりあえず感あふれる favicon を作った。デザインの抽象化・再利用のエコシステムもできあがっていて、大変便利な時代が来てることは知っていたけど、いざ自分が使ってみると便利さが実感できた。

readlists-anonymous のこと

サービスの裏側で使ってる readlists-anonymous はコマンドラインのツールもついているので、

$ gem install readlists-anonymous
$ readlists-anonymous -t example-title http://example.com/ http://test.example.com/
* Created anynymous readlists
share-url: http://readlists.com/8ddbbc9e/
public-edit-url: http://readlists.com/8ddbbc9e2a52458ea0104afed343cb81/
Add http://example.com/
Add http://test.example.com/
...

みたいに、CUI から自分の好きな URL を readlists に登録して使うことも出来る。どうぞご利用下さい。

*1:この方法だと Web サーバの再起動時に処理が止まってしまうので、実行中断時の処理をキチンと入れないとなんだけど入れて無い