WebRTC DataChannel поток / контроль / противодавление
API RTCDataChannel не обеспечивает какой-либо вид потока / управления или противодавления, означает ли это, что отправитель теоретически может вызвать сбой браузера получателя? По моему мнению, браузер (Chrome, Firefox и т. Д. Все используют SCTP под капотом) читает из SCTP-соединения и планирует запуск js-callback, использующего пакет. Если очередь событий не может не отставать от отправителя, браузер в основном непрерывно читает пакеты, сохраняя их в буфере, который увеличивается бесконечно. Поэтому, когда вы соединяете два браузера, отправитель может фактически перегружать другой, потому что нет барьера, такого как окна приема TCP или что-то подобное.
Это относится и к API websocket.
Я просто что-то пропускаю или эти API просто сломаны? Если я прав, это будет серьезной проблемой безопасности при общении с не прошедшими проверку подлинности браузерами (например, в торрент-сценарии).
1 ответ
Канал данных webrtc раньше был основан на UDP. В течение этого времени браузер наложил искусственное регулирование, чтобы предотвратить переполнение сети. Так было до хрома v32, я считаю.
В настоящее время канал данных основан на протоколе SCTP со встроенным управлением потоком данных (FC), и браузер больше не работает (слава Богу). Параметры, управляющие FC, не предоставляются через API, но это не означает, что FC отсутствует.
Я не знаком с реализацией webrtc в Chrome/FF, но не думаю, что вы можете сломать браузер с помощью простой атаки флудом. "Производитель быстрее потребителя" - довольно старая проблема.
Тем не менее, я работаю с каналом данных уже более года и почти каждый день видел, как мой браузер зависал, так что, вероятно, в реализации webrtc много ошибок. Надеюсь, они не будут создавать никакой безопасности.
Отправка больших объемов данных с использованием канала данных webrtc не особенно приятна. API не предлагает обратный вызов "канал готов к записи" или что-то в этом роде, так что да, вам нужно опросить bufferedamount
ценить и стараться держать его в оптимальном окне. Добавить оскорбление в травму bufferedamount
Раньше ломали под версиями Chrome для Windows, всегда было 0. Но я думаю, что они исправили это в chrome v37 или около того времени.
ИМХО API webrtc не очень хорошо продуман, но он делает свою работу, и, честно говоря, я не могу придумать ни одного API js, который был бы хорошо продуман.