Corso di Laurea Magistrale in Ingegneria Informatica Corso di Linguaggi e Tecnologie Web II modulo Tecnologie e Sistemi Web-oriented A. A. 2014-2015 LINGUAGGI E TECNOLOGIE WEB REST; WebSocket (RFC 6455) 1
REST REST = REpresentational State Transfer Altro paradigma architetturale per servizi basati sul Web Termine introdotto nel 2000 nella tesi di dottorato di Roy Fielding (uno degli autori del protocollo HTTP) Il paradigma REST nasce come astrazione di alcune delle caratteristiche fondamentali di HTTP che lo hanno reso diffuso e hanno permesso di usarlo come base per servizi e protocolli di più alto livello RESTful Web service sono quei servizi basati sul Web che rispettano i vincoli del paradigma REST REST; WebSocket 2
Paradigma REST Un'applicazione distribuita è RESTful se rispetta 6 proprietà fondamentali (vincoli) Client-server Stateless Cacheable (i client possono fare caching delle risposte dei server) Layered system: un client può connettersi direttamente al server o ad un intermediario (che può avere lo scopo di incrementare la scalabilità o la sicurezza) Code on demand (requisito opzionale): il server può estendere temporaneamente le capacità del client consentendogli di ottenere codice aggiuntivo Uniform interface: l'interfaccia tra client e server è semplice e uniforme REST; WebSocket 3
Il WWW è RESTful? Client-server: sì Stateless: sì Cacheable: sì Layered systems: sì Proxy Code on demand: sì Client-side scripting, embedded objects Uniform interface: sì URI per identificare le risorse e ottenerne una rappresentazione Pochi semplici metodi per manipolare le risorse (metodo = azione, verbo; risorsa = complemento oggetto) I messaggi HTTP sono auto-descrittivi: indicano i formati delle risorse, la possibilità di effettuare il caching, etc. REST; WebSocket 4
RESTful Web Service Non c'è uno standard ufficiale per RESTful Web service I RESTful Web service sono Web service in senso lato (cioè sono cross-platform, interoperabili e invocabili mediante un'interfaccia pubblica), non in senso stretto (niente WSDL, SOAP, etc.) Per RESTful Web service si intende una API Web aderente al paradigma REST: HTTP è il protocollo di comunicazione Ogni risorsa è identificata da un URI Le risorse sono rappresentate in formati interoperabili (i più comuni: HTML, JSON, XML) Metodi PUT, GET, POST, DELETE per effettuare le 4 manipolazioni fondamentali su ogni risorsa: create, read, update, delete (CRUD) REST; WebSocket 5
Limiti di AJAX AJAX consente applicazioni Web più interattive aggiornare i dati senza ricaricare l'intera pagina ridurre i tempi di latenza e il traffico Ciononostante, restano alcuni limiti la comunicazione è sempre originata da una richiesta del client aggiornamento dei dati solo attraverso polling non è possibile coprire scenari più avanzati, quali applicazioni Web-based peer-to-peer aggiornamento dei dati in tempo reale Ciò perché la comunicazione HTTP è fondamentalmente half-duplex REST; WebSocket 6
WebSocket Candidate recommendation W3C del 2012 Soluzione composta da: un protocollo applicativo connection-oriented full-duplex che si aggiunge ad HTTP una API HTML5 per poterlo utilizzare Permette l'invio dei dati in tempo reale a Web application eseguite nei browser REST; WebSocket 7
Da HTTP a WebSocket Il protocollo ha due fasi Handshake Trasferimento dati WebSocket usa le stesse porte TCP di HTTP (80) e HTTPS (443) riutilizza gli elementi infrastrutturali di HTTP proxy autenticazione ha URI scheme ws:// per connessioni in chiaro wss:// per connessioni cifrate con TLS REST; WebSocket 8
Handshake lato client 1/2 L'handshake del client è una normale richiesta HTTP GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dghlihnhbxbszsbub25jzq== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 l'uri della richiesta è l'endpoint della connessione WebSocket Connection: Upgrade richiede di modificare l'attuale connessione Upgrade: websocket indica il nuovo protocollo Origin: indica al server da quale client proviene la richiesta; è obbligatorio se il client è un browser REST; WebSocket 9
Handshake lato client 2/2 Altri header field obbligatori Sec-WebSocket-Version: versione richiesta del protocollo; la prima versione definitiva è la 13 Sec-WebSocket-Key: valore pseudocasuale di 16 byte, codificato in base64 Il client nella richiesta può specificare diverse opzioni Sec-WebSocket-Protocol: elenco di sub-protocolli di livello applicativo che il client vuole usare. Lo IANA detiene il registro dei nomi validi Sec-WebSocket-Extensions: insieme di estensioni di WebSocket supportate dal client. Lo IANA detiene il registro dei nomi validi Cookie Autenticazione REST; WebSocket 10
Risposta del server Struttura della risposta del server HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pplmbitxaq9kygzzhzrbk+xoo= Affinché l'handshake sia completato: lo status code deve essere 101 gli header field Upgrade e Connection devono essere presenti Sec-WebSocket-Accept serve a confermare l'accettazione della richiesta: deve essere pari all'hash SHA1 della concatenazione del valore di Sec-WebSocket-Key inviato dal client con la stringa univoca "258EAFA5-E914-47DA-95CA- C5AB0DC85B11" Header field opzionali Sec-WebSocket-Protocol indica il sub-protocollo applicativo scelto dal server tra quelli proposti dal client Set-Cookie REST; WebSocket 11
Trasferimento dati Nella fase di trasferimento dati, WebSocket aggiunge il minimo indispensabile per far funzionare un socket TCP nell'infrastruttura applicativa del WWW un modello di sicurezza per i browser basato sull'origine dei dati infatti usando solo HTML e JavaScript i browser non permettono di inviare richieste con header field che iniziano per Sec- indirizzamento (per supportare più host name su un unico IP) e indicazione del protocollo applicativo (per supportare più servizi su una porta) un meccanismo di framing come quello di TCP, ma senza limiti di lunghezza una procedura di tear down che complementa quella di TCP in presenza di proxy e altri intermediari REST; WebSocket 12
Frame WebSocket 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ F R R R opcode M Payload len Extended payload length I S S S (4) A (7) (16/64) N V V V S (if payload len==126/127) 1 2 3 K +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + Extended payload length continued, if payload len == 127 + - - - - - - - - - - - - - - - +-------------------------------+ Masking-key, if MASK set to 1 +-------------------------------+-------------------------------+ Masking-key (continued) Payload Data +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Payload Data continued... +---------------------------------------------------------------+ REST; WebSocket 13
Campi frame WebSocket 1/2 FIN (1 bit): si usa per chiudere la connessione RSV1, RSV2, RSV3 (1 bit cad.): riservati alle estensioni Opcode (4 bit) 0000 continuation 0001 frame testuale 0010 frame binario 1000 conferma chiusura connessione (e il payload opzionalmente può contenere uno status code con la motivazione) 1001 ping 1010 risposta al ping gli altri valori sono riservati REST; WebSocket 14
Campi frame WebSocket 2/2 Mask (1 bit): indica se è attivo il mascheramento dei bit del payload. Per ragioni di sicurezza, tutti i frame inviati da client a server devono avere questo bit a 1 Payload length ( 7 bit) da 0 a 125: lunghezza del payload 126: la lunghezza è espressa nei 16 bit successivi 127: la lunghezza è espressa nei 64 bit successivi Masking key (32 bit, se presente): maschera di bit da applicare al payload REST; WebSocket 15
API WebSocket Nei browser che supportano WebSocket, l'interprete JavaScript mette a disposizione un nuovo template di oggetti, WebSocket Membri Costruttore WebSocket(url, [protocols]) Gestori degli eventi di comunicazione onopen onmessage onerror onclose Funzione close([code, reason]) Funzione di trasmissione send per dati HTML/XML, testo e binari REST; WebSocket 16
Esempio WebSocket echo client <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>websocket Test</title> <script language="javascript" type="text/javascript"> // URI del server a cui collegarsi var wsuri = "ws://echo.websocket.org/"; var output; function init() { output = document.getelementbyid("output"); } testwebsocket(); REST; WebSocket 17
Esempio // Crea il WebSocket e assegna i gestori degli eventi function testwebsocket() { websocket = new WebSocket(wsUri); websocket.onopen = function(evt) { onopen(evt) }; websocket.onclose = function(evt) { onclose(evt) }; websocket.onmessage = function(evt) { onmessage(evt) }; websocket.onerror = function(evt) { onerror(evt) }; } function onopen(evt) { writetoscreen("connected"); dosend("websocket rocks"); } function onclose(evt) { writetoscreen("disconnected"); } REST; WebSocket 18
Esempio // L'attributo data dell'evento contiene i dati ricevuti function onmessage(evt) { writetoscreen('<span style="color: blue;">response: ' + evt.data+'</span>'); websocket.close(); } function onerror(evt) { writetoscreen('<span style="color: red;">error:</span> ' + evt.data); } function dosend(message) { writetoscreen("sent: " + message); websocket.send(message); } REST; WebSocket 19
Esempio function writetoscreen(message) { var pre = document.createelement("p"); pre.style.wordwrap = "break-word"; pre.innerhtml = message; output.appendchild(pre); } window.addeventlistener("load", init, false); </script> </head> <body> <h2>websocket Test</h2> <div id="output"></div> </body> </html> REST; WebSocket 20
Riferimenti I. Fette, A. Melnikov, The WebSocket Protocol (RFC 6455), http://tools.ietf.org/html/rfc6455 I. Hickson, The WebSocket API, W3C Editor's Draft, http://dev.w3.org/html5/websockets/ REST; WebSocket 21