[纸上谈兵] http头部字段Transfer-Encoding

一个月没写,自己定的目标没有实现,不想写太水的内容。但这一篇可能又是水


我在排查httpclient问题时,发现了这个请求头,但不知道是做什么用的,于是百度一下


一、Transfer-Encoding: chunked
Transfer-Encoding头字段可以用在请求头或响应头中。该头字段有两个值chunked和identity
作用:
Transfer-Encoding值为chunked时,代表要把请求的数据或响应的数据切割成一系列的块数据传输。
Transfer-Encoding值为identity时,代表不做任何处理。
好了,现在我们了解到设置chunked的作用就是分块传输数据。那分块传输的目的又是为了什么呢?
要注意: 分块传输不会减少请求的内容的大小,因为要调整请求报文格式,可能还会导致传输内容变大.与Content-Encoding字段作用不同

二、分块目的
先抛出:
分块传输的目的是为了实现长连接, 有了长连接后就可以实现连接池.
长连接和连接池的作用是可以提高http请求的性能。

三、http长连如何实现?
1.什么是短连接?
连接->传输数据->关闭连接

2.什么是长连接?
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。

3.长连接为什么可以提性能?
HTTP运行在TCP连接之上,自然也有着跟TCP一样的三次握手、四次挥手、慢启动等特性。使用长连接可以减少三次握手、还可以避免遇上TCP慢启动的拥塞适应阶段等时间,自然可以提高性能。

4.如何设置http短连为长连?
答案: Connection: keep-alive (关于这个头部字段详细看参考)

5.那问题又来了,配置完keep-alive后,http连接如何来确定请求或响应的实体边界,即我们怎么知道某一次的请求内容或响应内容已发送完成?

两个方案:
1、是判断传输数据是否达到了Content-Length指示的大小。具体方法:计算实体长度,并通过头部告诉对方
2、设置Transfer-Encoding:chunked,进行分块传输。
方案1的问题在于某些情况下实体长度并没那么好获得(如网络响应大文件,获取长度比较耗时,客户端需要等待较长时间),于是有了方案2.


下面说一下方案2 
设置Transfer-Encoding:chunked后,代表报文采用了分块编码,报文改为一系列分块来传输。
报文格式要求如下:
每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束.
例如(红色为对报文的注释说明,非报文内容一部分):
b\r\n /*此处的b是16进制,代表了10进制的10,即说下一行内容长度为*/
01234567890\r\n
5\r\n
12345\r\n'
0\r\n' /*0代表下一行没有内容,传输结束*/
\r\n'


四、问题
1、短连如何确认一次请求完成?
服务器通常在发送回所请求的数据之后就关闭连接。这样客户端读数据时会返回EOF(-1),就知道数据已经接收完全了

五、

这个文章相对来讲水一些,只是自己东拼西凑整理的一些。如有错误,还请留言指正.

下一篇会整理些BigDecimal相关信息,之后会写一些MySQL InnoDB相关的信息,全部参考《MySQL技术内幕 InnoDB存储引擎(第二版)》


参考:
http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
https://blog.csdn.net/hellochenlu/article/details/56841896
https://www.cnblogs.com/zhanjindong/p/httpclient-connection-pool.html
https://imququ.com/post/transfer-encoding-header-in-http.html
https://www.zhoulujun.cn/html/webfront/SGML/web/2015_1016_317.html

猜你喜欢

转载自blog.csdn.net/c364902709/article/details/80828376