1) Mengapa protokol WebSockets lebih baik?
WebSockets lebih baik untuk situasi yang melibatkan komunikasi latensi rendah terutama untuk latensi rendah untuk pesan klien ke server. Untuk data server ke klien, Anda bisa mendapatkan latensi yang cukup rendah menggunakan koneksi lama dan transfer terpotong. Namun, ini tidak membantu latensi klien ke server yang memerlukan koneksi baru untuk dibuat untuk setiap klien ke server pesan.
Jabat tangan HTTP 48 byte Anda tidak realistis untuk koneksi browser HTTP dunia nyata di mana sering ada beberapa kilobyte data yang dikirim sebagai bagian dari permintaan (di kedua arah) termasuk banyak header dan data cookie. Berikut adalah contoh permintaan / tanggapan untuk menggunakan Chrome:
Contoh permintaan (2800 byte termasuk data cookie, 490 byte tanpa data cookie):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Contoh respons (355 byte):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
Baik HTTP dan WebSockets memiliki jabat tangan koneksi ukuran awal yang setara, tetapi dengan koneksi WebSocket jabat tangan awal dilakukan sekali dan kemudian pesan kecil hanya memiliki 6 byte overhead (2 untuk header dan 4 untuk nilai mask). Overhead latensi tidak begitu banyak dari ukuran header, tetapi dari logika untuk mengurai / menangani / menyimpan header tersebut. Selain itu, latensi penyiapan koneksi TCP mungkin merupakan faktor yang lebih besar daripada ukuran atau waktu pemrosesan untuk setiap permintaan.
2) Mengapa ini diterapkan alih-alih memperbarui protokol HTTP?
Ada upaya untuk merekayasa ulang protokol HTTP untuk mencapai kinerja yang lebih baik dan latensi yang lebih rendah seperti SPDY , HTTP 2.0 dan QUIC . Ini akan meningkatkan situasi untuk permintaan HTTP normal, tetapi kemungkinan WebSockets dan / atau WebRTC DataChannel masih akan memiliki latensi yang lebih rendah untuk transfer data klien ke server daripada protokol HTTP (atau akan digunakan dalam mode yang sangat mirip dengan WebSockets bagaimanapun).
Perbarui :
Berikut adalah kerangka kerja untuk berpikir tentang protokol web:
- TCP : lapisan transport pesanan tingkat rendah, dua arah, dupleks penuh, dan terjamin. Tidak ada dukungan browser (kecuali melalui plugin / Flash).
- HTTP 1.0 : protokol transport permintaan-respons berlapis pada TCP. Klien membuat satu permintaan penuh, server memberikan satu respons penuh, dan kemudian koneksi ditutup. Metode permintaan (GET, POST, HEAD) memiliki makna transaksional khusus untuk sumber daya di server.
- HTTP 1.1 : mempertahankan sifat permintaan-respons HTTP 1.0, tetapi memungkinkan koneksi tetap terbuka untuk beberapa permintaan penuh / respons penuh (satu respons per permintaan). Masih memiliki tajuk lengkap dalam permintaan dan tanggapan tetapi koneksi digunakan kembali dan tidak ditutup. HTTP 1.1 juga menambahkan beberapa metode permintaan tambahan (OPTIONS, PUT, DELETE, TRACE, CONNECT) yang juga memiliki makna transaksional tertentu. Namun, seperti yang tercantum dalam pengantar proposal rancangan HTTP 2.0, pipelining HTTP 1.1 tidak digunakan secara luas sehingga ini sangat membatasi utilitas HTTP 1.1 untuk menyelesaikan latensi antara browser dan server.
- Jajak pendapat panjang : semacam "retas" ke HTTP (baik 1.0 atau 1.1) di mana server tidak segera merespons (atau hanya merespons sebagian dengan tajuk) terhadap permintaan klien. Setelah respons server, klien segera mengirim permintaan baru (menggunakan koneksi yang sama jika melalui HTTP 1.1).
- Streaming HTTP : beragam teknik (respons multi bagian / terpotong) yang memungkinkan server mengirim lebih dari satu respons ke satu permintaan klien. W3C menstandarkan ini sebagai Server-Sent Events menggunakan
text/event-stream
tipe MIME. API browser (yang cukup mirip dengan API WebSocket) disebut API EventSource.
- Dorongan server / server : ini adalah istilah umum yang mencakup jajak pendapat panjang dan streaming HTTP. Pustaka komet biasanya mendukung berbagai teknik untuk mencoba dan memaksimalkan dukungan lintas-browser dan lintas-server.
- WebSockets : lapisan transport bawaan TCP yang menggunakan handshake Upgrade HTTP friendly. Tidak seperti TCP, yang merupakan transport streaming, WebSockets adalah transport berbasis pesan: pesan dibatasi pada kabel dan dipasang kembali secara penuh sebelum dikirim ke aplikasi. Koneksi WebSocket bersifat dua arah, dupleks penuh, dan berumur panjang. Setelah permintaan / respons jabat tangan awal, tidak ada semantik transaksional dan hanya ada sedikit overhead pesan. Klien dan server dapat mengirim pesan kapan saja dan harus menangani penerimaan pesan secara tidak sinkron.
- SPDY : proposal yang diprakarsai Google untuk memperluas HTTP menggunakan protokol kawat yang lebih efisien tetapi mempertahankan semua semantik HTTP (permintaan / tanggapan, cookie, penyandian). SPDY memperkenalkan format pembingkaian baru (dengan frame yang panjangnya diawali) dan menentukan cara untuk meletakkan pasangan permintaan / respons HTTP ke lapisan pembingkaian baru. Header dapat dikompresi dan header baru dapat dikirim setelah koneksi dibuat. Ada implementasi dunia nyata dari SPDY di browser dan server.
- HTTP 2.0 : memiliki tujuan yang mirip dengan SPDY: mengurangi latensi dan overhead HTTP sambil mempertahankan semantik HTTP. Draf saat ini berasal dari SPDY dan mendefinisikan handshake upgrade dan framing data yang sangat mirip dengan standar WebSocket untuk handshake dan framing. Proposal rancangan HTTP 2.0 alternatif (httpbis-speed-mobility) sebenarnya menggunakan WebSockets untuk lapisan transport dan menambahkan multiplexing dan pemetaan HTTP SPDY sebagai ekstensi WebSocket (ekstensi WebSocket dinegosiasikan selama jabat tangan).
- WebRTC / CU-WebRTC : proposal untuk memungkinkan konektivitas peer-to-peer antara browser. Ini dapat memungkinkan komunikasi latensi rata-rata dan maksimum yang lebih rendah karena transportasi yang mendasarinya adalah SDP / datagram daripada TCP. Hal ini memungkinkan pengiriman paket / pesan out-of-order yang menghindari masalah TCP dari lonjakan latensi yang disebabkan oleh paket yang jatuh yang menunda pengiriman semua paket berikutnya (untuk menjamin pengiriman dalam pesanan).
- QUIC : adalah protokol eksperimental yang bertujuan mengurangi latensi web dibandingkan TCP. Di permukaan, QUIC sangat mirip dengan TCP + TLS + SPDY diimplementasikan pada UDP. QUIC menyediakan kontrol multiplexing dan flow yang setara dengan HTTP / 2, keamanan setara dengan TLS, dan semantik koneksi, keandalan, dan kontrol kemacetan yang setara dengan TCP. Karena TCP diimplementasikan dalam kernel sistem operasi, dan firmware middlebox, membuat perubahan signifikan pada TCP hampir tidak mungkin. Namun, karena QUIC dibangun di atas UDP, QUIC tidak memiliki batasan seperti itu. QUIC dirancang dan dioptimalkan untuk semantik HTTP / 2.
Referensi :
- HTTP :
- Acara yang Dikirim Server :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :