Почему браузер не может отправить запрос gzip?

Если веб-сервер может отправлять ответ gzip, почему браузер не может отправить запрос gzip?


person Herman    schedule 08.01.2009    source источник


Ответы (6)


Клиент и сервер должны договориться о том, как общаться; Часть этого заключается в том, можно ли сжать сообщение. HTTP был разработан как модель запрос / ответ, и изначально предполагалось, что всегда будут небольшие запросы и потенциально большие ответы. Сжатие не требуется для реализации HTTP, есть серверы и клиенты, которые его не поддерживают.

Сжатие HTTP реализуется клиентом, заявляющим, что он может поддерживать сжатие, и если сервер видит это в запросе и поддерживает сжатие, он может сжать ответ. Чтобы сжать запрос, клиент должен иметь «предварительный запрос», который фактически согласовал, что запрос будет сжат, ИЛИ ему потребуется сжатие в качестве поддерживаемой кодировки для ВСЕХ запросов.

* ОБНОВЛЕНИЕ, февраль '17 * Прошло 8 лет, но, как отмечает @ Phil_1984_, третьим возможным решением было бы, чтобы клиент и сервер согласовывали поддержку сжатия, а затем использовали это для последующих запросов. Фактически, такие вещи, как HSTS, работают именно так с кэшированием клиента, когда сервер ожидает, что будет говорить только TLS и игнорировать любые незашифрованные ссылки. HTTP был явно разработан так, чтобы не иметь состояния, но на этом этапе мы вышли за рамки этого.

person Peter Oehlert    schedule 08.01.2009
comment
Значит, сервер просто выйдет из строя, если он не поддерживает сжатие? - person jjxtra; 03.07.2014
comment
Спецификация не требует сжатия, есть и серверы, и клиенты, которые его не поддерживают. Клиент начинает с того, что я говорю по-французски, а вы? Сервер отвечает и отвечает либо на английском, либо на французском, в зависимости от того, знает он французский или нет. Французский в этом примере - это сжатие. Если бы, как попросил ОП, клиент мог сразу начать говорить по-французски, все серверы должны были бы говорить по-французски, иначе система сломалась бы. Система допускает только сжатые ответы именно потому, что она требует согласования, и обе системы соглашаются. - person Peter Oehlert; 03.07.2014
comment
Очень хорошо объяснено. отсутствие сжатия с небольшим запросом (обычно) превосходит сжатие с предварительным согласованием. - person Ron; 29.04.2016
comment
Третий вариант (который удобно пропустить) - это запомнить клиенту / браузеру, что сервер принимает сжатие, а затем публиковать сжатые данные позже в соединении, если это необходимо. Публикация больших полезных нагрузок никогда не является первым делом, которое браузер делает при подключении к серверу. - person Phil; 30.01.2017
comment
@ Phil_1984_ Это очень сильно противоречит архитектуре HTTP без сохранения состояния, но на данный момент, учитывая все другие вещи, которые игнорируют эту часть, я думаю, что вы абсолютно правы, добавляя это как вариант. Я отредактирую ответ, чтобы отметить это. - person Peter Oehlert; 17.02.2017
comment
@PeterOehlert Это было больше похоже на ворчание на разработчиков браузеров или разработчиков спецификаций, я не уверен, кого конкретно винить. Браузеры выполняют сложные функции с отслеживанием состояния, такие как запоминание заголовков HSTS для каждого домена (например), но они не запоминают приемлемые кодировки передачи. Если подумать об этом больше, я думаю, что когда клиент начинает вспоминать что-то о домене, вы попадаете в сферу кеширования и на какой срок. Разработчики спецификации просто никогда не думали о том, чтобы иметь кешированный заголовок приемлемой кодировки передачи. - person Phil; 17.02.2017
comment
@ Phil_1984_ Я думаю, что исторический контекст полезен; легко забыть, как далеко мы зашли. В 1989 году, когда HTTP разрабатывался как не имеющий состояния, было объявлено о 486-м, работающем на колоссальной частоте 20 МГц, но на самом деле он не будет доступен до следующей весны. Интернет на самом деле не вырос из академического пространства, соединяющего университеты и правительства. В то время безгражданство имело большой смысл. Поскольку агенты (браузеры) за последние 28 лет стали намного сложнее, имело смысл добавить больше функций с отслеживанием состояния, особенно для реализации конкретных вариантов использования, из которых и появился HSTS. - person Peter Oehlert; 18.02.2017

Клиент не может знать заранее, что сервер поймет gzip-запрос, но сервер может знать, что клиент его примет.

person Paul Dixon    schedule 08.01.2009
comment
Не правда. Content-Encoding - это допустимый заголовок, который может предоставить клиент. В RFC говорится: Если кодирование содержимого объекта в сообщении запроса неприемлемо для исходного сервера, сервер ДОЛЖЕН ответить кодом состояния 415 (неподдерживаемый тип носителя). - за Ника Джонсона - person Pacerier; 04.07.2012
comment
То, что вы говорите, немного отличается от того, к чему я ехал. Вы можете попробовать отправить gzip-запрос, как вы предлагаете, но нет никакого способа заранее узнать, что сервер примет его (без разговора с сервером). Тем не менее, вы правильно поняли: если вы попытаетесь отправить gzip-запрос, вы можете обнаружить, что сервер может его поддерживать. - person Paul Dixon; 04.07.2012
comment
Есть много мест, где вы заранее знаете, что сервер поддерживает это. Например, мобильное приложение общается с серверной частью. - person Guillermo; 10.07.2012
comment
Есть ли список серверов, которые действительно поддерживают gzip-запросы? - person Eric; 27.12.2012
comment
есть ли какие-нибудь браузеры, которые его поддерживают? - person Brady Moritz; 15.05.2013
comment
сжатие в основном относится к данным формы, и в этом случае клиент всегда будет знать, что сервер хочет его сжатия, потому что сервер предоставил форму, запрашивающую его таким образом. - person cnd; 18.08.2016

Может, при условии, что может гарантировать, что сервер его примет. Это может означать использование запроса OPTIONS.

Есть много вещей, которые могут делать веб-браузеры (например, конвейерная обработка), чего они не делают. Разработчики веб-браузеров учитывают последствия изменений для совместимости.

В гетерогенной среде существует множество различных веб-серверов и конфигураций. Внесение изменений в способ работы клиента может нарушить некоторые из них.

Возможно, только 1% серверов может принимать gzip-запросы, но, возможно, некоторые из них рекламируют это, но не могут правильно его принять, поэтому пользователям будет отказано в загрузке файлов на эти сайты.

Исторически сложилось так, что было много неработающих реализаций клиент / сервер - долгое время ответы, сжатые с помощью gzip, были сломаны в основных веб-браузерах (к счастью, сейчас их больше нет).

Таким образом, вы получите черные списки пользовательских агентов или серверов (или доменных имен), где эти параметры были автоматически отключены, что неприятно.

person MarkR    schedule 10.04.2009

Потому что он не знает, может ли сервер его принять. Транзакция HTTP состоит из одного запроса, отправленного клиентом, за которым следует ответ. Одна из вещей, которую отправляет клиент, - это то, какую кодировку / сжатие он может поддерживать. Затем сервер может решить, как сжать ответ. У клиента нет такой роскоши.

person Yuliy    schedule 08.01.2009
comment
Что ж, если сервер может определить, поддерживает ли его браузер или нет, МОЖЕТ быть реализация, которую браузер пытается найти, может ли сервер понять содержимое, заархивированное с помощью g-zip, или нет; если разработчики над этим работают. - person David Refoua; 29.05.2014
comment
Сервер определяет, что браузер поддерживает gzip, потому что браузер просто сообщил об этом через заголовок запроса Accept-Encoding. Вам нужен какой-то другой способ, чтобы браузер заранее знал, каковы возможности сервера. Это выходит за рамки того, что дает вам HTTP / 1.1. - person Yuliy; 30.05.2014
comment
@Yuliy Вы имеете в виду (например) использование памяти браузера для запоминания ответа сервера Accept-Encoding? - person Phil; 30.01.2017

Если вы пишете веб-приложение, я предполагаю, что вы контролируете, что отправляется клиенту, а что - обратно от клиента.

Было бы достаточно просто написать реализацию gzip на javascript, которая сжимает почтовые данные, отправляемые на сервер. Сервер может иметь фильтр (термин j2ee), который знает, что данные клиента отправляются в сжатом виде, этот фильтр распаковывает данные и затем передает данные сервлету (или классам действий в Struts), которые читают данные как обычно, например. request.getParameter (...).

Это кажется совершенно логичным и выполнимым, если вы контролируете ситуацию. Как упоминается в других сообщениях, вы не можете полагаться на браузер, который сделает это автоматически, но, поскольку вы пишете веб-страницы, вы можете заставить браузер выполнять сжатие, которое вам нужно (с небольшой работой).

Энди.

person Community    schedule 14.09.2009

HTTP устроен таким образом:

  • Клиент сообщает свой запрос в виде обычного текста (в том числе, если может понять сжатые ответы).
  • Ответы сервера с правильной кодировкой (сжатой или нет)

НО В ЭТОМ ДИЗАЙНЕ клиент не может отправлять сжатые запросы, потому что он не знает, поймет ли это сервер заранее.

person Jairo Andres Velasco Romero    schedule 02.06.2017