Должен ли я отправлять данные http по частям, если я использую кодировку по частям?

Я понимаю, что HTTP-чанк выглядит примерно так

HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n 
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n 
\r\n

Когда сервер отправляет данные ответа клиенту, должен ли сервер отправлять данные по частям?

Например,

сервер ==> клиент, сначала отправьте заголовки, затем первый фрагмент:

7\r\n
Mozilla\r\n 

затем второй кусок и так далее.

Может ли сервер отправлять данные следующим образом:

первый write

7\r\n
Mozill

второй write

a\r\n 
9\r\n
Developer\r\n
7\r\n

и так далее?


person garen96    schedule 26.05.2019    source источник


Ответы (1)


TCP — это протокол для передачи потока байтов. На уровне TCP нет границ между данными, отправляемыми разными write. На самом деле, если вы выполняете несколько write или send вскоре друг за другом, данные этих вызовов часто оказываются вместе в одном сетевом пакете (алгоритм Нейгла), и они также считываются вместе на стороне получателя.

Это означает, что не имеет значения, пишете ли вы частичные фрагменты, такие как 3\r\n, за которыми следует 123\r\n, вместо полного фрагмента 3\r\n123\r\n. Вы даже можете записать несколько фрагментов или 1,5 фрагмента и т. д. в пределах одного write или send.

Но также обратите внимание, что всегда есть клиенты, разработчики которых не понимают должным образом, как работают сокеты и TCP, и предполагают, что то, что вы send, есть то, что вы recv, или предполагают, что они всегда будут получать полный блок с одним recv, или имеют подобные неправильные предположения. Хотя вы можете попытаться быть вежливым с такими сломанными приложениями, вы также можете намеренно попытаться сломать их, чтобы они были исправлены раньше, вместо того, чтобы позже показывать случайные и невоспроизводимые проблемы.

person Steffen Ullrich    schedule 26.05.2019