如果我使用块编码,是否应该逐块发送http数据?

时间:2019-05-26 02:05:44

标签: http tcp chunked-encoding chunked

我知道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

以此类推?

1 个答案:

答案 0 :(得分:0)

TCP是用于传输字节流的协议。在TCP级别上,由不同write发送的数据之间没有相关的边界。实际上,如果您彼此之后不久执行多个writesend,则来自这些调用的数据通常最终会一起存储在同一网络数据包(Nagle algorithm)中,并且也会在同一位置读取它们接收方结束。

这意味着,如果您先写3\r\n之类的部分块,然后再写123\r\n,而不是完整的块3\r\n123\r\n,则没关系。您甚至可以在单个writesend中写入多个块或1.5个块等。

但也请注意,总是有一些客户端的开发人员无法正确理解套接字和TCP的工作原理,并假设您的send就是您的recv或假定他们将始终获得完整的信息。具有单个recv的块或具有类似的错误假设。尽管您可能会尝试对此类损坏的应用程序友好,但您也可能会故意破坏这些应用程序,以使它们尽早得到修复,而不是稍后再显示随机且不可复制的问题。