Rumah > Artikel > hujung hadapan web > Adakah penyemak imbas menyokong WebTransport? Bolehkah ia menggantikan WebSockets?
Banyak aplikasi, seperti permainan dan siaran langsung, memerlukan mekanisme untuk menghantar mesej secepat mungkin sambil menerima kaedah penghantaran data yang tidak teratur dan tidak boleh dipercayai. Walaupun aplikasi asli boleh menggunakan soket UDP mentah, ini tidak tersedia di web kerana ia tidak mempunyai penyulitan, kawalan kesesakan dan mekanisme persetujuan untuk menghantar (untuk mengelakkan serangan DDoS).
Biasanya, aplikasi web yang memerlukan pertukaran aliran data dua hala antara klien dan pelayan boleh bergantung pada WebSockets, protokol berasaskan mesej yang serasi dengan model keselamatan web. Walau bagaimanapun, kerana WebSockets ialah satu aliran mesej yang boleh dipercayai, tersusun, ia tertakluk pada penyekatan kepala baris (HOLB), yang bermaksud bahawa semua mesej mesti dihantar dan diterima mengikut susunan, walaupun ia bebas antara satu sama lain.
Ini menjadikan WebSockets kurang sesuai untuk aplikasi yang mengorbankan kebolehpercayaan dan menstrim kebebasan untuk meningkatkan prestasi.
Protokol WebTransport menyediakan satu objek pengangkutan untuk tujuan ini, yang mengabstrakkan protokol asas tertentu dengan set keupayaan yang fleksibel, termasuk strim sehala, dua hala yang boleh dipercayai dan keupayaan datagram yang tidak boleh dipercayai.
WebTransport ialah rangka kerja protokol untuk menghantar dan menerima data daripada pelayan menggunakan HTTP3. Sama seperti WebSockets, tetapi menyokong berbilang aliran, aliran sehala, penghantaran luar pesanan, dan menyokong kaedah penghantaran data yang boleh dipercayai dan tidak boleh dipercayai.
WebTransport ialah API Web yang menggunakan protokol HTTP/3 untuk mencapai penghantaran dua arah. Ia digunakan sebagai mekanisme komunikasi dua hala antara pelanggan dan pelayan HTTP/3. Menyokong penghantaran data yang tidak boleh dipercayai melalui API datagram, dan menyokong API penstriman untuk penghantaran data yang boleh dipercayai. Pada masa yang sama, tutup sambungan sedia ada dalam senario di mana pelanggan dan pelayan tidak perlu menyambung.
2.1 Mod Datagram
Mod datagram sesuai untuk menghantar dan menerima. Data yang dihantar perlu dijamin dengan ketat. Saiz satu paket dihadkan oleh unit penghantaran maksimum sambungan asas, jadi penghantaran tidak dijamin dan, jika berjaya, mungkin tiba dalam sebarang pesanan. Sifat ini menjadikan API Datagram sesuai untuk penghantaran kependaman rendah dan usaha terbaik. Fikirkan pemindahan data sebagai mesej Protokol Datagram Pengguna (UDP), tetapi dengan penyulitan dan kawalan kesesakan.
// 发送数据报 const writer = transport.datagrams.writable.getWriter(); const data1 = new Uint8Array([65, 66, 67]); const data2 = new Uint8Array([68, 69, 70]); // Uint8Array writer.write(data1); writer.write(data2); // 从服务器读取数据报 const reader = transport.datagrams.readable.getReader(); while (true) { const {value, done} = await reader.read(); // done则退出 if (done) { break; } // 值为 Uint8Array。 console.log(value); }
2.2 Kaedah API Penstriman
API Penstriman menyediakan penghantaran data yang boleh dipercayai dan teratur, yang sangat sesuai untuk menghantar atau menerima Satu atau senario aliran data yang lebih teratur. Menggunakan berbilang aliran WebTransport adalah serupa dengan mewujudkan berbilang sambungan TCP, tetapi kerana HTTP/3 menggunakan protokol QUIC yang ringan di bawah hud, kos membuat dan menutup sambungan adalah lebih rendah.
Hantar strim
// 发送Uint8Array const stream = await transport.createSendStream(); const writer = stream.writable.getWriter(); const data1 = new Uint8Array([65, 66, 67]); const data2 = new Uint8Array([68, 69, 70]); // 实例化Uint8Array writer.write(data1); writer.write(data2); try { await writer.close(); // 所有数据已经传输 // await writer.abort(); // 如果调用abort并非所有数据都写入 } catch (error) { console.error(`An error occurred: ${error}`); }
Baca strim
async function readFrom(receiveStream) { const reader = receiveStream.readable.getReader(); while (true) { const {done, value} = await reader.read(); if (done) { break; } // 值为 Uint8Array console.log(value); } } const rs = transport.receiveStreams(); // 返回一个 ReadableStream,ReadableStream 的每个块又是一个 ReceiveStream // 用于读取服务器发送的 Uint8Array 实例 const reader = rs.getReader(); while (true) { const {done, value} = await reader.read(); if (done) { break; } // 值为 ReceiveStream 的一个实例 await readFrom(value); }
Strim dua hala
Strim dwiarah boleh dibuat oleh pelayan atau klien:
async function setUpBidirectional() { const stream = await transport.createBidirectionalStream(); // stream 是 WebTransportBidirectionalStream // stream.readable是ReadableStream const readable = stream.readable; // stream.writable是WritableStream const writable = stream.writable; }
Anda boleh menggunakan kaedah
receiveBidirectionalStreams() daripada contoh WebTransport Mendengarkan Aliran Dua Arah yang dicipta oleh pelayan, kaedah ini mengembalikan Aliran Boleh Dibaca. Setiap bahagian ReadableStream ini pula adalah DwiarahStream.
const rs = transport.receiveBidrectionalStreams();const reader = rs.getReader();while (true) { const {done, value} = await reader.read(); if (done) { break; } // value 是 BidirectionalStream // value.readable 是 ReadableStream // value.writable 是 WritableStream}
3.1 Sejarah pembangunan Pengangkutan Web
Pengangkutan Web mula dicadangkan sekitar sekitar Mei 2019. Kemas kini terkini adalah pada 24 Januari 2023. Oleh itu, jika dilihat dari masa kemas kini dan kekerapan kemas kini, protokol masih dalam Ia adalah tempoh perubahan dan pembangunan pesat, tetapi ia patut mendapat perhatian berterusan daripada pemaju.
3.2 Sokongan penyemak imbas
Pada masa ini, kadar sokongan penyemak imbas keseluruhan WebTransport telah mencapai kira-kira 70.29%, Chrome>=97, Edge>=98, Opera> ;=83 dan penyemak imbas arus perdana yang lain sudah menyokongnya Kecuali untuk Firefox, versi 111 terbaharu belum lagi menyokongnya.
WebSockets dimodelkan mengikut aliran mesej tunggal, boleh dipercayai, teratur dan mempunyai banyak senario aplikasi. Sudah tentu, ciri ini juga disediakan oleh API penstriman WebTransport. Sebaliknya, API datagram WebTransport menyediakan penghantaran kependaman rendah, tetapi tidak dapat menjamin kebolehpercayaan atau pesanan penghantaran, jadi ia tidak boleh menggantikan WebSocket secara langsung.
Walau bagaimanapun, dengan menggunakan WebTransport melalui API Datagram atau berbilang tika Streams API serentak, anda tidak perlu risau tentang penyekatan baris gilir dan masalah lain yang sering dihadapi oleh WebSockets. Selain itu, terdapat faedah prestasi apabila mewujudkan sambungan WebTransport baharu kerana jabat tangan QUIC yang mendasari lebih pantas daripada memulakan TCP melalui TLS.
Walau bagaimanapun, memandangkan teknologi WebTransport masih belum dimuktamadkan sepenuhnya, terdapat beberapa alat pembangunan dan ekosistem tidak sempurna, ini mungkin berterusan untuk beberapa lama. Masih terlalu awal untuk meramalkan sama ada WebTransport akan menggantikan Websockets, tetapi pasukan pertama yang menggunakannya mempunyai peluang untuk membina sesuatu yang inovatif. Walaupun tiada keperluan mendesak untuk menukar, pembangun harus memerhatikannya untuk projek masa depan dan bersedia untuk menggunakannya apabila ia paling sesuai.
Artikel ini terutamanya memperkenalkan protokol komunikasi baharu WebTransport, cara menggunakannya dan membandingkannya dengan Websockets. Oleh kerana penulis tidak menggunakan WebTransport secara langsung, saya hanya memberi pengenalan asas~
Atas ialah kandungan terperinci Adakah penyemak imbas menyokong WebTransport? Bolehkah ia menggantikan WebSockets?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!