Несколько запросов на получение в запросе http - PullRequest
0 голосов
/ 15 января 2019

При просмотре взаимодействия клиент-> сервер для извлечения изображений я вижу следующий HTTP-запрос GET от клиента, где пакет содержит 2 HTTP-запроса GET, и я не уверен, как сервер будет отвечать на такие запросы?

  1. Будет ли сервер игнорировать второй запрос GET?
  2. Будет ли сервер отправлять ответ по одному на каждый запрос GET?
  3. Это не похоже на конвейерную передачу HTTP. Пожалуйста, сообщите, если это так.

    Transmission Control Protocol, Src Port: 59649 (59649), Dst Port: 8080 (8080), Seq: 1, Ack: 1, Len: 648
        Source Port: 59649
        Destination Port: 8080
        [Stream index: 86]
        [TCP Segment Len: 648]
        Sequence number: 1    (relative sequence number)
        [Next sequence number: 649    (relative sequence number)]
        Acknowledgment number: 1    (relative ack number)
        Header Length: 32 bytes
        Flags: 0x018 (PSH, ACK)
            000. .... .... = Reserved: Not set
            ...0 .... .... = Nonce: Not set
            .... 0... .... = Congestion Window Reduced (CWR): Not set
            .... .0.. .... = ECN-Echo: Not set
            .... ..0. .... = Urgent: Not set
            .... ...1 .... = Acknowledgment: Set
            .... .... 1... = Push: Set
            .... .... .0.. = Reset: Not set
            .... .... ..0. = Syn: Not set
            .... .... ...0 = Fin: Not set
            [TCP Flags: *******AP***]
        Window size value: 683
        [Calculated window size: 43712]
        [Window size scaling factor: 64]
        Checksum:  [validation disabled]
            [Good Checksum: False]
            [Bad Checksum: False]
        Urgent pointer: 0
        Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
            No-Operation (NOP)
                Type: 1
                    0... .... = Copy on fragmentation: No
                    .00. .... = Class: Control (0)
                    ...0 0001 = Number: No-Operation (NOP) (1)
            No-Operation (NOP)
                Type: 1
                    0... .... = Copy on fragmentation: No
                    .00. .... = Class: Control (0)
                    ...0 0001 = Number: No-Operation (NOP) (1)
            Timestamps: TSval 6345, TSecr 6344
                Kind: Time Stamp Option (8)
                Length: 10
                Timestamp value: 6345
                Timestamp echo reply: 6344
        [SEQ/ACK analysis]
            [iRTT: 0.000099000 seconds]
            [Bytes in flight: 648]
    
    Hypertext Transfer Protocol
        GET  HTTP/1.1\r\n
            [Expert Info (Chat/Sequence): GET  HTTP/1.1\r\n]
                [GET  HTTP/1.1\r\n]
                [Severity level: Chat]
                [Group: Sequence]enter code here
            Request Method: GET
            Request URI: 
            Request Version: HTTP/1.1
        Host: \r\n
        sent: \r\n
        User-Agent: \r\n
        Accept-Encoding: gzip, deflate\r\n
        Accept-Language: en-GB,*\r\n
        Connection: keep-alive\r\n
        \r\n
        [Full request URI: ]
        [HTTP request 2/2]
        [Prev request in frame: 1254]
        [Response in frame: 1272]
    
    Hypertext Transfer Protocol
        GET \r\n
            [Expert Info (Chat/Sequence): GET  HTTP/1.1\r\n]
                [GET  HTTP/1.1\r\n]
                [Severity level: Chat]
                [Group: Sequence]
            Request Method: GET
            Request URI: 
            Request Version: HTTP/1.1
        Host: \r\n
        sent: \r\n
        User-Agent: \r\n
        Accept-Encoding: gzip, deflate\r\n
        Accept-Language: en-GB,*\r\n
        Connection: keep-alive\r\n
        \r\n
        [Full request URI: ]
        [HTTP request 2/2]
        [Prev request in frame: 1254]
        [Response in frame: 1272]
    

Есть ли какой-нибудь онлайн-инструмент, который я могу использовать для проверки таких запросов?

1 Ответ

0 голосов
/ 15 января 2019

Вполне допустимо, чтобы несколько 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 меняет это, но это гораздо более сложный процесс - мультиплексирование - в который я не буду входить).

Итак, чтобы ответить на ваши вопросы:

  1. Будет ли сервер игнорировать второй запрос GET? - NO

  2. Будет ли сервер отправлять ответ по одному на каждый запрос GET? - ДА

  3. Это не похоже на конвейерную передачу HTTP. Пожалуйста, сообщите, если это так. - ЭТО ЕСТЬ, но не по той причине, о которой вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...