[iOS 8] NSURLSession で SPDY がサポートされました!

2014.09.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NSURLSession が SPDY をサポート

iOS 8 / OS X Yosemite より、NSURLSession で SPDY(スピーディ) プロトコルがサポートされました。 これまで SPDY プロトコルで通信するには CocoaSPDY などのような OSS を利用する必要がありましたが、iOS 8 / OS X Yosemite からは OS レベルでサポートされているため、Safari や UIWebView (または WKWebView) による通信処理でも SPDY プロトコルで通信できるようになりました。

ということで、下記サイトの「What's New in Foundation Networking」をベースに、iOS 8 / OS X Yosemite で 利用できる SPDY プロトコルについての基礎知識をまとめてみました。

https://developer.apple.com/videos/wwdc/2014/

SPDY とは?

さて、まず始めに SPDY とは何なのかおさらいしましょう。SPDY の概要について、Wikipedia から抜粋しました。

HTTPを拡張し高速化を目的としたプロトコルである。TLS接続の上にセッション層を追加し、単一のSPDYセッションで複数のリクエストを送受信する。さらに、ブラウザがページを表示する際、付随するデータの先読みを行う機能も追加している。セキュリティ機能も強化する。プロトコル的にはTLSの拡張仕様の一つであるApplication-Layer Protocol Negotiation(英語版) (ALPN) をベースにしているため、HTTPSを使っての通信が必須である。 2013年現在は、独立したプロトコルとして一部のWebブラウザやWebサーバで実装が進んでいるほか、IETFのドラフトも提出されており、標準化作業が進んでいる。

SPDY - Wikipedia

SPDY は Google が提唱した、現在標準化が進められている通信プロトコルの1つです。従来の HTTP 通信の問題点(無駄であり非効率な部分)を改善し、通信時間を短縮することが第一の目的として生み出されました *1

SPDY は HTTP を完全に置き換え、全く新しい仕組みを提供するものではありません。SPDY は、HTTP のアプリケーションレイヤーと TCP トランスポートレイヤーの間に新しくセッションレイヤーを割り込ませて、データの送受信をコントロールする仕組みになっています(下図を参照)。そのため、既存の Web コンテンツやネットワーク構成などには影響しません。

spdy

このセッションレイヤーは、複数のリクエスト/レスポンスのやり取りが行える機能が提供されています。これにより、SPDY を使った通信では、単一の TCP 接続で複数のリクエスト/レスポンスのやり取りが可能です。

さらに大きな特徴として TLS (SSL) と組み合わせることで SPDY 非対応のクライアントに対しては HTTP を提供できる点が挙げられます *2。つまり、iOS アプリ用の API サーバーやスマホサイト用の Web サーバーを SPDY に対応した場合、iOS 8 未満のデバイスからでもそのまま通信が行えるということです。

SPDY の特徴をまとめると次のようになります。

  • Web をより速くするための新しいプロトコル
  • HTTP/2.0 ドラフト仕様のサーバーで動作
  • 単一の TCP 接続で複数の HTTP メッセージの交換が可能
  • TLS (SSL) と組み合わせることでプロトコルを自動選択 (SPDY or HTTP)

SPDY を体感してみよう

iOS 8 で初めて採用された SPDY ですが、真新しいプロトコルではありません。既に多くの Web サービス / Web サイトでも実用化されており、日常的に利用されています。

SPDY に対応しているブラウザ

SPDY に対応しているブラウザは次の通りです。

ブラウザ 対応プロトコル 備考
Google Chrome SPDY/2, SPDY/3, SPDY/3.1
Mozilla FireFox SPDY/2 (11以降), SPDY/3 (15以降), SPDY/3.1 (27以降) 28 以降で SPDY/2 のサポート終了
Safari SPDY/2, SPDY/3, SPDY/3.1 (いずれも8以降) Mac OS X Yosemite または iOS 8 以降
Internet Explorer SPDY/3 (11以降) Windows 8.1 のみ (Windows 7 は未対応)
Opera SPDY/2, SPDY/3, SPDY/3.1 (いずれも12.10以降)
Android ブラウザ SPDY/2, SPDY/3, SPDY/3.1 (いずれも3.0以降)

Chrome の場合は、検索バーに「chrome://net-internals/#spdy」と打つと SPDY 通信を利用したセッションの一覧が確認できます。また、拡張機能「SPDY Indicator」をインストールすると SPDY 使用時に検索バーに稲妻マークが表示されるようになります。

spdy-indicator

SPDY に対応しているサイト

SPDY に対応しているサイトは、Google はもちろん、Twitter や Facebook などの大手も対応しています。

iOS 8 / OS X Yosemite で SPDY で通信するには

iOS 8 / OS X Yosemite と SPDY 通信するには SPDY/2, SPDY/3, SPDY/3.1 に準拠したサーバーである必要があります。また、NSURLSession で透過的にサポートされているため、クライアント側では特別な実装は必要ありません。

まとめ

モバイルデータ通信はとにかく速さを重視したいはずなので、iOS 8 が全面的にサポートしたということは非常に嬉しい限りです。これから作るサーバも、既存のサーバーも、ぜひ SPDY に対応させたいところですね。

参考

脚注

  1. 環境によっては逆に遅くなる場合があるという問題も潜んでいます。
  2. TLS (SSL) と組み合わせる前提であれば、SSL が必須になります。