Должен ли я отправлять http-чанк по чанку, если я использую чанк-код? - PullRequest
0 голосов
/ 26 мая 2019

Я понимаю, что 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

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

Например,

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

7\r\n
Mozilla\r\n 

, затем второй чанк и т. Д.

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

первый write

7\r\n
Mozill

второй write

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

и т. Д.

1 Ответ

0 голосов
/ 26 мая 2019

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

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

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

...