Taking a Quantum Leap with Html 5 WebSocket

55
Taking a Quantum Leap with Html 5 WebSocket: Taking bi-directional communication on the web to the next level Shahriar Hyder Kaz Software Ltd. Comet Never More! (HTML 5 WebSockets in Theory and Practice) WebSockets == “TCP for the Web”

description

Taking bi-directional communication on the web to the next level - HTML 5 WebSockets in Theory and Practice.

Transcript of Taking a Quantum Leap with Html 5 WebSocket

Page 1: Taking a Quantum Leap with Html 5 WebSocket

Taking a Quantum Leap with Html 5 WebSocket:

Taking bi-directional communication on the web to the next level

Shahriar HyderKaz Software Ltd.

Comet Never More!(HTML 5 WebSockets in Theory and Practice)

WebSockets == “TCP for the Web”

Page 2: Taking a Quantum Leap with Html 5 WebSocket

Complexity does not scale

Page 3: Taking a Quantum Leap with Html 5 WebSocket

Push technologies

Flash socketsSilverlight duplex servicesCometWebSockets

Page 4: Taking a Quantum Leap with Html 5 WebSocket

Client-server Communication

AJAX WebSockets

Comet

Page 5: Taking a Quantum Leap with Html 5 WebSocket

HTTP Is Not Full Duplex

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 6: Taking a Quantum Leap with Html 5 WebSocket

Half-Duplex Architecture

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 7: Taking a Quantum Leap with Html 5 WebSocket

Polling, Long-Polling, Streaming … Comet — Headache 2.0

Use Comet to spellCOMplExiTy…

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 8: Taking a Quantum Leap with Html 5 WebSocket

AJAX: PollingAttempting to simulate bi-directional communications with AJAX requires polling schemes, which blindly check for updates irrespective of state changes in the app. The result is poor resource utilization on both the client and server, since CPU-cycles and memory are needlessly allocated to prematurely or belatedly detect updates on the server. Consequently, depending on the rate in which events are published on the server, traditional AJAX apps must constantly strike a balance between shorter and longer polling intervals in an effort to improve the accuracy of individual requests.

Page 9: Taking a Quantum Leap with Html 5 WebSocket

AJAX: Polling

High polling frequencies result in increased network traffic and server demands, while low polling frequencies result in missed updates and the delivery of stale information. In either case, some added latency is incurred.In low-message-rate situations, many connections are opened and closed needlessly.There are two types of polling, short polling and long polling.

Page 10: Taking a Quantum Leap with Html 5 WebSocket

Short polling

Short polling is implemented by making a request to the web server every few seconds or so to see if data has changed. If it has, the web server will respond with the new data. Otherwise, it will respond with a blank message. The drawback to this technique, however, is both a surplus in server requests and an overhead in CPU usage on the web server to constantly check if an update to the data has been made.

Page 11: Taking a Quantum Leap with Html 5 WebSocket

Long Polling

Also known as asynchronous-pollingBrowser sends a request to the server and the server keeps the request open for a set periodIf a notification is received within that period, a response containing the message is sent to the client. If a notification is not received within the set time period, the server sends a response to terminate the open request. HTTP headers, present in both long-polling and polling often account for most of the network trafficIn high-message rate situations, long-polling results in a continuous loop of immediate pollsThe drawback to this technique, like short polling, is that the web server still has to check if the data has changed every few seconds or so, creating an overhead in CPU usage.

Page 12: Taking a Quantum Leap with Html 5 WebSocket

StreamingWith streaming, the browser sends a complete request, but the server sends and maintains an open response that is continuously updated and kept open indefinitely (or for a set period of time). The response is then updated whenever a message is ready to be sent, but the server never signals to complete the response, thus keeping the connection open to deliver future messages.

However, since streaming is still encapsulated in HTTP, intervening firewalls and proxy servers may choose to buffer the response, increasing the latency of the message delivery. Therefore, many streaming Comet solutions fall back to long-polling in case a buffering proxy server is detected. Alternatively, TLS (SSL) connections can be used to shield the response from being buffered, but in that case the setup and tear down of each connection taxes the available server resources more heavily.

Page 13: Taking a Quantum Leap with Html 5 WebSocket

Streaming

More efficient, but sometimes problematicPossible complications:o Proxies and firewallso Response builds up and must be flushed

periodicallyo Cross-domain issues to do with browser

connection limits

Page 14: Taking a Quantum Leap with Html 5 WebSocket

Streaming

One benefit of streaming is reduced network traffic, which is the result of sending packets that only contain data rather than packets that contain both data and HTTP headers. The downside of streaming is that it is still encapsulated in HTTP, so intervening HTTP proxies may choose to buffer the response, increasing the latency of the message delivery.

Page 15: Taking a Quantum Leap with Html 5 WebSocket

Callback-Polling or JSONP-Polling

Long-polling, but works cross-domainRelies on JSONP technique for establishing trust<script> blocks instead of XHR

Page 16: Taking a Quantum Leap with Html 5 WebSocket

CometComet is known by several other names, including Ajax Push, Reverse Ajax, Two-way-web, HTTP Streaming, and HTTP server push among others.The Comet model for communications was a departure from that found in the classical web model, in which events are client initiated. The most obvious benefit of Comet's model is the server's ability to send information to the browser without prompting from a client. However, this "push" style of communications has limited uses.

Page 17: Taking a Quantum Leap with Html 5 WebSocket

Comet: Two Connections, Bi-directionalComet attempted to deliver bi-directional

communications by maintaining a persistent connection and a long-lived HTTP request on which server-side events could be sent to the browser, and making upstream requests to the server on a newly opened connection. The maintenance of these two connections introduces significant overhead in terms of resource consumption, which translates into added latency for sites under peak load.In addition, Comet solutions that employ a long-polling technique send undue HTTP request/response headers. Each time an event is sent by the server, the server severs its connection with the client browser, forcing the browser to reestablish its connection with the server. This action causes another client request and server response to be sent across the wire. Neither HTTP streaming nor Web Socket incur this network overhead.

Page 18: Taking a Quantum Leap with Html 5 WebSocket

Comet: Two Connections, Bi-directionalMost Comet implementations rely on the Bayeux

protocol. The use of this protocol requires messages from the origin services to be transformed from the messages' initial format to conform to the Bayeux protocol. This transformation introduces unnecessary complexity in your system, requiring developers to manipulate one message format on the server (e.g., JMS, IMAP, XMPP, etc.) and a second message format (e.g., Bayeux and JSON) on the client. Moreover, the transformation code used to bridge your origin protocol to Bayeux introduces an unnecessary performance overhead into your system by forcing a message to be interpreted and processed prior to being sent over the wire. With Web Sockets, the message sent by the server is the same message delivered to the browser, eliminating the complexity and performance concerns introduced by transformation code.

Page 19: Taking a Quantum Leap with Html 5 WebSocket

Solutions or Hacks?

But if you think about it, these techniques are just hacks, tricks used to simulate a technology that doesn’t exist: server-sent events. If the server could actually start the communication, none of these ugly tricks would be needed.

Page 20: Taking a Quantum Leap with Html 5 WebSocket

HTTP Request HeadersGET /PollingStock//PollingStock HTTP/1.1Host: localhost:8080User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-usAccept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer: http://localhost:8080/PollingStock/Cookie: showInheritedConstant=false; showInheritedProtectedConstant=false; showInheritedProperty=false; showInheritedProtectedProperty=false; showInheritedMethod=false; showInheritedProtectedMethod=false; showInheritedEvent=false; showInheritedStyle=false; showInheritedEffect=false;

Page 21: Taking a Quantum Leap with Html 5 WebSocket

HTTP Response HeadersHTTP/1.x 200 OKX-Powered-By: Servlet/2.5Server: Sun Java System Application Server 9.1_02Content-Type: text/html;charset=UTF-8Content-Length: 321Date: Sat, 07 Nov 2009 00:32:46 GMT

• Total (unnecessary) HTTP request and response header information overhead: 871 bytes (example)

• Overhead can be as much as 2000 bytes• Does not scale!

Page 22: Taking a Quantum Leap with Html 5 WebSocket

Enter HTML5 WebSocket!

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 23: Taking a Quantum Leap with Html 5 WebSocket

Specification Stage

Page 24: Taking a Quantum Leap with Html 5 WebSocket

… so why do we need WebSockets?

Yawn…

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 25: Taking a Quantum Leap with Html 5 WebSocket

2 good reasons

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 26: Taking a Quantum Leap with Html 5 WebSocket

Desire for real-time

Want low latency 2-way communication for:Multiplayer online games (pong)Collaboration (live wikis)Dashboards (financial apps)Tracking (watch user actions)Presence (chat with customer support)Live sports tickerUpdating social streams / Social Networking (Twitter Feed)Smart power gridMore!

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 27: Taking a Quantum Leap with Html 5 WebSocket

HTTP doesn’t deliverPeople hack around this (see “Comet”)

Polling, long-polling, stream via hidden iframeBUT these are slow, complex, and bulky

Or rely on plugins:Flash, SilverLight, Java appletsBUT these don’t work everywhere (phones)

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 28: Taking a Quantum Leap with Html 5 WebSocket

Damn, this is hairy:

Source: http://www.slideshare.net/ismasan/websockets-and-ruby-eventmachine

Page 29: Taking a Quantum Leap with Html 5 WebSocket

Vs. HTTP hacks, WebSockets provide:

Lower latency: no new TCP connections for each HTTP request

Lower overhead: for each message sent(2 bytes vs. lines of HTTP header junk)

Less traffic: since clients don’t need to poll, messages only sent when we have data

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 30: Taking a Quantum Leap with Html 5 WebSocket

What are WebSockets?

+ = ?

Source: http://www.slideshare.net/goberoi/intro-to-websockets

Page 31: Taking a Quantum Leap with Html 5 WebSocket

Definition

The WebSocket specification—developed as part of the HTML5 initiative—introduced the WebSocket JavaScript interface, which defines a full-duplex, bi-directional communication channel over a single TCP socket over which messages can be sent between client and server. The WebSocket standard simplifies much of the complexity around bi-directional web communication and connection management.This allows web developers to establish real time two way communications with a server using simple JavaScript without resorting to Flash, Java, Ajax long polling, comet, forever iframe, or other current workarounds.

Page 32: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket• W3C API and IETF Protocol• Full-duplex, single socket• Enables web pages to communicate

with a remote host• Traverses firewalls, proxies, and

routers seamlessly• Leverages Cross-Origin Resource

Sharing (CORS)• Share port with existing HTTP content• Dramatic overhead reduction

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 33: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket Schemes

Page 34: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket Schemes• WebSocket

ws://www.websocket.org/text

• WebSocket Securewss://www.websocket.org/encrypted-text

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 35: Taking a Quantum Leap with Html 5 WebSocket

Possible WebSocket Architecture

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 36: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket• Connection established by

upgrading from the HTTP protocol to the WebSocket protocol using the same TCP connection

• Once upgraded, WebSocket data frames can be sent back and forth between the client and the server in full-duplex mode

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 37: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket Handshake

GET /text HTTP/1.1Upgrade: WebSocketConnection: UpgradeHost: www.example.comOrigin: http://example.comWebSocket-Protocol: sample…\r\n

Client

HTTP/1.1 101 WebSocket Protocol HandshakeUpgrade: WebSocketConnection: UpgradeWebSocket-Origin: http://example.comWebSocket-Location: ws://example.com/demoWebSocket-Protocol: sample…\r\n

Server

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 38: Taking a Quantum Leap with Html 5 WebSocket

HTML5 WebSocket Frames• Frames can be sent full-duplex,

in either direction at the same time

• Each frame of data:• Starts with a 0x00 byte• Ends with a 0xFF byte• Contains UTF-8 data in between

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 39: Taking a Quantum Leap with Html 5 WebSocket

Example• \x00Hello, WebSocket\0xff• There is no defined maximum size

o If the user agent has content that is too large to be handled, it must fail the Web Socket connectiono JavaScript does not allow >4GB of data, so that is a practical maximum

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 40: Taking a Quantum Leap with Html 5 WebSocket

Dramatic Reduction in Network Traffic

• With WebSocket, each frame has only 2 bytes of packaging (a 500:1 or even 1000:1 reduction)

• No latency involved in establishing new TCP connections for each HTTP message

• Dramatic reduction in unnecessary network traffic and latency

• Remember the Polling HTTP header traffic?Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 41: Taking a Quantum Leap with Html 5 WebSocket

Latency Reduction

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 42: Taking a Quantum Leap with Html 5 WebSocket

Overheard… “Reducing kilobytes of data to 2 bytes…and reducing latency from 150ms to 50ms is far more than marginal. In fact, these two factors alone are enough to make WebSocket seriously interesting to Google.”

—Ian Hickson (Google, HTML5 spec lead)

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 43: Taking a Quantum Leap with Html 5 WebSocket

Using the WebSocket API

Page 44: Taking a Quantum Leap with Html 5 WebSocket

//Checking for browser supportif (window.WebSocket) { document.getElementById("support").innerHTML = "HTML5 WebSocket is supported"; } else { document.getElementById("support").innerHTML = "HTML5 WebSocket is not supported"; }

JavaScript

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 45: Taking a Quantum Leap with Html 5 WebSocket

//Create new WebSocketvar mySocket = new WebSocket(“ws://www.websocket.org”);

// Associate listenersmySocket.onopen = function(evt) {

alert(“Connection open…”);};

mySocket.onmessage = function(evt) {alert(“Received message: “ + evt.data);

};

mySocket.onclose = function(evt) {alert(“Connection closed…”);

};

JavaScript

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 46: Taking a Quantum Leap with Html 5 WebSocket

// Sending datamySocket.send(“HTML5 WebSocket Rocks!”);

//Close WebSocketmySocket.close();

JavaScript

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 47: Taking a Quantum Leap with Html 5 WebSocket

Extending WebSocket• Once you have WebSocket, you can communicate

with WebSocket Servers and back-end servers and directly with message brokers

• You can extend client-server protocols to the web:• XMPP, Jabber• Pub/Sub (Stomp/AMQP)• Gaming protocols• Any TCP-based protocol

• Browser becomes a first-class network communication citizen

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 48: Taking a Quantum Leap with Html 5 WebSocket

WebSocket Server Support• Socket.IO (server side implementations for Java and

node.js)• node-websocket-server• Jetty WebSocketServlet (Java)• Ruby: Event Machine + em-websocket• Python: Twisted + txWebSocket• JavaScript: Node.js + WebSocket module• Kaazing WebSocket Gateway (production since April

2009)• phpwebsockets• web-socket-ruby• Apache mod-pywebsocket• JWebSocket• Yaws (Erlang)

Page 49: Taking a Quantum Leap with Html 5 WebSocket

Browser Support• Chrome 4.0• Safari 5.0• Firefox 4 (Beta)• Opera 10.70

Emulation available through Kaazing WebSocket Gateway

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 50: Taking a Quantum Leap with Html 5 WebSocket

DEMO TIME!

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 51: Taking a Quantum Leap with Html 5 WebSocket

Quake II Gamehttp://code.google.com/p/quake2-gwt-port

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 52: Taking a Quantum Leap with Html 5 WebSocket

Proxy Servers

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 53: Taking a Quantum Leap with Html 5 WebSocket

Proxy server traversal decision tree

Source: http://www.slideshare.net/peterlubbers/html5-web-workersunleashed

Page 54: Taking a Quantum Leap with Html 5 WebSocket

Summary Low latency is the mother of interactivity, and in no

place is this more apparent than on the Web. Every slip of a millisecond equates to a slower end-user experience, which in turn translates into elevated risk that a user's eyes will avert elsewhere. Both AJAX and Comet attempt to obscure latency problems, and certainly address the issue of user-perceived latency. However, Web Socket removes the need to obscure such problems and introduces a real solution, one that does not play tricks on the perception of our end users, but delivers content in real time with real results.HTML5 Web Socket provides an enormous step forward in the scalability of the real-time web. As you have seen here, HTML5 Web Sockets can provide a 500:1 or - depending on the size of the HTTP headers - even a 1000:1 reduction in unnecessary HTTP header traffic and 3:1 reduction in latency. That is not just an incremental improvement; that is a revolutionary jump - a quantum leap.

Page 55: Taking a Quantum Leap with Html 5 WebSocket

Concluding statement

If HTTP did not restrict your creativity, what Web application would YOU create?