ls0f / my-issues

0 stars 0 forks source link

HTTP 是怎么确认请求或响应报文已经结束了? #7

Open ls0f opened 8 years ago

ls0f commented 8 years ago

HTTP 也是基于TCP来传输数据的,对于没有keep-alive的HTTP而言,当socket read的时候出现EOF时,我就认为数据已经传输完成了,这没什么大问题。但HTTP/1.1 后,keep-alive就是默认选项了,也就是服务器和客户端会维护一个长连接,多个请求会复用这个通道,服务器或者浏览器是怎么知道这个请求或响应的报文已经全部读取完毕了呢?

ls0f commented 8 years ago

答案是HTTP 头部的content-length,通过这个来确定报文边界。

ls0f commented 8 years ago

HTTP/1.1之后又引入了分块编码传输https://zh.wikipedia.org/wiki/%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81

如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束。

每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。

最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。

消息最后以CRLF结尾。