Методы POST против GET - на сетевом уровне, что больше влияет на задержку? - PullRequest
2 голосов
/ 08 октября 2010

Есть ли какая-либо разница в сетевом взаимодействии для запросов HTTP GET и POST?

При использовании GET я понимаю, что весь запрос отправляется за один раз.С POST я думаю, что первоначальный запрос отправляется, а затем отправляется второй запрос, который отправляет все параметры.

Например, предположим, что задержка между сервером и клиентом составляет 500 мс.Какое будет общее время для вызова GET против POST?

Ответы [ 6 ]

8 голосов
/ 08 октября 2010

Все пакеты являются TCP-пакетами, которые содержат протокол HTTP, метод запроса не изменяет время ответа сетевого уровня.

Он будет меняться в зависимости от размера запроса в зависимости от размеразапрос, но это не определяется типом запроса.

Вы можете отправить больше данных с постом, чем получить, но это не значит, что они отвечают быстрее, это отдельная проблема.

Скорость, с которой HTTP-сервер может обрабатывать и возвращать результатнаходится на сервере, который вы используете, и, вероятно, будет настолько незначительным, что не стоит упоминать.

Скорость, с которой результат возвращается с сервера, зависит от того, какой ресурс обрабатывает HTTP-сервер, если он вызываетPHP-файл, который требует времени, а затем и времени ...

В пакетах нет четкой разницы ... это запрос GET по SSL:

00907f8252f7001e4fe86a93080045000028
0bb2400080067380ac100167adc22064c51a
01bb66ccad148448d84850103f05bde90000

И это POST-запрос по SSL:

00907f8252f7001e4fe86a93080045000028
0c0640008006732cac100167adc22064c511
01bbe538c0df8621dc6150104042248c0000

Нет особого участия в том, является ли строка в пакете TCP "GET" или "POST", на которую смотрит сетьон говорит: «О, ты TCP, а? Ну, тогда уходи».Это не волнует.

Любая задержка за пределами обычного сетевого трафика является незначительной из-за обработки на уровне сервера или кода, через который она работает.

7 голосов
/ 08 октября 2010

POST-запросы имеют преимущество из-за меньшего количества записей

Учитывая тот же объем информации (сообщение POST не превышает GET), технически POST должен быть быстрее на стороне сервера (в нано-пикосекундах):

  • Обычно веб-серверы, такие как Apache, регистрируют запросы где-то
  • POST-запросы не регистрируют строку запроса, поэтому меньше обработки записи. IOPS сервера может непреднамеренно повлиять на задержку

    Без этого при одинаковых пакетах они практически эквивалентны.
    GET сохраняет данные в строке запроса, POST сохраняет информацию в теле сообщения.
    Сервер обрабатывает оба, просто по-разному.

На стороне клиента POST требует дополнительной обработки для подготовки сообщения. Вы заметите это, если выполняете AJAX, гораздо проще отправить запрос GET, чем POST.

GET имеет возможность превзойти запросы POST

  1. Как определено w3 для HTTP / 1.1 , GET имеет возможность выполнить частичный запрос, таким образом ограничивая пропускную способность сети:

    Семантика метода GET меняется на «частичное GET», если сообщение запроса включает поле заголовка Range. Частичное GET запрашивает, чтобы была передана только часть объекта, как описано в разделе 14.35. Метод частичного GET предназначен для уменьшения ненужного использования сети, позволяя завершить частично извлеченные объекты без передачи данных, уже сохраненных клиентом.

  2. Кроме того, w3 описывает условный GET для сокращения использования сети:

    Семантика метода GET изменяется на «условное GET», если сообщение запроса включает в себя поле заголовка If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match или If-Range , Условный метод GET запрашивает, чтобы объект передавался только при обстоятельствах, описанных в поле (ах) условного заголовка. Условный метод GET предназначен для уменьшения ненужного использования сети, позволяя обновлять кэшированные объекты, не требуя множественных запросов или передачи данных, уже хранящихся у клиента.

  3. GET-запросы кешируются. Это уменьшает пропускную способность сети, потому что браузер может видеть запрос, который уже был сделан в прошлом, который еще не истек и отвечает на первый взгляд мгновенным ответом из кэша.
1 голос
/ 23 октября 2010

Я проверял это во время мониторинга в Wireshark.

Я создал простую HTML-форму и переключил метод между GET и POST.

Последовательно, я заметил, что запросы GET отправляют один пакет, в то время какPOST отправляет два.Даже если данные формы очень малы, данные POST всегда отправляются во втором пакете.

Это наводит на мысль, что задержка будет более подвержена влиянию POST.

ОБНОВЛЕНИЕ 2011.07.05:

Вот простая форма HTML для POST:

<form method="GET" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>

Вот версия POST:

<form method="POST" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>
1 голос
/ 08 октября 2010

Ответ Джонатана очень разъясняющий. Но позвольте мне пойти немного дальше в том месте, где запросы отличаются друг от друга.

Вся информация, проходящая через Интернет, проходит через небольшие пакеты. Допустим, каждый пакет имеет максимальную емкость 1 КБ (это не правильное значение, это просто для пояснения механизма, если вы хотите, чтобы реальные значения по ограничениям пошли искать в RFC).

ОК, у нас есть запрос GET и POST. Пакеты очень похожи, как показано Джонатаном. В этом случае при небольшом объеме данных все можно обернуть в пакет размером 1 КБ, поэтому производительность сети не меняется.

Но что, если запрос должен быть огромным? Мало кто знает, но максимальная длина запроса GET может варьироваться в зависимости от сервера. Попробуйте спросить любой site.com/foo/andom200 раз A}. Он вернет неверный / неверный запрос, вместо 404 не найденных.

Так вот, где происходит POST. Если объем данных превышает определенное значение, POST позволяет серверу продолжить перечисление этого запроса и проанализировать значения.

Также есть другое основное отличие в поведении, которое не было упомянуто ранее. Данные POST анализируются в браузере для кодировки текущего документа перед отправкой на сервер.

1 голос
/ 08 октября 2010

Для данного фрагмента данных они, вероятно, будут почти одинаковыми.Вот как может выглядеть запрос GET:

GET /test?x=5&y=3&z=4 HTTP/1.1
Header1: value
Header2: value
...

Вот как будет выглядеть POST:

POST /test HTTP/1.1
Header1: value
Header2: value
...

x=5&y=3&z=4

Так что это тот же объем данных.Реальный вопрос заключается в том, хотите ли вы, чтобы пользователь мог добавлять закладки и возвращаться к URL-адресу и снова видеть те же данные в будущем.GET используются для этого, POST используются для запроса данных об изменении на сервере или по соображениям безопасности (например, не используйте GET для отправки пароля).

0 голосов
/ 08 октября 2010

Все дело в реализации на стороне клиента.В спецификации http такого условия нет.Время отправки зависит от количества данных.Если вы используете POST только для замены GET, это будет неразличимо.

...