Upgrade to Pro — share decks privately, control downloads, hide ads and more …

High-Performance iOS Networking

High-Performance iOS Networking

Talk about building fast networking iOS apps and how to debug them at UIKonf in Berlin on 23 May 2016.

Clay Smith

May 23, 2016

More Decks by Clay Smith

Other Decks in Programming


  1. This talk: tech notes • iOS 9 only (changes in

    iOS 10?) • NSURLSession is assumed (AFNetworking 2.0+) • Not about the absence of a network connection. • No code—focus on the network layer and server-side. Don't block the main thread.
  2. TCP Fast Open Guide • Only for idempotent data (HTTP

    GET) • Needs Linux Kernel v4.1 • https://developer.apple.com/videos/play/ wwdc2015/719/ • http://devstreaming.apple.com/videos/wwdc/ 2015/719ui2k57m/ 719/719_your_app_and_next_generation_net works.pdf?dl=1 (Implementation details)
  3. Full TCP + TLS handshake Device Server Data Transfer {

    Round trip 1. SYN 2. SYN/ACK 3. ACK { { TLS, +2 RTTs Cool demo (browser-based): https://tls.openmirage.org/
  4. Use a CDN if possible TLS tuning for iOS (server-side)

    Reduce RTTs (False start, session resumption) Coming soon (?): TLS 1.3 Visit istlsfastyet.com https://developer.apple.com/library/ios/qa/qa1727/_index.html
  5. TCP Multiplexing in HTTP/2 Device Server* Connection closes Connection opens

    https://blog.newrelic.com/2016/02/09/http2-best-practices-web-performance/ *TLS Required
  6. Nice H2 features Header Compression (HPACK) Server Push (not supported

    on iOS... yet) Stream Priorities (not supported on iOS)
  7. HTTP/2 backend support? https://tools.keycdn.com/http2-test openssl s_client -alpn h2 -connect google.com:443

    | grep ALPN · https://blog.newrelic.com/2016/02/17/http2-production/ * OpenSSL 1.0.2g or greater needed *
  8. Use a CDN (shortcut) H2 implementation tips Consider server-side TCP

    tuning (initcwnd) Use keep-alive for HTTP 1.1 clients Measure before + after https://tools.ietf.org/html/draft-stenberg-httpbis-tcp-00
  9. Use the Cache-Control header • NSURLRequestUseProtocolCachePolicy (default policy for NSURLSession)

    observes the protocol spec. • Cache-Control: max-age=<seconds>, public http://nshipster.com/nsurlcache/ https://tools.ietf.org/html/rfc7234
  10. The ETag Header Device Server 200 OK Last-Modified: Mon, 22

    ETag: ad87... GET /fave-cats.json https://en.wikipedia.org/wiki/HTTP_ETag GET /fave-cats.json If-None-Matched: ad87.. 304 Not Modified
  11. Remote Virtual Interface • rvictl creates an interface for packet

    capture tools (i.e. wireshark) • Device must be plugged in using USB https://developer.apple.com/library/mac/qa/qa1176/_index.html http://useyourloaf.com/blog/remote-packet-capture-for-ios-devices/
  12. HTTP Proxies • mitmproxy: mitmproxy.org (0.16 supports HTTP/2!) • charlesproxy.com/Fiddler

    (Nice UI, paid, no HTTP/2 support yet) http://jasdev.me/intercepting-ios-traffic
  13. mitmproxy: install notes 1.El Capitan python issues: use brew install

    python 2. For simulator, must set proxy on OS X to to start capturing HTTP(S) traffic. 3.Must install certificate after running proxy: go to http://mitm.it on simulator.
  14. Checklist Repeat this 5 times: the network is unreliable*. Reduce

    the number of TCP connections. Don't implement your own caching scheme: use the protocol features. Test and measure network traffic regularly. *https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
  15. Last thought The person who uses your app doesn't care

    about network stuff. They just want it to be fast.
  16. Thanks. @smithclay · New Relic UIKonf · 23 May 2016

    · Berlin Slides will posted on Twitter.