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

Should I send http data chunk by chunk if I use chunk encoding?

我理解 HTTP chunk 是这样的

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 ==> client,先发送headers,再发送chunk:

7\r\n
Mozilla\r\n 

然后是第二块,以此类推。

服务器能否发送如下数据:

第一个write

7\r\n
Mozill

write

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

等等?

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

这意味着,如果您编写 3\r\n 后跟 123\r\n 之类的部分块而不是完整块 3\r\n123\r\n 应该无关紧要。您甚至可以在单个 writesend 中写入多个块或 1.5 个块等。

但还要注意,总是有一些客户端,开发人员没有正确理解套接字和 TCP 的工作原理,并假设您 send 就是您 recv 的,或者假设他们总是会得到具有单个 recv 或具有类似错误假设的完整块。虽然您可能会尝试对这些损坏的应用程序表现得很好,但您也可能会故意尝试破坏这些应用程序,以便它们及早得到修复,而不是稍后显示随机和不可重现的问题。