文章目录
前言
HTTP报文可以分为报文首部和报文主体两块。
请求报文和响应报文的结构如下图所示:
1.报文主体和实体主体
报文主体一般情况下就是实体主体,没什么区别,但是在传输的过程中,有时候为了传输效率,会将主体的数据部分进行重新编码
比如我们发邮件时添加附件,需要讲文件压缩之后添加,这个压缩的过程就相当于重新编码,叫做压缩的传输内容编码。再比如当客户端请求的数据过于庞大时,由于MTU限制以及对传输效率的要求,报文会被切割成一块一块地发送,叫做分块传输编码,每块会用16进制来表示大小,最后一块会用0(CR+LF,通俗意义上讲是回车符+换行符的组合)这两种情况下,主体就发生了改变。而客户端收到这些重新编码的信息后需要负责解码。
而报文主体一般指没有发生改变的主体,实体主体一般指发生了重新编码等改变的主体部分。
2. 多部份对象集合
当两端在进行信息传输时,信息可能包含图片,视频,字符串等不同的种类,HTTP采用多部份对象集合对其进行处理。
Multipart/form-data
该集合用于上传服务端时时需要上传多种类型,用于请求报文
Multipart/byteranges
该集合用于服务端响应时需要返回多种类型数据,返回状态码206
使用多部份对象集合的报文需要在首部字段加上Content-type以及使用boundary字符来划分哪些是多部份集合对象,哪些是普通数据,使用方式就像刚开始写C++时,结果只能呈现在命令行里,我们一般使用虚线------------来吧不同板块分割开,如下图所示:
3.获取部分内容的范围请求
当我们请求一个大文件时,如果突然发生断网,但文件还没传输完,为了防止又从头传输这个大文件所带来的时间消耗,采用范围请求的方法。如过该文件大小为10000,在请求报文中指定该大文件的大小范围如:0-2000,而服务端响应中 就会将响应范围的文件先传输给客户端,这样子当网络突然切断一下后恢复,只需要将中断后未传给客户端的文件范围传给客户端。效果如下图所示:
在请求报文中使用Range来指定范围:
Range:bytes=5001-10000
如果服务端无法响应范围请求,则会返回200和OK 以及所请求的完整的内容。
4.内容协商
一个相同的浏览器,在不同的情况下支持不同的信息方式,比如在中国,Google浏览器显示的应该是中文,在美国就应该是英文。
而这种根据不同情况来协商语言形式等一系列数据内容的过程就是客户端和服务端之间的内容协商。
在首部字段中通过以下字段名来协商:
1、 Accept
2、 Accept-Charset
3、 Accept-Encoding
4、 Accept-Language
5、 Content-Language
4.1 服务器驱动协商
服务端接收到请求报文后,根据请求报文首部的字段做参考,给出它认为合理的内容,这个内容不一定就是最适合的
4.2 客户端驱动协商
客户端可以在发送请求时,自主设定自己想要的内容,比如之前Accept等一系列字段就是用于来设定的。就像在浏览器里设置中英文。
4.3 透明协商
客户端和服务器进行商量,而不是只把决定权交给一方。