Datagrams vs Streams:不可靠傳輸的威力
在 WebTransport 的世界裡,你不再被強制要求「每一份數據都必須安全抵達」。你可以根據業務需求,彈性選擇最適合的傳輸模式。
一、 Datagrams:速度至上,不問生死
Datagrams 是 WebTransport 最具備「UDP 特性」的部分。
特性:
- 不可靠 (Unreliable):不保證數據一定會到達。
- 無序 (Unordered):發送 A, B, C,接收端可能收到 C, A, B。
- 無阻塞:消除了隊頭阻塞,丟包不會卡住後續數據。
適合場景:
- 游標座標同步:舊的點不重要,我們只需要最新的位置。
- 語音/視訊原始數據:偶爾的雜訊比延遲更好。
二、 Streams:可靠有序的優雅
Streams 提供了類似 TCP 的可靠保障,但其優勢在於多流並行。連線內可以有無數個流,流 A 的重傳不會卡住流 B。
三、 實戰:Datagrams Ping-Pong 實作
javascript
async function startPingPong(transport) {
const writer = transport.datagrams.writable.getWriter();
const reader = transport.datagrams.readable.getReader();
setInterval(async () => {
const startTime = performance.now();
const data = new TextEncoder().encode(JSON.stringify({ time: startTime }));
await writer.write(data);
}, 1000);
while (true) {
const { value, done } = await reader.read();
if (done) break;
const pongData = JSON.parse(new TextDecoder().decode(value));
console.log(`往返時間 (RTT): ${(performance.now() - pongData.time).toFixed(2)}ms`);
}
}總結
Datagrams 追求極限延遲,而 Streams 確保數據完整。WebTransport 讓你能在同一個連線中完美平衡這兩者。
下一章,我們將探討如何靈活地管理單向與雙向流。
️ 進階挑戰
修改 Ping-Pong 範例,在發送時包裝一個序號 (Sequence Number),並在接收端統計有多少包「跳號」或「丟失」。
延伸閱讀與資源
- Chrome Dev Blog:WebTransport Datagrams
- MDN:WebTransport API