Death, Taxes, and HTTP @JesseWilson @JakeWha ! on

You

Your Team

Client

Client

Client Server

Client Server

Server

Client

Client

Server

Client

Server

Round-Trip Time Client Server

RTT Client Server

Client Server

Client Server GET / HTTP/1.1

Client Server GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server GET / HTTP/1.1 HTTP/1.1 200 OK Transpo ! Layer Security

Client Server GET / HTTP/1.1 HTTP/1.1 200 OK TLS

Client Server GET / HTTP/1.1 HTTP/1.1 200 OK TLS

Client Server TLS v1.2

Client Server TLS v1.2 U TLS ?

Client Server TLS v1.2 Ya. Here's my ce ! .

Client Server TLS v1.2 Great. Key is hunter2

Client Server TLS v1.2 I'm ready!

Client Server TLS v1.2 GET / HTTP/1.1

Client Server TLS v1.2 GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server TLS v1.2 w/ session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

GET / HTTP/1.1 HTTP/1.1 200 OK Client Server TLS v1.2 w/ session resumption

Client Server TLS v1.2 w/ session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

3

Client Server TLS v1.3

Client Server TLS v1.3 TLS? Key is hunter2

Client Server TLS v1.3 Ya. Here's my ce ! and key

Client Server TLS v1.3 Let's go!

Client Server TLS v1.3 GET / HTTP/1.1

Client Server TLS v1.3 GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server TLS v1.3 w/ session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server TLS v1.3 w/ 0-RTT session resumption

Client Server TLS v1.3 w/ 0-RTT session resumption

Client Server TLS v1.3 w/ 0-RTT session resumption GET / HTTP/1.1

Client Server TLS v1.3 w/ 0-RTT session resumption GET / HTTP/1.1

Client Server TLS v1.3 w/ 0-RTT session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server TLS v1.3 w/ 0-RTT session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

Client Server TLS v1.3 w/ 0-RTT session resumption GET / HTTP/1.1 HTTP/1.1 200 OK

RTT TLS v1.3 w/ 0-RTT session resumption TLS v1.3 w/ session resumption TLS v1.3 TLS v1.2 w/ session resumption TLS v1.2 2 1 1 1 0

OkHttpClient client = new OkHttpClient() ;

Request request = new Request.Builder() .url( "https://twitter.com" ) .build() ; Call call = client.newCall(request) ; Response response = call.execute() ; System. out .println(response.handshake().tlsVersion()) ;

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder() .url("https://twitter.com ") .build(); Call call = client.newCall(request); Response response = call.execute(); System. out .println( response.handshake().tlsVersion() );

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder() .url("https://twitter.com ") .build(); Call call = client.newCall(request); Response response = call.execute(); System. out .println( response.handshake().tlsVersion() ); TLS_1_2

HTTP Client Server GET / HTTP/1.1 HTTP/1.1 200 OK

HTTP Client Server GET / HTTP/1.1 HTTP/1.1 200 OK

HTTP Client GET / HTTP/1.1 HTTP/1.1 200 OK Server

HTTP Server GET / HTTP/1.1 HTTP/1.1 200 OK Client

HTTP Server Client GET / Y HTTP/1.1 HTTP/1.1 200 OK

GET / Y HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} HTTP

/ Y /payments.html /profile.html /login.html /settings.html /static/fonts/roboto.ttf /static/js/app.js /static/css/main.css /static/image/logo.png

/ Y /payments.html /profile.html /login.html /settings.html /static/fonts/roboto.ttf /static/js/app.js /static/css/main.css /static/image/logo.png /api/auth /api/user /api/payments /api/payments/1234 /api/settings

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

Server Client GET /api/payments HTTP/1.1 200 OK

.html

.js .html .js .js .js .js .js .js

.js .html .js .js .js .js .js .js .css .css .css .css

.js .html .js .js .js .js .js .js .png .png .png .png .png .png .png .png .css .css .css .css

.js .html .js .js .js .js .js .js .png .jpg .png .png .jpg .png .png .png .png .png .css .css .css .css

.js .html .js .js .js .js .js .js .png .jpg .png .png .jpg .png .png .png .png .png .css .css .css .css 22 requests

.js .html .png .jpg .png .png .jpg .png .png .png .png .png .css .css .css .css 16 requests .js .js .js .js .js .js

.js .html .png .jpg .png .png .jpg .png .png .png .png .png .css 13 requests .css .css .css

.js .html .jpg .jpg .png .css 6 requests .png .png .png .png .png .png .png

.js .html .jpg .jpg .png .css 6 requests .png .png .png .png .png .png .png

.js .html .jpg .jpg .png .css 1+3+2 requests example.com cdn.example.com images.example.com

.html .js .jpg .jpg .png .css example.com cdn.example.com images.example.com

.js .png .css .html .jpg .jpg example.com cdn.example.com images.example.com

.jpg .jpg .jpg .jpg .jpg .jpg .jpg .jpg .js .html .png .css example.com cdn.example.com images.example.com

.jpg .jpg .jpg .jpg .jpg .jpg .jpg .jpg .js .html .png .css example.com cdn.example.com images.example.com

images1.example.com .jpg .jpg .jpg .jpg .jpg .jpg .jpg .jpg images2.example.com .js .html .png .css example.com cdn.example.com

.js .html .png .css example.com cdn.example.com images1.example.com .jpg .jpg .jpg .jpg .jpg .jpg .jpg .jpg images2.example.com

Server Client GET /api/payments HTTP/1.1 200 OK

/api/payments [ A

1234, 1275, 1690, 2641, 2903, 4991, 5312, 5319, 14328, 28321, 29948, 30991, 37174, 73572 ] B

/api/payments [ A

1234, 1275, 1690, 2641, 2903, 4991, 5312, 5319, 14328, 28321, 29948, 30991, 37174, 73572 ] B /api/payments/{id} { C

id: 1234, amount: 4200, currency: "USD", initiator_id: F 48818374, recipient_id: G 24567654 , initiated_at: 14764993868, completed_at: 14769455213 } ,Z

/api/payments [ A

{ C

id: 1234, 
amount: 4200, 
currency: "USD", 
initiator:

F { id: 48818374, name: "Jake Wharton" }, recipient: G { id: 24567654 , name: "Jesse Wilson" }, initiated_at: 14764993868, completed_at: 14769455213 }, Z

... 1234 /api/payments/{id} 1275 1690, 2641, 2903, 4991, 5312, 5319, 14328, 28321, 29948, 30991, 37174, 73572

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments ?last=43163 HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments ?last=43163 HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments ?last=43163 HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments ?last=43163 HTTP/1.1 200 OK

HTTP/2 Client Server GET /api/payments ?last=43163 HTTP/1.1 200 OK

HTTP/1.1 GET /api/payments ?last=43163 HTTP/1.1 200 OK GET /api/payments HTTP/1.1 200 OK HTTP/2

HTTP/1.1 GET /api/payments ?last=43163 HTTP/1.1 200 OK GET /api/payments HTTP/1.1 200 OK HTTP/2 time

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} HTTP/1.1 HTTP/2 GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"}

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} HTTP/1.1 HTTP/2 GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"}

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"}

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"}

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} ID: 2 ID: 2

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} ID: 2 ID: 2 GET /api/payments

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} ID: 2 ID: 2 GET /api/payments

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} ID: 2 ID: 2 GET /api/payments

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT

{"id":1234,"amount":4200,"currency":"USD"} ID: 2 ID: 2

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 {"id":1234,"amount":4200,"currency":"USD"} ID: 2

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 {"id":1234,"amount":420 ID: 2 [1234,1275,1690,2641,2903,49 ID: 4

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l Client Server HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET /

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments

HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0 Accept: application/json Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 Host: square.com:443 User-Agent: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 User-Agent: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: square.com:443 User-Agent: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

Accept: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

0x12: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK Content-Type: application/json Content-Length: 42 E-Tag: "686897696a7c876b7e" Last-Modified: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

0x12: application/json

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

0x12: application/json

0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0

0x12: application/json

0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 2 HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 ID: 4 Client Server

GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16: Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 2 HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 ID: 4 Client Server

HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 HTTP/1.1 200 OK 0x1E: application/json 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT ID: 4 Client Server

HTTP/1.1 200 OK 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 HTTP/1.1 200 OK 0x1E: application/json 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT ID: 4 Client Server

0x08 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 0x08 0x1E: application/json 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT ID: 4 Client Server

0x08 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 0x08 0x1E: 0x1A 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT ID: 4 Client Server

0x08 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 2 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 0x08 0x1E: 0x1A 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT ID: 4 Client Server

Client Server ID: 2 GET / HTTP/1.1 0x25: square.com:443 0x39: okhttp/3.7.0 0x12: application/json 0x16 : Basic QWxhZGRpbjpPcGVuU2VzYW1l ID: 2 0x08 0x1E: application/json 0x1B: 42 0x21: "686897696a7c876b7e" 0x2B: Thu, 20 Apr 2017 12:45:26 GMT ID: 2 {"id":1234,"amount":420 ID: 2 0,"currency":"USD"} ID: 4 GET /api/payments HTTP/1.1 0x25: 0x01 0x39: 0x02 0x12: 0x03 0x16: 0x04 ID: 4 0x08 0x1E: 0x1A 0x1B: 471 0x21: "ae7284b30ccc93 " 0x2B: Wed, 19 Apr 2017 09:22:09 GMT

OkHttpClient client = new OkHttpClient() ;

Request request = new Request.Builder() .url( "https://twitter.com" ) .build() ; Call call = client.newCall(request) ; Response response = call.execute() ; System. out .println(response.protocol()) ;

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder() .url("https://twitter.com ") .build(); Call call = client.newCall(request); Response response = call.execute(); System. out .println( response.protocol() );

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder() .url("https://twitter.com ") .build(); Call call = client.newCall(request); Response response = call.execute(); System. out .println( response.protocol() ); h2

Payloads {"id":1234,"amount":4200,"currency":"USD"}

{"id":1234,"amount":4200,"currency":"USD"} JSON

{"id":1234,"amount":4200,"currency":"USD"} JSON message

Payment

{

string

id = 1 ;

int32

amount = 2 ;

Currency

currency = 3 ;

} enum

Currency {

USD = 1 ;

} Protocol Buffers

{"id":1234,"amount":4200,"currency":"USD"} JSON message

Payment

{

string

id = 1 ;

int32

amount = 2 ;

Currency

currency = 3 ;

} enum

Currency {

USD = 1 ;

} Protocol Buffers 1=1234 2=4200 3=1

{"id":1234,"amount":4200,"currency":"USD"} JSON message

Payment

{

string

id = 1 ;

int32

amount = 2 ;

Currency

currency = 3 ;

} enum

Currency {

USD = 1 ;

} Protocol Buffers 1=1234 2=4200 3=1 0104D20210680301

{"id":1234,"amount":4200,"currency":"USD"} JSON message

Payment

{

string

id = 1 ;

int32

amount = 2 ;

Currency

currency = 3 ;

} enum

Currency {

USD = 1 ;

} Protocol Buffers

Y {"id":1234,"amount":4200,"currency":"USD"} Y

Y { "id":1234, "amount":4200, "currency":"USD" } Y

Y {"id":1234,"amount":4200,"currency":"USD"} Y

Y { "id":1234,"amount":4200,"currency":"USD"} Y

Y { " id":1234,"amount":4200,"currency":"USD"} Y

Y { " id " :1234,"amount":4200,"currency":"USD"} Y

Y {"id": 1234,"amount":4200,"currency":"USD"} Y id

Y {"id": 1234,"amount":4200,"currency":"USD"} Y String(id)

Y {"id": 1234,"amount":4200,"currency":"USD"} Y String(id) Map<String, Adapter<?>>

Y {"id": 1234,"amount":4200,"currency":"USD"} Y String(id) Map<String, Adapter<?>> Adapter<Long>

Y {"id": 1234,"amount":4200,"currency":"USD"} Y String(id) Map<String, Adapter<?>> Adapter<Long>

Y {"id": 1234 ,"amount":4200,"currency":"USD"} Y String(id) Map<String, Adapter<?>> Adapter<Long>

Y {"id":1234 ,"amount":4200,"currency":"USD"} Y String(id) Map<String, Adapter<?>> Adapter<Long> 1234L

Y {"id":1234 ,"amount":4200,"currency":"USD"} Y 1234L

Y {"id":1234 , "amount":4200,"currency":"USD"} Y 1234L

Y {"id":1234, " amount":4200,"currency":"USD"} Y 1234L

Y {"id":1234, " amount " :4200,"currency":"USD"} Y 1234L

Y {"id":1234,"amount": 4200,"currency":"USD"} Y 1234L String(amount)

Y {"id":1234,"amount": 4200,"currency":"USD"} Y 1234L String(amount) Map<String, Adapter<?>>

Y {"id":1234,"amount": 4200,"currency":"USD"} Y 1234L String(amount) Map<String, Adapter<?>> Adapter<Long>

Y {"id":1234,"amount": 4200,"currency":"USD"} Y 1234L String(amount) Map<String, Adapter<?>> Adapter<Long>

Y {"id":1234,"amount": 4200 ,"currency":"USD"} Y 1234L String(amount) Map<String, Adapter<?>> Adapter<Long>

Y {"id":1234,"amount":4200 ,"currency":"USD"} Y 1234L String(amount) Map<String, Adapter<?>> Adapter<Long> 4200L

Y {"id":1234,"amount":4200 ,"currency":"USD"} Y 1234L 4200L

Y {"id":1234,"amount":4200 , "currency":"USD"} Y 1234L 4200L

Y {"id":1234,"amount":4200, " currency":"USD"} Y 1234L 4200L

Y {"id":1234,"amount":4200, " currency " :"USD"} Y 1234L 4200L

Y {"id":1234,"amount":4200,"currency": "USD"} Y 1234L String(currency) 4200L

Y {"id":1234,"amount":4200,"currency": "USD"} Y 1234L String(currency) Map<String, Adapter<?>> 4200L

Y {"id":1234,"amount":4200,"currency": "USD"} Y 1234L String(currency) Map<String, Adapter<?>> Adapter<CurrencyCode> 4200L

Y {"id":1234,"amount":4200,"currency": "USD"} Y 1234L String(currency) Map<String, Adapter<?>> Adapter<CurrencyCode> 4200L

Y {"id":1234,"amount":4200,"currency": "USD" } Y 1234L String(currency) Map<String, Adapter<?>> 4200L Adapter<CurrencyCode>

Y {"id":1234,"amount":4200,"currency":"USD" } Y 1234L String(currency) Map<String, Adapter<?>> 4200L 4200L Adapter<CurrencyCode> CurrencyCode.USD

Y {"id":1234,"amount":4200,"currency":"USD" } Y 1234L 4200L CurrencyCode.USD

Y {"id":1234,"amount":4200,"currency":"USD" } Y 1234L 4200L CurrencyCode.USD

Y {"id":1234,"amount":4200,"currency":"USD"} Y 1234L 4200L CurrencyCode.USD

[

Y {"id":1234,"amount":4200,"currency":"USD"}, Y

{"id":1275,"amount":10000,"currency":"USD"}, {"id":1690,"amount":834,"currency":"USD"}, {"id":2641,"amount":2448,"currency":"USD"}, {"id":2903,"amount":11305,"currency":"USD"}, {"id":4991,"amount":566,"currency":"USD"}, {"id":5312,"amount":702,"currency":"USD"}, {"id":5319,"amount":3885,"currency":"USD"}, {"id":14328,"amount":34400,"currency":"USD"}, {"id":28321,"amount":892,"currency":"USD"}, {"id":29948,"amount":2261,"currency":"USD"}, {"id":30991,"amount":6600,"currency":"USD"}, {"id":37174,"amount":939,"currency":"USD"}, {"id":73572,"amount":40000,"currency":"USD"} ]

Y {"id":1234,"amount":4200,"currency":"USD"} Y

Y {"id":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString("id")

Y { "id":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString("id")

Y { " id":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString("id")

Y { " id":1234,"amount":4200,"currency":"USD"} Y ByteString( " amount") ByteString( " currency") ByteString( " id")

Y { "i d":1234,"amount":4200,"currency":"USD"} Y ByteString( " a mount") ByteString( " c urrency") ByteString( "i d")

Y { "i d":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "i d")

Y { "id ":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "id ")

Y { "id" :1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "id" )

Y {"id": 1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "id" ) Adapter<Long> Adapter<CurrencyCode> Adapter<Long>

Y {"id": 1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "id" ) Adapter<Long> Adapter<CurrencyCode> Adapter<Long>

Y {"id": 1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString( "id" ) Adapter<Long> Adapter<CurrencyCode> Adapter<Long>

Y {"id":1234,"amount":4200,"currency":"USD"} Y ByteString("amount") ByteString("currency") ByteString("id") Adapter<Long> Adapter<CurrencyCode> Adapter<Long> Adapter<Payment>

[

Y {"id":1234,"amount":4200,"currency":"USD"}, Y

{"id":1275,"amount":10000,"currency":"USD"}, {"id":1690,"amount":834,"currency":"USD"}, {"id":2641,"amount":2448,"currency":"USD"}, {"id":2903,"amount":11305,"currency":"USD"}, {"id":4991,"amount":566,"currency":"USD"}, {"id":5312,"amount":702,"currency":"USD"}, {"id":5319,"amount":3885,"currency":"USD"}, {"id":14328,"amount":34400,"currency":"USD"}, {"id":28321,"amount":892,"currency":"USD"}, ByteString("amount") ByteString("currency") ByteString("id") Adapter<Long> Adapter<CurrencyCode> Adapter<Long> Adapter<Payment>

github.com/square/moshi

WebSocket Client Server

WebSocket Client Server GET / HTTP/1.1 S prechen sie websocket?

WebSocket Client Server GET / HTTP/1.1 HTTP/1.1 101 ¡ Sí!

WebSocket Client Server GET / HTTP/1.1 HTTP/1.1 101

WebSocket Client Server GET / HTTP/1.1 HTTP/1.1 101

WebSocket Client Server GET / HTTP/1.1 HTTP/1.1 101

Death, Taxes, and HTTP @JesseWilson @JakeWha ! on