В http2, если клиент игнорирует фрейм настроек сервера, что должен делать сервер?
Когда есть много соединений, мы хотим уменьшить динамический размер таблицы за счет SETTINGS_HEADER_TABLE_SIZE
в настройках фрейма. Если клиент игнорирует фрейм параметров и не отправляет фрейм параметров с флагом ack, будет ли сервер использовать значение по умолчанию (4096 октетов)? Если это так, клиент может отправить много запросов с динамической таблицей 4096 октетов после получения рамка настроек сервера. Это может привести к чрезмерному использованию памяти сервера. Как избежать этого случая?
1 ответ
Клиент должен незамедлительно применить настройки и отправить подтверждение обратно, это не является обязательным. Любое другое поведение клиента не соответствует требованиям, и в таких ситуациях сервер может закрыть соединение. В конкретном случае, когда клиент слишком долго задерживается без подтверждения настройки, сервер может закрыть соединение с помощью фрейма GoAway с причиной SETTINGS_TIMEOUT.
Другое дело, что динамическая таблица HPACK является "глобальной" для соединения HTTP/2. Таким образом, единственный способ, которым злоумышленник может реально использовать размер по умолчанию, - это открывать много разных соединений, а не делать много запросов к одному и тому же соединению. На мой взгляд, вы всегда хотите ограничить количество подключений, которые могут происходить с одного IP-адреса, иначе злоумышленникам даже не понадобится ботнет для выполнения DDOS-атаки на ваш сервер.
Уменьшение размера динамической таблицы до 4096 байт может увеличить трафик заголовков и может привести к снижению производительности.