Вполне допустимо, чтобы несколько HTTP-запросов были в одном TCP-пакете, если они подходят.
То, что вы видите, действительно конвейерная обработка HTTP , что рассматривается в RFC 2616, раздел 8 и RFC 7230, раздел 6.3.2 спецификации HTTP 1.1 , Клиент отправляет новый запрос GET
без предварительного ожидания ответа на предыдущий запрос GET
. Это само определение конвейерной обработки:
HTTP-запросы и ответы могут передаваться по соединению. Конвейерная передача позволяет клиенту делать несколько запросов, не ожидая каждого ответа , что позволяет гораздо эффективнее использовать одно TCP-соединение с гораздо меньшим затраченным временем.
TCP просто оптимизирует вещи, используя один TCP-пакет для обоих HTTP-запросов. Скорее всего, на клиенте включен send coalescing (он же «алгоритм Nagle») (что большинство библиотек сокетов делают по умолчанию) для уменьшения сетевого трафика.
Чтобы сервер отвечал на конвейерные запросы, ДОЛЖНО использоваться постоянное соединение, что является еще одним требованием конвейерной обработки и ясно видно в вашем примере (заголовок запроса Connection: keep-alive
).
TCP - это поток байтов , низкоуровневое кадрирование TCP не имеет значения для протокольных уровней более высокого уровня. Правильно написанный *1029* записанный получатель HTTP сможет отделять отдельные сообщения HTTP независимо от используемого кадрирования TCP и обрабатывать их индивидуально по мере необходимости. Спецификация HTTP 1.1 требует, чтобы на все запросы отвечали в том же порядке, в котором они были получены (HTTP 2.0 меняет это, но это гораздо более сложный процесс - мультиплексирование - в который я не буду входить).
Итак, чтобы ответить на ваши вопросы:
Будет ли сервер игнорировать второй запрос GET? - NO
Будет ли сервер отправлять ответ по одному на каждый запрос GET? - ДА
Это не похоже на конвейерную передачу HTTP. Пожалуйста, сообщите, если это так. - ЭТО ЕСТЬ, но не по той причине, о которой вы думаете.