HTTP-соединение с конвейером. Как несколько файлов разделяются на сегменты по TCP

У меня очень простой вопрос, ответ на который, как я хочу, найти невозможно. Предположим, у меня есть TCP-соединение между клиентом и сервером, и клиент сделал запрос на страницу, содержащую 2 файла. Мы предполагаем, что http-соединение сохраняется и с конвейером, поэтому 2 запроса на файлы отправляются в одном сегменте tcp от клиента к серверу. Теперь предположим, что файлы, которые нужны клиенту, имеют размер 4500 и 3000 байтов, а MSS tcp составляет 1460 байтов, потому что мы используем Ethernet, поэтому первый файл должен быть разделен на 3 сегмента по 1460 и один из 120, а второй файл разделен на 2 сегмента по 1460 и один из 80 (по крайней мере, это то, что происходит, если tcp отправляет только один файл). В этой ситуации, сколько сегментов отправит tcp? Первые 4 из первого файла и 3 из второго файла, или он сначала «объединит» 2 файла вместе, а затем отправит этот файл разделенным? Во втором случае у нас будет файл размером 7500, 5 MSS + 200 байт.

Я нигде не могу найти информацию об этой проблеме. Итак, в конце концов, мой вопрос, как выглядит шаблон сегментов, отправляемых tcp:

3 MSS -> 120 байтов -> 2 MSS -> 80 байтов Или 5 MSS -> 200 байтов

Я не могу понять, как tcp может отправить сегмент, содержащий байты двух разных файлов.


person Yoza    schedule 26.06.2019    source источник


Ответы (1)


Я не могу понять, как tcp может отправить сегмент, содержащий байты двух разных файлов.

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

Протокол HTTP определяет, что каждый запрос и ответ состоит из заголовка и тела, которые выделяются пустой строкой. Размер тела или частей тела известен заранее, то есть либо указывается в заголовке (с использованием поля content-length), либо перед каждым фрагментом тела (с transfer-encoding: chunked). Таким образом, анализатор протокола HTTP может определить конец тела и, следовательно, начало следующего запроса / ответа. И совершенно не имеет значения, как эти данные пакетируются на нижележащем уровне TCP.

person Steffen Ullrich    schedule 26.06.2019
comment
Понятно. Значит, в этой ситуации tcp отправит 5 MSS + 200 байт? - person Yoza; 26.06.2019
comment
@Yoza: Может быть. Это зависит от того, как приложение отправляет данные в ядро ​​и включены ли алгоритмы NAGLE (без этого множественные send приводят к единичным пакетам). Кроме того: HTTP-сообщения состоят не только из файлов, но и из HTTP-заголовка (метаинформации) и тела (полезной нагрузки), поэтому ваш расчет не совсем правильный. - person Steffen Ullrich; 26.06.2019