Что?
RTCQuicTransport — это новый API веб-платформы, который позволяет обмениваться произвольными данными с удаленными узлами с использованием протокола QUIC. Он предназначен для одноранговых вариантов использования и поэтому используется с автономным API RTCIceTransport для установления однорангового соединения через ICE . Данные передаются надежно и в порядке (подробную информацию о неупорядоченной и ненадежной доставке см. в разделе ниже). Поскольку это универсальный двунаправленный транспорт данных, его можно использовать для игр, передачи файлов, передачи мультимедиа, обмена сообщениями и т. д.
Почему?
Мощный низкоуровневый API-интерфейс передачи данных может позволить приложениям (например, средствам связи в реальном времени) выполнять новые действия в Интернете. Вы можете использовать API, создавая свои собственные решения, расширяя границы того, что можно сделать с одноранговыми соединениями, например, разблокируя пользовательские ручки распределения битрейта. В будущем дальнейшая поддержка закодированных мультимедиа может даже позволить создать собственное приложение для видеосвязи с элементами управления низкого уровня. Усилия WebRTC NV направлены на переход к API более низкого уровня, и ранние эксперименты с этим очень ценны.
Почему QUIC?
Протокол QUIC желателен для связи в реальном времени. Он построен на основе UDP, имеет встроенное шифрование, контроль перегрузки и мультиплексируется без блокировки начала линии. RTCQuicTransport
предоставляет очень схожие возможности с API RTCDataChannel
, но в качестве транспортного протокола использует QUIC, а не SCTP. Поскольку RTCQuicTransport
является автономным API, он не требует дополнительных затрат API RTCPeerConnection
, который включает в себя стек мультимедиа реального времени.
Как?
Общий обзор API
API имеет три основные абстракции: RTCIceTransport
, RTCQuicTransport
и RTCQuicStream
.
RTCIceTransport
ICE — это протокол для установления одноранговых соединений через Интернет, который сегодня используется в WebRTC. Этот объект предоставляет автономный API для установки соединения ICE. Он используется в качестве транспорта пакетов для соединения QUIC, а RTCQuicTransport
принимает его в своем конструкторе.
RTCQuicTransport
Представляет соединение QUIC. Он используется для установления соединения QUIC и создания потоков QUIC. Он также предоставляет соответствующую статистику для уровня соединения QUIC.
RTCQuicStream
Используется для чтения и записи данных на/с удаленной стороны. Потоки передают данные надежно и в порядке. Несколько потоков могут быть созданы из одного и того же RTCQuicTransport
, и как только данные записываются в поток, он запускает событие «onquicstream» на удаленном транспорте. Потоки позволяют различать разные данные в одном и том же соединении QUIC. Типичными примерами могут быть отправка отдельных файлов в отдельные потоки, небольшие фрагменты данных в разные потоки или разные типы мультимедиа в отдельные потоки. RTCQuicStream
являются облегченными, мультиплексируются по соединению QUIC и не вызывают блокировку начала линии для других RTCQuicStream
.
Настройка подключения
Ниже приведен пример настройки однорангового соединения QUIC. Как и RTCPeerConnection
, API RTCQuicTransport
требует использования безопасного канала сигнализации для согласования параметров соединения, включая его параметры безопасности. RTCIceTransport
согласовывает свои параметры ICE (ufrag и пароль), а также RTCIceCandidate
s.
Взгляд клиента:
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);
}
};
Передача данных
Передачу данных можно осуществить с помощью API-интерфейсов RTCQuicStream для чтения и записи:
RTCQuicStreamReadResult readInto(Uint8Array data);
void write(RTCQuicStreamWriteParameters data);
Promise<void> waitForWriteBufferedAmountBelow(unsigned long amount);
Promise<void> waitForReadable(unsigned long amount);
Буферизация
Промисы, возвращаемые методами waitFor*
, позволяют буферизовать данные, когда JavaScript занят. Обратное давление применяется к стороне отправки, когда буфер чтения заполняется на стороне приема. Сторона отправки имеет буфер записи, который может заполняться при приложении обратного давления, и поэтому сторона записи также имеет метод waitForWriteBufferedAmountBelow
, позволяющий ожидать освобождения места в буфере для записи. Более подробную информацию о записи/чтении данных можно найти в дальнейшей документации разработчика.
Незаказированная/ненадежная доставка
Хотя RTCQuicStream
поддерживает только надежную и упорядоченную отправку данных, ненадежная/неупорядоченная доставка может быть достигнута другими способами. Для неупорядоченной доставки можно отправлять небольшие порции данных отдельными потоками, поскольку данные не упорядочены между потоками. Для ненадежной доставки можно отправлять небольшие фрагменты данных с параметром Finish, установленным в значение true, с последующим вызовом reset()
в потоке после тайм-аута. Тайм-аут должен зависеть от того, сколько повторных передач требуется перед удалением данных.
Когда?
Пробная версия Origin начнется с версии Chrome 73 и будет доступна до версии M75 включительно. После этого испытание происхождения завершится. На основании отзывов и заинтересованности мы внесем соответствующие изменения и либо выпустим API, либо продолжим тестирование этого API в новом источнике, либо прекратим его использование.
Где?
Браузер Chrome на всех платформах, кроме iOS.
Что еще?
Обратная связь
Одна из основных целей пробной версии Origin — получить отзывы от вас, разработчиков. Нас интересует:
- Что этот API дает вам?
- Как этот API улучшает другие API-интерфейсы передачи данных (
WebSocket
илиRTCDataChannel
WebRTC)? Как это могло улучшиться? - Производительность
- API-эргономика
Зарегистрируйтесь для участия в пробной версии Origin
- Запросите токен для вашего происхождения.
- Добавьте токен на свои страницы. Есть два способа разместить этот токен на любых страницах вашего источника:
- Добавьте тег
<meta>
origin-trial
в заголовок любой страницы. Например, это может выглядеть примерно так:<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Если вы можете настроить свой сервер, вы также можете предоставить токен на страницах, используя HTTP-заголовок
Origin-Trial
. Результирующий заголовок ответа должен выглядеть примерно так:Origin-Trial: TOKEN_GOES_HERE
- Добавьте тег
Веб-спецификация
Проект спецификации опередил API в исходной пробной версии, включая:
- Однонаправленные потоки, которые более тесно связаны с потоками WHATWG.
- Отключение повторной передачи
- (Скоро) датаграммы
Мы заинтересованы в реализации полной спецификации и не только (включая поддержку потоков WHATWG), но сначала хотим услышать ваши отзывы!
Безопасность
Безопасность при подтверждении связи QUIC обеспечивается за счет использования предварительного общего ключа для установки зашифрованного P2P-соединения QUIC. Этот ключ должен передаваться по защищенному внешнему каналу с гарантиями конфиденциальности и целостности. Обратите внимание, что ключ будет доступен JavaScript.
Активная атака
В отличие от DTLS-SRTP, которому для передачи отпечатка сертификата требуется только целостность, для сигнализации предварительного общего ключа требуется целостность и конфиденциальность. Если PSK скомпрометирован (скажем, сервером в сигнальном канале), активный злоумышленник потенциально может организовать атаку «человек посередине» против подтверждения связи QUIC.
Текущий статус
Шаг | Статус |
---|---|
1. Создайте объяснитель | Полный |
**2а. Спецификация RTCQuicTransport ** | **В ходе выполнения** |
**2б. Спецификация RTCiceTransport ** | **В ходе выполнения** |
**3. Собирайте отзывы и дорабатывайте дизайн** | **В ходе выполнения** |
4. Пробная версия происхождения | Запускается в Chrome 73! |
5. Запуск | Не запущено |
Полезные ссылки
- Дополнительная документация
- Публичный объяснитель
- Ошибка отслеживания
- Запросить пробный токен источника
- Как использовать пробный токен происхождения
- Обсуждение вопросов для RTCQuicTransport
- Обсуждение вопросов для RTCiceTransport