RTCQuicTransport 即將在您附近的來源試用計畫 (Chrome 73)

什麼?

RTCQuicTransport 是新的網路平台 API,可讓您使用 QUIC 通訊協定與遠端對等端交換任意資料。這項 API 適用於點對點用途,因此會與獨立的 RTCIceTransport API 搭配使用,透過 ICE 建立點對點連線。資料會以可靠且有序的方式傳送 (如要進一步瞭解未排序和不可靠的傳送方式,請參閱下方章節)。由於這是一般性的雙向資料傳輸,因此可用於遊戲、檔案傳輸、媒體傳輸、訊息傳送等。

為什麼?

功能強大的低階資料傳輸 API 可讓應用程式 (例如即時通訊) 在網路上執行新功能。您可以運用 API 建構自訂解決方案,突破同類裝置之間連線的限制,例如解鎖自訂比特率分配旋鈕。日後,我們還會進一步支援編碼媒體,讓您可以使用低階控制項建構自己的視訊通訊應用程式。WebRTC 的 NV 工作是朝向較低層級的 API 前進,因此及早進行實驗很有價值。

為什麼要使用 QUIC?

QUIC 通訊協定適合用於即時通訊。它是建立在 UDP 之上,內建加密、壅塞控制機制,且可進行多工處理,不會造成壅塞。RTCQuicTransport 提供的功能與 RTCDataChannel API 非常相似,但會使用 QUIC 而非 SCTP 做為傳輸通訊協定。由於 RTCQuicTransport 是獨立的 API,因此不會產生 RTCPeerConnection API (包含即時媒體堆疊) 的額外負擔。

做法:

一般 API 總覽

API 有 3 個主要抽象,分別是 RTCIceTransportRTCQuicTransportRTCQuicStream

顯示 API 架構的 RTCQuicTransport 圖表

RTCIceTransport

ICE 是一種協定,可透過網際網路建立對等連線,目前已用於 WebRTC。這個物件提供獨立 API,可用於建立 ICE 連線。它用於 QUIC 連線的封包傳輸,而 RTCQuicTransport 會在其建構函式中使用它。

RTCQuicTransport

代表 QUIC 連線。用於建立 QUIC 連線並建立 QUIC 串流。並公開 QUIC 連線層級的相關統計資料。

RTCQuicStream

用於讀取及寫入遠端端點的資料。串流可安全可靠地依序傳輸資料。您可以透過同一個 RTCQuicTransport 建立多個串流,且一旦資料寫入串流,就會在遠端傳輸上觸發「onquicstream」事件。串流可用於區分相同 QUIC 連線上的不同資料。常見的例子包括透過個別串流傳送個別檔案、透過不同串流傳送小型資料片段,或是透過個別串流傳送不同類型的媒體。RTCQuicStream 是輕量型,會透過 QUIC 連線進行多重傳輸,且不會導致其他 RTCQuicStream 的頭端封鎖。

連線設定

以下是設定對等 QUIC 連線的範例。與 RTCPeerConnection 一樣,RTCQuicTransport API 需要使用安全的信號管道來協商連線參數,包括安全性參數。RTCIceTransport 會協商 ICE 參數 (ufrag 和密碼) 以及 RTCIceCandidate

顯示 API 架構的 RTCQuicTransport 圖表

客戶觀點:

const iceTransport = new RTCIceTransport();
const quicTransport = new RTCQuicTransport(iceTransport);
// Signal parameters, key and candidates.
signalingChannel.send({
  iceParams: iceTransport.getLocalParameters(),
  quicKey: quicTransport.getKey(),
});
iceTransport.onicecandidate = e => {
  if (e.candidate) {
    signalingChannel.send({candidate: e.candidate});
  }
};

// When remote parameters are signaled, start connection.
signalingChannel.onMessage = async ({iceParams, candidate}) => {
  if (iceParams) {
    iceTransport.start(iceParams);
    quicTransport.connect();
  } else if (candidate) {
    iceTransport.addRemoteCandidate(candidate);
  }
};

伺服器觀點:

const iceTransport = new RTCIceTransport();
const quicTransport = new RTCQuicTransport(iceTransport);
// Signal parameters, key and candidates.
signalingChannel.send({
  iceParams: iceTransport.getLocalParameters(),
});
iceTransport.onicecandidate = e => {
  if (e.candidate) {
    signalingChannel.send({candidate: e.candidate});
  }
};

// When remote parameters are signaled, start connection.
signalingChannel.onMessage = async ({iceParams, quicKey, candidate}) => {
  if (iceParams && quicKey) {
    iceTransport.start(iceParams);
    quicTransport.listen(quicKey);
  } else if (candidate) {
    iceTransport.addRemoteCandidate(candidate);
  }
};

資料移轉

您可以使用 RTCQuicStream API 讀取及寫入資料,藉此進行資料傳輸:

RTCQuicStreamReadResult readInto(Uint8Array data);
void write(RTCQuicStreamWriteParameters data);
Promise<void> waitForWriteBufferedAmountBelow(unsigned long amount);
Promise<void> waitForReadable(unsigned long amount);

緩衝處理中

waitFor* 方法傳回的 Promise 可在 JavaScript 忙碌時緩衝資料。當接收端的讀取緩衝區已滿時,會向傳送端施加回壓。傳送端具有寫入緩衝區,可在施加回壓時填入,因此寫入端也具有 waitForWriteBufferedAmountBelow 方法,可等待緩衝區中的空間以便寫入。如要進一步瞭解如何寫入/讀取資料,請參閱其他開發人員說明文件

未排序/不穩定的傳送

雖然 RTCQuicStream 只支援以可靠且有序的方式傳送資料,但您可以透過其他方式傳送不可靠/無序的資料。對於未排序的傳送作業,您可以在個別串流中傳送小型資料區塊,因為資料在串流之間並未排序。針對不可靠的傳送作業,您可以傳送小型資料區塊,並將 finish 設為 true,然後在逾時後對串流呼叫 reset()。逾時時間應取決於在捨棄資料前,需要重傳多少次。

何時?

來源試用計畫將從 Chrome 73 版開始,並在 M75 版 (含) 之前結束。來源試用期結束後,我們會根據意見回饋和興趣做出適當調整,並發布 API、繼續進行此 API 的新原點試用,或是停用 API。

在哪裡?

除了 iOS 以外,所有平台皆支援 Chrome 瀏覽器。

還有呢?

意見回饋

原點測試的主要目標之一,就是希望能獲得開發人員的寶貴意見。我們感興趣的內容包括:

  • 這個 API 可讓您啟用哪些功能?
  • 這個 API 與其他資料傳輸 API (WebSocket 或 WebRTC 的 RTCDataChannel) 相比有何優勢?如何改善?
  • 成效
  • API 人因工程

註冊參加來源試用

  1. 為來源要求權杖
  2. 將符記新增至網頁,您可以在來源的任何網頁上提供這項符記,方法有兩種:
    • origin-trial <meta> 標記加入任一網頁的標頭。例如: <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • 如果你能設定伺服器,也可以使用 Origin-Trial HTTP 標頭在網頁上提供符記。產生的回應標頭應如下所示:Origin-Trial: TOKEN_GOES_HERE

網路規格

在來源試用中,規格草案已超前 API,包括:

  • 與 WHATWG 串流更為一致的單向串流
  • 停用重傳
  • (即將推出) 資料包

我們很樂意實作完整規格和其他內容 (包括 WHATWG 串流支援),但希望先聽聽你的意見!

安全性

系統會使用預先共用金鑰建立加密的 P2P QUIC 連線,藉此確保 QUIC 握手的安全性。這個金鑰必須透過安全的非頻道管道傳送信號,並提供保密性和完整性保證。請注意,系統會將鍵公開給 JavaScript。

進行中的攻擊

與 DTLS-SRTP 不同,後者只需要完整性來傳送憑證指紋,但傳送預先共用金鑰時,則需要完整性和機密性。如果 PSK 遭到入侵 (例如信號通道中的伺服器),積極的攻擊者可能會對 QUIC 握手程序發動中間人攻擊。

目前狀態

步驟 狀態
1. 建立說明 完成
**2a. RTCQuicTransport 規格 ** **進行中**
**2b. RTCIceTransport 規格 ** **進行中**
**3. 收集意見回饋並重複設計** **進行中**
4. 來源試用 這項功能會在 Chrome 73 版推出!
5. 啟動 尚未開始

實用連結