Sec Websocket Protocol Binary Options
MessageWebSocketControl MessageWebSocketControl MessageWebSocketControl MessageWebSocketControl Class Declaration Class MessageWebSocketControl menyediakan akses ke data kontrol soket tingkat lanjut pada objek MessageWebSocket. Objek MessageWebSocketControl dibuat secara otomatis dengan objek MessageWebSocket induk. Properti Kontrol menyediakan akses ke objek MessageWebSocket terkait. Properti SupportedProtocols mendapatkan nilai dari properti ini dan dapat dipanggil kapan saja. Properti MessageType dapat diubah kapan saja sebelum atau sesudah MessageWebSocket terhubung. Ini memungkinkan aplikasi beralih antara pesan biner dan UTF-8 bila diperlukan. Properti OutboundBufferSizeInBytes harus diatur sebelum MessageWebSocket terhubung. Menetapkan properti ini setelah MessageWebSocket terhubung tidak berpengaruh. Setiap perubahan pada nilai properti lainnya pada MessageWebSocketControl harus ditetapkan sebelum DatagramSocket terikat atau terhubung. Alhasil jika Anda perlu melakukan perubahan pada MaxMessageSize. ProxyCredential OutboundBufferSizeInBytes. Atau properti ServerCredential, maka perubahan ini harus terjadi sebelum panggilan yang berhasil dilakukan ke metode ConnectAsync (Windows. Foundation. Uri) di MessageWebSocket. Contoh berikut membuat MessageWebSocket. Dan kemudian menunjukkan bagaimana mengatur properti MessageType menjadi biner. (Properti lainnya dapat diatur dengan cara yang sama.) Setelah ini selesai, aplikasi dapat menghubungkan MessageWebSocket. Ringkasan properti Mendapatkan daftar kesalahan sertifikat server yang tidak terhormat. Dapatkan daftar ini dan tambahkan nilai ChainValidationResult untuk kesalahan sertifikat server yang ingin Anda abaikan selama proses validasi sertifikat server WebSocket aman (WSS: protokol). Nilai Properti Daftar nilai ChainValidationResult yang menunjukkan kesalahan sertifikat server untuk diabaikan saat memvalidasi sertifikat server. Secara default, daftar kosong, dan semua kesalahan menyebabkan validasi gagal. Contoh berikut menunjukkan bagaimana mengabaikan kesalahan ChainValidationResult saat Anda terhubung ke server yang menggunakan sertifikat yang ditandatangani sendiri. Kode tersebut menambahkan nilai yang sesuai ke daftar IgnorableServerCertificateErrors sebelum memanggil ConnectAsync (Windows. Foundation. Uri) di soket web. Sertifikat self-signed server tidak akan menyebabkan validasi gagal, tapi kesalahan lain dalam memvalidasi sertifikat server masih akan mengakibatkan kegagalan ConnectAsync (Windows. Foundation. Uri). Nilai Properti Kumpulan yang berisi sub-protokol WebSocket yang didukung oleh objek MessageWebSocket. Properti SupportedProtocols berisi kumpulan sub-protokol WebSocket yang didukung oleh objek MessageWebSocket. Sebelum memanggil metode ConnectAsync (Windows. Foundation. Uri), string sub-protokol tambahan yang didukung dapat ditambahkan ke koleksi ini, yang akan dikirim ke server di header quotSec-WebSocket-Protocolquot selama jabat tangan WebSocket. Sub-protokol yang didukung bersama yang dipilih oleh server WebSocket kemudian akan terpapar pada properti Protokol. Upaya untuk menambahkan sub-protokol ke koleksi ini setelah panggilan yang berhasil ke metode ConnectAsync (Windows. Foundation. Uri) tidak akan menghasilkan kesalahan namun nilainya baru diabaikan. Namun, jika pemanggilan metode ConnectAsync (Windows. Foundation. Uri) atau operasi penyambungan selesai dengan kesalahan, aplikasi dapat memperbarui koleksi yang tersimpan di properti SupportedProtocols dan mencoba kembali pemanggilan metode ConnectAsync (Windows. Foundation. Uri) dan yang baru. Nilai akan diterapkan Keluarga perangkat Windows 10 (diperkenalkan v10.0.10240.0) Kontrak API Windows. Foundation. UniversalApiContract (diperkenalkan v1) Atribut Siaran Pers SEC Memperingatkan Investor Tentang Opsi Binatu dan Biaya Perusahaan Berbasis Siprus dengan Menjualnya Secara Ilegal di AS UNTUK SEGERA DITERBITKAN 2013-103 Washington , DC 6 Juni 2013 mdash Komisi Sekuritas dan Bursa hari ini memperingatkan investor tentang potensi risiko berinvestasi pada opsi biner dan telah menugaskan sebuah perusahaan yang berbasis di Siprus dengan menjualnya secara ilegal kepada investor AS. Opsi biner adalah sekuritas dalam bentuk opsi kontrak yang pembayarannya tergantung pada apakah aset dasar - misalnya kenaikan saham perusahaan atau penurunan nilai. Dalam struktur pembayaran semua atau tidak seperti apa, investor bertaruh mengenai kenaikan harga saham menghadapi dua kemungkinan hasil ketika kontrak berakhir: mereka menerima jumlah uang yang ditentukan sebelumnya jika nilai aset meningkat selama periode yang ditentukan, atau tidak Uang sama sekali kalau menurun. SEC menuduh bahwa Banc de Binary Ltd. telah menawarkan dan menjual opsi biner kepada investor di seluruh A. S. tanpa terlebih dahulu mendaftarkan sekuritas seperti yang dipersyaratkan dalam undang-undang sekuritas federal. Perusahaan telah secara luas meminta pelanggan A. S melalui iklan melalui video YouTube, e-mail spam, dan periklanan berbasis Internet lainnya. Perwakilan Banc de Binary telah berkomunikasi dengan investor secara langsung melalui telepon, e-mail, dan obrolan instant messenger. Banc de Binary juga telah bertindak sebagai broker saat menawarkan dan menjual sekuritas ini, namun gagal untuk mendaftarkan SEC sebagai broker sebagaimana disyaratkan oleh undang-undang A. S. SEC dan Commodity Futures Trading Commission (CFTC) hari ini mengeluarkan Investor Alert bersama untuk memperingatkan investor tentang skema promosi penipuan yang melibatkan opsi biner dan platform perdagangan opsi biner. Sebagian besar pasar opsi biner beroperasi melalui platform perdagangan berbasis Internet yang tidak harus sesuai dengan persyaratan peraturan A. S. yang berlaku dan mungkin terlibat dalam aktivitas ilegal. Hanya karena perusahaan asing dapat lebih mudah berkomunikasi dengan investor Amerika, tidak berarti mereka harus merancang undang-undang lama yang melindungi investor dengan meminta pendaftaran sekuritas, kata Andrew J. Ceresney, Co-Director dari SECs Division of Enforcement. Banc de Binary menghubungi investor A. S. melalui Internet dan YouTube namun sama sekali mengabaikan persyaratan pendaftaran undang-undang surat berharga A. S. Kami akan secara agresif memerangi perilaku semacam itu di mana pun asalnya. Menurut keluhan SEC terhadap Banc de Binary yang diajukan di pengadilan federal di Nevada, perusahaan tersebut mulai menawarkan dan menjual opsi biner kepada investor AS pada tahun 2010. Banc de Binary menginduksi investor untuk membuat akun dengan perusahaan, menyimpan uang ke akun tersebut, dan kemudian Membeli opsi biner yang aset dasarnya mencakup indeks saham dan saham. Permintaan Banc de Binary terhadap investor A. S. cukup berhasil dan menarik beberapa pelanggan dengan cara yang sangat sederhana. Misalnya, satu investor memiliki pendapatan bulanan 300 dan kekayaan bersih kurang dari 25.000, dan pelanggan lain didorong untuk menyetorkan dana tambahan ke akun perdagangan Banc de Binary-nya bahkan setelah dia memberi tahu perwakilan Banc de Binary bahwa dia menganggur dengan Kurang dari 1.000 di rekening gironya. Keluhan SEC mencari disgorgement ditambah dengan kepentingan prejudgment, denda finansial, dan perintah awal dan permanen terhadap Banc de Binary di antara bantuan lainnya. CFTC hari ini mengumumkan tindakan paralel melawan Banc de Binary. Investigasi SEC dilakukan oleh Leslie A. Hakala dan C. Dabney ORiordan dari Kantor Wilayah Los Angeles. Proses litigasi SEC akan dipimpin oleh John W. Berry dan Hakala. SEC menghargai bantuan dari CFTC dalam hal ini. Alert Investor pada opsi biner diterbitkan bersama oleh Kantor Pendidikan dan Advokasi Investor SECs dan Kantor Konsumen Consumer Outreach. Buletin ini membahas secara rinci potensi risiko berinvestasi pada opsi biner, dan memperingatkan investor bahwa mereka mungkin tidak memiliki pengamanan penuh dari undang-undang sekuritas federal dan komoditas jika mereka membeli opsi biner yang tidak terdaftar yang tidak tunduk pada pengawasan regulator A. S. Investor harus menyadari potensi kecurangan di bidang ini dan juga kenyataan bahwa mereka dapat kehilangan seluruh investasi mereka, kata Lori Schock, Direktur Kantor Pendidikan dan Advokasi Investor SEC. Kami sangat menganjurkan investor untuk memeriksa latar belakang broker dan penasihat dan platform perdagangan sebelum membuat keputusan untuk berinvestasi. Jika investor tidak dapat memperoleh informasi latar belakang sederhana seperti apakah profesional keuangan terdaftar di SEC atau FINRA, maka mereka harus sangat waspada. Materi TerkaitChapter 17. WebSocket WebSocket memungkinkan bidirectional, berorientasi pesan streaming teks dan data biner antara klien dan server. Ini adalah API terdekat ke soket jaringan mentah di browser. Kecuali koneksi WebSocket juga lebih dari sekadar soket jaringan, karena browser menggambarkan semua kerumitan di balik API sederhana dan menyediakan sejumlah layanan tambahan: Negosiasi koneksi dan perumusan kebijakan asal-usul yang sama Interoperabilitas dengan infrastruktur HTTP yang ada Komunikasi berorientasi pesan dan Frase pesan yang efisien Subprotocol negotiation and extensibility WebSocket adalah salah satu transport yang paling serbaguna dan fleksibel yang tersedia di browser. API sederhana dan minimal memungkinkan kita untuk memberi lapisan dan memberikan protokol aplikasi yang sewenang-wenang antara klien dan server dari muatan JSON sederhana ke format pesan biner kustom dalam mode streaming, di mana kedua belah pihak dapat mengirim data setiap saat. Namun, trade-off dengan protokol kustom adalah kebiasaan mereka. Aplikasi harus memperhitungkan pengelolaan negara, kompresi, caching, dan layanan lain yang hilang yang disediakan oleh browser. Selalu ada kendala desain dan kinerja trade-off, dan memanfaatkan WebSocket tidak terkecuali. Singkatnya, WebSocket bukan pengganti HTTP, XHR, atau SSE, dan untuk kinerja terbaik, sangat penting bahwa kita memanfaatkan kekuatan setiap transportasi. WebSocket adalah seperangkat beberapa standar: API WebSocket didefinisikan oleh W3C, dan protokol WebSocket (RFC 6455) dan ekstensinya ditentukan oleh HyBi Working Group (IETF). API WebSocket API WebSocket yang disediakan oleh browser sangat kecil dan sederhana. Sekali lagi, semua rincian rendah tentang manajemen koneksi dan pemrosesan pesan ditangani oleh browser. Untuk memulai koneksi baru, kita memerlukan URL sumber WebSocket dan beberapa callback aplikasi: Kirimkan isi Blob sebagai muatan biner API WebSocket menerima objek DOMString, yang dikodekan sebagai UTF-8 pada kabel, atau salah satu dari ArrayBuffer , ArrayBufferView, atau objek Blob untuk transfer biner. Namun, perhatikan bahwa opsi biner terakhir hanyalah kenyamanan API: pada kabel, bingkai WebSocket ditandai sebagai biner atau teks melalui satu bit tunggal. Makanya, jika aplikasi, atau server, membutuhkan informasi isi-isi lainnya tentang payload, maka mereka harus menggunakan mekanisme tambahan untuk mengkomunikasikan data ini. Metode send () asynchronous: data yang disediakan antri oleh klien, dan fungsi kembali segera. Akibatnya, terutama saat mentransfer muatan besar, jangan salahkan kembalinya cepat untuk sinyal bahwa data sudah terkirim Untuk memantau jumlah data yang antri oleh browser, aplikasi bisa query atribut bufferedAmount pada socket: Send the next Update jika buffer kosong Contoh sebelumnya mencoba untuk mengirim update aplikasi ke server, tapi hanya jika pesan sebelumnya telah dikeringkan dari buffer klien. Mengapa repot-repot dengan pemeriksaan seperti itu Semua pesan WebSocket dikirimkan sesuai urutan antriannya oleh klien. Akibatnya, sejumlah besar pesan antri, atau bahkan satu pesan besar, akan menunda pengiriman pesan yang antri di balik pemblokiran terdepan. Untuk mengatasi masalah ini, aplikasi dapat membagi pesan besar menjadi potongan yang lebih kecil, memantau bufferedAmount Nilai hati-hati untuk menghindari pemblokiran kepala-of-line, dan bahkan menerapkan antrian prioritasnya sendiri untuk pesan yang tertunda, bukan secara membabi buta mengantri mereka semua di stopkontak. Banyak aplikasi menghasilkan beberapa kelas pesan: pembaruan dengan prioritas tinggi, seperti lalu lintas kontrol, dan pembaruan dengan prioritas rendah, seperti transfer latar belakang. Untuk mengoptimalkan pengiriman, aplikasi harus memperhatikan bagaimana dan kapan setiap jenis pesan antri di soket Protokol WebSocket Subprotocol Negosiasi tidak membuat asumsi tentang format setiap pesan: satu bit melacak apakah pesan berisi teks atau data biner, Sehingga dapat diterjemahkan secara efisien oleh klien dan server, namun isi pesannya buram. Selanjutnya, tidak seperti permintaan HTTP atau XHR, yang mengkomunikasikan metadata tambahan melalui header HTTP dari setiap permintaan dan tanggapan, tidak ada mekanisme setara untuk pesan WebSocket. Akibatnya, jika tambahan metadata tentang pesan diperlukan, klien dan server harus setuju untuk menerapkan subprotocol mereka sendiri untuk mengkomunikasikan data ini: Klien dan server dapat menyetujui format pesan tetap terlebih dahulu. Semua komunikasi akan dilakukan melalui pesan JSON-encoded atau format biner khusus, dan metadata pesan yang diperlukan akan menjadi bagian dari struktur yang dikodekan. Jika klien dan server perlu mentransfer tipe data yang berbeda, maka mereka dapat menyetujui sebuah header pesan yang konsisten, yang dapat digunakan untuk mengkomunikasikan instruksi untuk memecahkan kode sisa muatan. Campuran teks dan pesan biner dapat digunakan untuk mengkomunikasikan muatan dan informasi metadata. Pesan teks dapat berkomunikasi setara dengan header HTTP, diikuti oleh pesan biner dengan payload aplikasi. Daftar ini hanya contoh kecil dari strategi yang mungkin. Fleksibilitas dan rendahnya biaya pesan WebSocket datang dengan biaya aplikasi tambahan. Namun, serialisasi pesan dan pengelolaan metadata hanyalah bagian dari masalah. Begitu kita menentukan format serialisasi untuk pesan kita, bagaimana kita memastikan bahwa baik klien dan server saling memahami, dan bagaimana kita menjaga sinkronisasi? Syukurlah, WebSocket menyediakan Sederhana dan mudah subprotocol negosiasi API untuk mengatasi masalah kedua. Klien dapat mengiklankan protokol mana yang didukungnya ke server sebagai bagian dari koneksi awal jabat tangan: Array subprotocol untuk mengiklankan selama jabat tangan WebSocket Periksa subprotocol yang dipilih oleh server Seperti contoh sebelumnya, konstruktor WebSocket menerima daftar nama subprotocol opsional. , Yang memungkinkan klien untuk mengiklankan daftar protokol yang dimengerti atau bersedia digunakan untuk koneksi ini. Daftar yang ditentukan dikirim ke server, dan server diizinkan untuk memilih salah satu protokol yang diiklankan oleh klien. Jika negosiasi subprotocol berhasil, maka callback onopen dipecat pada klien, dan aplikasi dapat mengaitkan atribut protokol pada objek WebSocket untuk menentukan protokol yang dipilih. Di sisi lain, jika server tidak mendukung protokol klien yang diiklankan oleh klien, maka jabat tangan WebSocket tidak lengkap: callback onerror dipanggil, dan koneksi dihentikan. Nama subprotocol didefinisikan oleh aplikasi dan dikirim seperti yang ditentukan ke server selama jabat tangan HTTP awal. Lain maka itu, subprotocol yang ditentukan tidak berpengaruh pada inti WebSocket API. Protokol WebSocket Protokol WebSocket wire (RFC 6455) yang dikembangkan oleh HyBi Working Group terdiri dari dua komponen tingkat tinggi: jabat tangan HTTP pembuka yang digunakan untuk menegosiasikan parameter koneksi dan mekanisme framing pesan biner untuk memungkinkan overhead rendah, pesan - Berbasis pengiriman data teks dan biner. Protokol WebSocket mencoba untuk mengatasi tujuan teknologi HTTP bidirectional yang ada dalam konteks infrastruktur HTTP yang ada, dirancang untuk bekerja di atas port HTTP 80 dan 443 Namun, desain tidak membatasi WebSocket ke HTTP, dan implementasi di masa depan dapat dilakukan. Gunakan jabat tangan sederhana di atas port khusus tanpa menemukan kembali keseluruhan protokol. - Protokol WebSocket Protocol RFC 6455 WebSocket adalah protokol standalone yang berfungsi penuh yang dapat digunakan di luar browser. Karena itu, aplikasi utamanya adalah sebagai bidirectional transport untuk aplikasi berbasis browser. Binary Framing Layer Aplikasi client dan server WebSocket berkomunikasi melalui API yang berorientasi pada pesan: pengirim menyediakan muatan UTF-8 atau biner sewenang-wenang, dan penerima diberi tahu akan pengirimannya bila seluruh pesan tersedia. Untuk mengaktifkannya, WebSocket menggunakan format biner biner khusus (Gambar 17-1), yang membagi setiap pesan aplikasi ke dalam satu atau beberapa frame. Mengangkut mereka ke tujuan, memasang kembali mereka, dan akhirnya memberitahukan penerima begitu seluruh pesan telah diterima. Gambar 17-1. Frame WebSocket: Frame Bingkai 214 byte Unit komunikasi terkecil, masing-masing berisi header bingkai dengan panjang variabel dan muatan yang bisa membawa semua atau sebagian pesan aplikasi. Pesan Urutan lengkap frame yang memetakan ke pesan aplikasi logis. Keputusan untuk memecah pesan aplikasi ke dalam beberapa frame dibuat dengan penerapan dasar kode framing klien dan server. Oleh karena itu, aplikasi tetap tidak menyadari frame WebSocket individual atau bagaimana pembingkaian dilakukan. Karena itu, masih berguna untuk memahami sorotan tentang bagaimana masing-masing bingkai WebSocket terwakili di kawat: Bit pertama dari setiap frame (FIN) menunjukkan apakah frame tersebut merupakan fragmen akhir dari sebuah pesan. Pesan hanya terdiri dari satu bingkai saja. Opcode (4 bit) menunjukkan jenis frame yang ditransfer: teks (1) atau biner (2) untuk mentransfer data aplikasi atau bingkai kontrol seperti koneksi dekat (8), ping (9), dan pong (10) untuk koneksi liveness Cek. Bit topeng menunjukkan apakah payload itu bertopeng (untuk pesan yang dikirim dari client ke server saja). Panjang payload diwakili sebagai field variable-length: Jika 0125, maka itu adalah payload length. Jika 126, maka 2 byte berikut mewakili bilangan bulat unsigned 16-bit yang menunjukkan panjang bingkai. Jika 127, maka 8 byte berikut mewakili bilangan bulat unsigned 64-bit yang menunjukkan panjang bingkai. Kunci masking berisi nilai 32-bit yang digunakan untuk menutupi muatan. Payload berisi data aplikasi dan data ekstensi khusus jika klien dan server menegosiasikan perpanjangan saat sambungan dibuat. Payload dari semua frame yang dimulai oleh klien bertopeng menggunakan nilai yang ditentukan di header frame: ini mencegah skrip berbahaya dijalankan pada klien dari melakukan serangan peracunan cache terhadap perantara yang mungkin tidak mengerti protokol WebSocket. Untuk rincian lengkap dari serangan ini, lihat Berbicara dengan Diri Anda untuk Kesenangan dan Prot. Dipresentasikan pada W2SP 2011. Akibatnya, setiap frame WebSocket yang dikirim server menghasilkan 210 bytes dari overhead framing. Klien juga harus mengirim kunci masking, yang menambahkan tambahan 4 byte ke header, menghasilkan 614 byte di atas overhead. Tidak ada metadata lain, seperti bidang header atau informasi lainnya tentang payload, tersedia: semua komunikasi WebSocket dilakukan dengan menukar frame yang memperlakukan muatan sebagai gumpalan buram data aplikasi. WebSocket Multiplexing dan Head-of-Line Blocking WebSocket rentan terhadap pemblokiran head-of-line: pesan dapat dipecah menjadi satu atau lebih frame, namun frame dari pesan yang berbeda tidak dapat disisipkan, karena tidak ada yang setara dengan ID arus yang ditemukan di Mekanisme framing HTTP2 melihat Streaming, Pesan, dan Bingkai). Akibatnya, sebuah pesan besar, bahkan saat dipecah menjadi beberapa bingkai WebSocket, akan memblokir pengiriman frame yang terkait dengan pesan lainnya. Jika aplikasi Anda mengirimkan data sensitif latensi, berhati-hatilah dengan ukuran muatan masing-masing pesan dan pertimbangkan untuk membelah pesan besar ke beberapa pesan aplikasi Kurangnya multiplexing pada spesifikasi WebSocket inti juga berarti bahwa setiap koneksi WebSocket memerlukan koneksi TCP khusus, yang mungkin Menjadi masalah potensial untuk penyebaran HTTP1.x karena jumlah koneksi yang dibatasi per asal yang dikelola oleh browser melihat Melelahkan Klien dan Sumber Daya Server. Sisi penyegaran Multiplexing baru untuk WebSockets yang dikembangkan oleh HyBi Working Group membahas keterbatasan terakhir: Dengan perpanjangan ini, satu koneksi TCP dapat menyediakan beberapa koneksi WebSocket virtual dengan merangkum frame yang ditandai dengan ID saluran Ekstensi multiplexing mempertahankan saluran logis terpisah. , Masing-masing menyediakan sepenuhnya ekuivalen logis dari koneksi WebSocket independen, termasuk jabat tangan yang terpisah. - WebSocket Multiplexing (Draft 10) Dengan ekstensi ini, beberapa koneksi WebSocket (saluran) dapat multiplexing melalui koneksi TCP yang sama. Namun, setiap saluran individu masih rentan terhadap pemblokiran utama, Oleh karena itu, satu solusi potensial adalah menggunakan saluran yang berbeda, atau koneksi TCP khusus, untuk multipleks banyak pesan secara paralel. Akhirnya, perhatikan bahwa ekstensi sebelumnya hanya diperlukan untuk koneksi HTTP1.x. Meskipun tidak ada spesifikasi resmi yang tersedia untuk mengangkut frame WebSocket dengan HTTP2, hal itu akan menjadi lebih mudah: HTTP2 memiliki multiplexing stream terintegrasi, dan beberapa koneksi WebSocket dapat diangkut dalam satu sesi dengan merangkum frame WebSocket dalam mekanisme framing HTTP2. Protokol Ekstensi Spesifikasi WebSocket memungkinkan ekstensi protokol: format kawat dan semantik protokol WebSocket dapat diperluas dengan bidang opcode dan data baru. Meskipun agak tidak biasa, ini adalah fitur yang sangat hebat, karena memungkinkan klien dan server untuk menerapkan fungsionalitas tambahan di atas lapisan framing WebSocket dasar tanpa memerlukan intervensi atau kerjasama dari kode aplikasi. Apa saja beberapa contoh ekstensi protokol WebSocket Kelompok Kerja HyBi, yang bertanggung jawab atas pengembangan spesifikasi WebSocket, mencantumkan dua ekstensi resmi dalam pengembangan: Ekstensi Multiplexing untuk WebSockets Ekstensi ini menyediakan cara untuk koneksi WebSocket logis yang terpisah untuk berbagi yang mendasarinya. Koneksi transportasi Kompresi Ekstensi untuk WebSocket Kerangka kerja untuk membuat ekstensi WebSocket yang menambahkan fungsionalitas kompresi ke Protokol WebSocket. Seperti yang telah kita catat sebelumnya, setiap koneksi WebSocket memerlukan koneksi TCP khusus, yang tidak efisien. Ekstensi multiplex mengatasi masalah ini dengan memperluas setiap bingkai WebSocket dengan ID saluran tambahan untuk memungkinkan beberapa kanal WebSocket virtual berbagi satu koneksi TCP. Demikian pula, spesifikasi WebSocket dasar tidak menyediakan mekanisme atau ketentuan untuk kompresi data yang ditransfer: setiap frame membawa data muatan seperti yang disediakan oleh aplikasi. Akibatnya, sementara ini mungkin tidak menjadi masalah bagi struktur data biner yang dioptimalkan, ini dapat menghasilkan overhead transfer byte tinggi kecuali jika aplikasi menerapkan kompresi data dan logika dekompresi sendiri. Akibatnya, ekstensi kompresi memungkinkan negosiasi transfer-encoding setara yang disediakan oleh HTTP. Untuk mengaktifkan satu atau beberapa ekstensi, klien harus mengiklankannya di julukan Upgrade awal, dan server harus memilih dan mengakui ekstensi yang akan digunakan untuk masa pakai koneksi yang dinegosiasikan. Untuk contoh langsung, sekarang mari kita lihat sekilas urutan Upgrade. WebSocket Multiplexing dan Compression in the Wild Pada pertengahan 2013, multiplexing WebSocket belum didukung oleh browser populer manapun. Demikian pula, ada dukungan terbatas untuk kompresi: Google Chrome dan browser WebKit terbaru dapat mengiklankan ekstensi x-webkit-deflate-frame ke server. Namun, deflate-frame didasarkan pada revisi standar yang sudah ketinggalan zaman dan akan tidak berlaku lagi di masa depan. Sesuai namanya, per-frame memampatkan muatan payload secara frame-by-frame, yang merupakan suboptimal untuk pesan besar yang mungkin terbagi antara beberapa frame. Akibatnya, revisi terbaru dari ekstensi kompresi telah beralih ke pesan kompresi per pesan. Kabar buruknya adalah kompresi per-pesan masih eksperimental dan belum tersedia di browser populer manapun. Akibatnya, aplikasi harus memperhatikan jenis isi data yang ditransfer dan menerapkan kompresinya sendiri jika memungkinkan. Itu, setidaknya sampai dukungan kompresi WebSocket asli tersedia secara luas di semua browser populer. Hal ini sangat penting untuk aplikasi mobile, di mana setiap byte yang tidak perlu membawa biaya tinggi kepada pengguna. Negosiasi Upgrade HTTP Protokol WebSocket memberikan banyak fitur canggih: komunikasi berorientasi pesan, lapisan pembatas binernya sendiri, negosiasi subprotocol, ekstensi protokol opsional, dan lainnya. Akibatnya, sebelum ada pesan yang bisa ditukar, klien dan server harus menegosiasikan parameter yang sesuai untuk menjalin koneksi. Memanfaatkan HTTP untuk melakukan jabat tangan menawarkan beberapa kelebihan. Pertama, ini membuat WebSockets kompatibel dengan infrastruktur HTTP yang ada: Server WebSocket dapat berjalan di port 80 dan 443, yang sering merupakan satu-satunya port terbuka untuk klien. Kedua, ini memungkinkan kita untuk menggunakan kembali dan memperpanjang aliran Upgrade HTTP dengan header WebSocket kustom untuk melakukan negosiasi: Sec-WebSocket-Version Dikirim oleh klien untuk memberi tanda versi (13 untuk RFC6455) dari protokol WebSocket yang ingin digunakannya. Jika server tidak mendukung versi client, maka ia harus membalas dengan daftar versi yang didukung. Sec-WebSocket-Key Kunci otomatis yang dikirim oleh klien, yang bertindak sebagai tantangan bagi server untuk membuktikan bahwa server mendukung versi protokol yang diminta. Respons Sec-WebSocket-Accept Server yang berisi nilai masuk Sec-WebSocket-Key, membuktikan bahwa ia memahami versi protokol yang diminta. Sec-WebSocket-Protocol Digunakan untuk menegosiasikan aplikasi subprotocol: klien mengiklankan daftar server protokol yang didukung harus membalas dengan satu nama protokol tunggal. Sec-WebSocket-Extensions Digunakan untuk menegosiasikan ekstensi WebSocket yang akan digunakan untuk koneksi ini: klien mengiklankan ekstensi yang didukung, dan server mengkonfirmasikan satu atau beberapa ekstensi dengan mengembalikan header yang sama. Dengan itu, kami sekarang memiliki semua bagian yang diperlukan untuk melakukan Upgrade HTTP dan menegosiasikan koneksi WebSocket baru antara klien dan server: Semua server WebSocket yang kompatibel dengan RFC6455 menggunakan algoritma yang sama untuk menghitung jawaban atas tantangan klien: isi dari Sec-WebSocket-Key digabungkan dengan string GUID unik yang didefinisikan dalam standar, hash SHA1 dihitung, dan string yang dihasilkan adalah basis-64 yang dikodekan dan dikirim kembali ke klien. Minimal, handshake WebSocket yang sukses harus berisi versi protokol dan nilai tantangan yang dihasilkan secara otomatis yang dikirim oleh klien, diikuti oleh kode respons HTTP 101 (Switching Protocols) dari server dengan tantangan tantangan-tantangan untuk mengkonfirmasi protokol yang dipilih. Versi: Klien harus mengirim Sec-WebSocket-Version dan Sec-WebSocket-Key. Server harus mengkonfirmasi protokol tersebut dengan mengembalikan Sec-WebSocket-Accept. Klien dapat mengirimkan daftar subprotocol aplikasi melalui Protokol Sec-WebSocket. Server harus memilih salah satu subprotocol yang diiklankan dan mengembalikannya melalui Protokol Sec-WebSocket. Jika server tidak mendukung apapun, maka koneksi dibatalkan. Klien dapat mengirim daftar ekstensi protokol di Sec-WebSocket-Extensions. Server dapat mengonfirmasi satu atau beberapa ekstensi yang dipilih melalui Sec-WebSocket-Extensions. Jika tidak ada ekstensi yang disediakan, maka koneksi akan berlanjut tanpa mereka. Akhirnya, setelah jabat tangan sebelumnya selesai, dan jika jabat tangan berhasil, koneksi sekarang dapat digunakan sebagai saluran komunikasi dua arah untuk bertukar pesan WebSocket. Dari sini, tidak ada komunikasi HTTP eksplisit lainnya antara klien dan server, dan protokol WebSocket mengambil alih. Proxy, Perantara, dan WebSockets Dalam praktiknya, untuk alasan keamanan dan kebijakan, banyak pengguna memiliki port terbatas yang dibatasi port 80 (HTTP), dan port 443 (HTTPS). Akibatnya, negosiasi WebSocket dilakukan melalui aliran Upgrade HTTP untuk memastikan kompatibilitas terbaik dengan kebijakan dan infrastruktur jaringan yang ada. Namun, seperti yang telah kami catat sebelumnya di Proxy, Perantara, TLS, dan Protokol Baru di Web. Banyak perantara HTTP yang ada mungkin tidak mengerti protokol WebSocket yang baru, yang dapat menyebabkan berbagai kasus kegagalan: peningkatan koneksi buta, buffer frame WebSocket yang tidak disengaja, modifikasi konten tanpa pemahaman protokol, kesalahan klasifikasi lalu lintas WebSocket sebagai koneksi HTTP yang terganggu, dan Begitu seterusnya Kunci WebSocket Key dan Accept menangani beberapa masalah ini: ini adalah kebijakan keamanan terhadap server dan perantara yang mungkin secara membabi buta meningkatkan koneksi tanpa benar-benar memahami protokol WebSocket. Namun, sementara tindakan pencegahan ini menangani beberapa masalah penyebaran dengan proxy eksplisit, namun ini tidak mencukupi untuk proxy transparan, yang dapat menganalisis dan memodifikasi data di kawat tanpa pemberitahuan. Solusi Menetapkan tunneli. e end-to-end yang aman. Gunakan WSS Dengan menegosiasikan sesi TLS sebelum melakukan jabat tangan Upgrade HTTP, klien dan server membuat terowongan terenkripsi, yang menyelesaikan semua masalah yang tercatat sebelumnya. Hal ini terutama berlaku untuk klien mobile, yang lalu lintasnya sering melewati berbagai layanan proxy yang mungkin tidak sesuai dengan WebSocket. Penggunaan WebSocket Kasus dan Kinerja WebSocket API menyediakan antarmuka sederhana untuk bidirectional, berorientasi pesan streaming teks dan data biner antara klien dan server: masuk ke URL WebSocket ke konstruktor, siapkan beberapa fungsi panggil balik JavaScript, dan kami siap dan Runningthe sisanya ditangani oleh browser. Tambahkan ke protokol WebSocket, yang menawarkan negosiasi biner, ekstensibility, dan subprotocol, dan WebSocket menjadi sangat sesuai untuk mengirimkan protokol aplikasi kustom di browser. Namun, sama seperti dengan diskusi tentang kinerja, sementara kompleksitas implementasi protokol WebSocket disembunyikan dari aplikasi, namun demikian, ada implikasi kinerja yang penting untuk bagaimana dan kapan WebSocket harus digunakan. WebSocket bukan pengganti XHR atau SSE, dan untuk performa terbaik, sangat penting bahwa kita memanfaatkan kekuatan masing-masing transportasi. Lihat Kasus dan Kinerja XHR dan Kasus dan Kinerja Gunakan SSE untuk meninjau karakteristik kinerja masing-masing transportasi. Permintaan dan Tanggapan Streaming WebSocket adalah satu-satunya transportasi yang memungkinkan komunikasi dua arah melalui koneksi TCP yang sama (Gambar 17-2): klien dan server dapat bertukar pesan sesuka hati. Akibatnya, WebSocket memberikan pengiriman teks dan data aplikasi biner yang rendah ke dua arah. Gambar 17-2. Aliran komunikasi XHR, SSE, dan WebSocket XHR dioptimalkan untuk komunikasi permintaan-respons transaksional: klien mengirimkan permintaan HTTP yang lengkap dan terbentuk dengan baik ke server, dan server merespons dengan respon penuh. Tidak ada dukungan untuk streaming permintaan, dan sampai API Streaming tersedia, tidak ada algoritma pelacakan respons lintas-pengguna yang dapat diandalkan. SSE memungkinkan streaming data berbasis data server-to-client yang efisien dan low-latency: klien memulai koneksi SSE, dan server menggunakan protokol sumber acara untuk melakukan streaming pembaruan ke klien. Klien tidak dapat mengirimkan data ke server setelah jabat tangan awal. Propagasi dan Antrian Latency Switching transport dari XHR ke SSE atau WebSocket tidak mengurangi perjalanan pulang-pergi antara klien dan server Terlepas dari transportasi, latensi propagasi dari paket data adalah sama. Namun, selain latency propagasi, ada juga latensi antrian. Waktu pesan harus menunggu di klien atau server sebelum bisa diarahkan ke pihak lain. Dalam kasus pemungutan suara XHR, latency antrian adalah fungsi dari interval polling klien: pesan mungkin tersedia di server, namun tidak dapat dikirim sampai permintaan XHR klien berikutnya melihat Pemodelan Kinerja Polling XHR. Sebaliknya, SSE dan WebSocket menggunakan koneksi yang terus-menerus, yang memungkinkan server mengirimkan pesan (dan klien, dalam kasus WebSocket), saat tersedia. Akibatnya, pengiriman latency rendah untuk SSE dan WebSocket secara khusus mengacu pada penghapusan latency pesan antrian. Kami belum menemukan cara membuat paket data WebSocket berjalan lebih cepat daripada kecepatan pesan Message Overhead Setelah koneksi WebSocket terjalin, data pertukaran klien dan server melalui protokol WebSocket: pesan aplikasi dibagi menjadi satu atau beberapa frame, masing-masing Yang menambahkan dari 2 sampai 14 byte overhead. Selanjutnya, karena pembingkaian dilakukan melalui format biner khusus, data aplikasi UTF-8 dan biner dapat dikodekan secara efisien melalui mekanisme yang sama. Bagaimana membandingkannya dengan XHR dan SSE SSE menambahkan sesedikit 5 byte per pesan namun dibatasi pada konten UTF-8 hanya melihat Event Stream Protocol. Permintaan HTTP1.x (XHR atau sebaliknya) akan membawa tambahan 500800 byte metadata HTTP, ditambah cookies see Measurement and Controlling Protocol Overhead. HTTP2 memampatkan metadata HTTP, yang secara signifikan mengurangi overhead melihat Header Compression. Sebenarnya, jika header tidak berubah antara permintaan, overhead bisa serendah 8 byte Perlu diingat bahwa nomor overhead ini tidak mencakup overhead dari framing IP, TCP, dan TLS, yang menambahkan 60100 byte overhead gabungan per Pesan, terlepas dari protokol aplikasi lihat Ukuran Rekam TLS. Efisiensi Data dan Kompresi Setiap permintaan XHR dapat menegosiasikan format pengkodean transfer yang optimal (misalnya gzip untuk data berbasis teks), melalui negosiasi HTTP reguler. Demikian pula, karena SSE terbatas pada transfer UTF-8 saja, data arus acara dapat dikompres secara efisien dengan menerapkan gzip di seluruh sesi. Dengan WebSocket, situasinya lebih kompleks: WebSocket dapat mentransfer teks dan data biner, dan hasilnya tidak masuk akal untuk memampatkan seluruh sesi. Beban biner dapat dikompres. Akibatnya, WebSocket harus menerapkan mekanisme kompresi sendiri dan secara selektif menerapkannya pada setiap pesan. Kabar baiknya adalah kelompok kerja HyBi sedang mengembangkan ekstensi kompresi per-pesan untuk protokol WebSocket. Namun, ini belum tersedia di browser manapun. Akibatnya, kecuali jika aplikasi menerapkan logika kompresi sendiri dengan mengoptimalkan secara hati-hati muatan binernya (lihat Penguraian Data Biner dengan JavaScript) dan menerapkan logika kompresi sendiri untuk pesan berbasis teks, mungkin akan dikenakan overhead byte tinggi pada data yang ditransfer. Chrome dan Beberapa browser berbasis WebKit mendukung revisi lama (kompresi per frame) dari ekstensi kompresi ke protokol WebSocket melihat WebSocket Multiplexing and Compression in the Wild. Protokol Aplikasi Kustom Browser dioptimalkan untuk transfer data HTTP: ia mengerti protokolnya, dan menyediakan beragam layanan, seperti otentikasi, caching, kompresi, dan banyak lagi. Akibatnya, permintaan XHR mewarisi semua fungsi ini secara gratis. By contrast, streaming allows us to deliver custom protocols between client and server, but at the cost of bypassing many of the services provided by the browser: the initial HTTP handshake may be able to perform some negotiation of the parameters of the connection, but once the session is established, all further data streamed between the client and server is opaque to the browser. As a result, the flexibility of delivering a custom protocol also has its downsides, and the application may have to implement its own logic to fill in the missing gaps: caching, state management, delivery of message metadata, and so on The initial HTTP Upgrade handshake does allow the server to leverage the existing HTTP cookie mechanism to validate the user. If the validation fails, the server can decline the WebSocket upgrade. Leveraging Browser and Intermediary Caches Using regular HTTP has significant advantages. Ask yourself a simple question: would the client benefit from caching the received data Or could an intermediary optimize the delivery of the asset if it could cache it For example, WebSocket supports binary transfers, which allows the application to stream arbitrary image formats with no overheadnice win However, the fact that the image is delivered within a custom protocol means that it wont be cached by the browser cache, or any intermediary (e. g. a CDN). As a result, you may incur unnecessary transfers to the client and much higher traffic to the origin servers. The same logic applies to all other data formats: video, text, and so on. As a result, make sure you choose the right transport for the job A simple but effective strategy to address these concerns could be to use the WebSocket session to deliver non-cacheable data, such as real-time updates and application control messages, which can trigger XHR requests to fetch other assets via the HTTP protocol. Deploying WebSocket Infrastructure HTTP is optimized for short and bursty transfers. As a result, many of the servers, proxies, and other intermediaries are often configured to aggressively timeout idle HTTP connections, which, of course, is exactly what we dont want to see for long-lived WebSocket sessions. To address this, there are three pieces to consider: Routers, load-balancers, and proxies within own network Transparent and explicit proxies in external network (e. g. ISP and carrier proxies) Routers, firewalls, and proxies within the clients network We have no control over the policy of the clients network. In fact, some networks may block WebSocket traffic entirely, which is why you may need a fallback strategy. Similarly, we dont have control over the proxies on the external network. However, this is where TLS may help By tunneling over a secure end-to-end connection, WebSocket traffic can bypass all the intermediate proxies. Using TLS does not prevent the intermediary from timing out an idle TCP connection. However, in practice, it significantly increases the success rate of negotiating the WebSocket session and often also helps to extend the connection timeout intervals. Finally, there is the infrastructure that we deploy and manage ourselves, which also often requires attention and tuning. As easy as it is to blame the client or external networks, all too often the problem is close to home. Each load-balancer, router, proxy, and web server in the serving path must be tuned to allow long-lived connections. For example, Nginx 1.3.13 can proxy WebSocket traffic, but defaults to aggressive 60-second timeouts To increase the limit, we must explicitly define the longer timeouts: 60-minute inactivity timeout for tunnels The gotcha with the preceding example is the extra tunnel timeout. In HAProxy the connect. client. and server timeouts are applied only to the initial HTTP Upgrade handshake, but once the upgrade is complete, the timeout is controlled by the tunnel value. Nginx and HAProxy are just two of hundreds of different servers, proxies, and load balancers running in our data centers. We cant enumerate all the configuration possibilities in these pages. The previous examples are just an illustration that most infrastructure requires custom configuration to handle long-lived sessions. Hence, before implementing application keepalives, double-check your infrastructure first. Long-lived and idle sessions occupy memory and socket resources on all the intermediate servers. Hence, short timeouts are often justified as a security, resource, and operational precaution. Deploying WebSocket, SSE, and HTTP2, each of which relies on long-lived sessions, brings its own class of new operational challenges. Performance Checklist Deploying a high-performance WebSocket service requires careful tuning and consideration, both on the client and on the server. A short list of criteria to put on the agenda: Use secure WebSocket (WSS over TLS) for reliable deployments. Pay close attention to polyfill performance (if necessary). Leverage subprotocol negotiation to determine the application protocol. Optimize binary payloads to minimize transfer size. Consider compressing UTF-8 content to minimize transfer size. Set the right binary type for received binary payloads. Monitor the amount of buffered data on the client. Split large application messages to avoid head-of-line blocking. Leverage other transports where applicable. Last, but definitely not least, optimize for mobile Real-time push can be a costly performance anti-pattern on mobile handsets, where battery life is always at a premium. Thats not to say that WebSocket should not be used on mobile. To the contrary, it can be a highly efficient transport, but make sure to account for its requirements :class WebSocket Description This class implements a WebSocket according to the WebSocket protocol specification in RFC 6455. Both client-side and server-side WebSockets are supported. Server-side WebSockets are usually created from within a HTTPRequestHandler. Client-side WebSockets are created using a HTTPClientSession. Note that special frames like PING must be handled at application level. In the case of a PING, a PONG message must be returned. Inheritance Member Summary Enumerations These error codes can be obtained from a WebSocketException to determine the exact cause of the error. No Connection: Upgrade or Upgrade: websocket header in handshake request. int receiveFrame( void buffer, int length, int amp flags ) Receives a frame from the socket and stores it in buffer. Up to length bytes are received. If the frames payload is larger, a WebSocketException is thrown and the WebSocket connection must be terminated. Returns the number of bytes received. A return value of 0 means that the peer has shut down or closed the connection. Throws a TimeoutException if a receive timeout has been set and nothing is received within that interval. Throws a NetException (or a subclass) in case of other errors. The frame flags and opcode (FrameFlags and FrameOpcodes ) is stored in flags. int sendFrame( const void buffer, int length, int flags FRAMETEXT ) Sends the contents of the given buffer through the socket as a single frame. Values from the FrameFlags. FrameOpcodes and SendFlags enumerations can be specified in flags. Returns the number of bytes sent, which may be less than the number of bytes specified. Certain socket implementations may also return a negative value denoting a certain condition. Sends a Close control frame to the server end of the connection to initiate an orderly shutdown of the connection. void shutdown( Poco::UInt16 statusCode, const std::string amp statusMessage ) Sends a Close control frame to the server end of the connection to initiate an orderly shutdown of the connection. menerima
Comments
Post a Comment