一、HTTP报文的结构
用于HTTP协议交互的信息,称为HTTP报文。客户端的HTTP报文称为请求报文,服务端的称为响应报文。HTTP报文结构如下图:
下面是请求报文的一个实例:
- 请求行:包含用于请求的方法,请求URI和HTTP版本
- 状态行:表明响应结果的状态码
- 首部字段:包含请求和响应的各种条件和属性
- 其他:包含cookie等
二、请求行与状态行(它们都标记有HTTP协议版本)
1、请求行:包含用于请求的方法,请求URI和HTTP版本
2、状态行:状态码的职责是当客户端向服务器发送请求时,描述返回请求的结果。
-
状态码的类别:
- 1xx:信息性状态码,接收的请求正在处理
- 2xx:成功状态码,请求正常处理完毕
- 3xx:重定向状态码,需要进行附加操作以完成请求
- 4xx:客户端错误状态码:服务器无法处理请求
- 5xx:服务器错误状态码:服务器处理请求出错
- 只要遵守状态码类别,即使改变RFC2616中定义的状态码,或服务器自行创建状态码都没有问题。
三、报文首部
1、HTTP首部字段传递重要信息:传递额外重要信息,例:主体大小,所用的语言,认证信息等。重复了会如何:根据浏览器处理不一致。可能只认第一个,可能只认最后一个。
// 首部字段名:字段值
Content-Type: text/html
Keep-Alive: timeout=15, max=100
2、4种HTTP首部字段类型:
- 通用首部字段:请求和响应双方都会使用。
- 请求首部字段:包含请求时特殊要求。
- 响应首部字段:响应的补充内容,也会要求客户端附加额外的内容。
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了更新时间等与实体有关的信息。
- 为Cookie服务的首部字段
四、 编码提升传输速率
1、报文主体和实体主体的差异
- 报文:是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
- 实体:作为请求或响应的有效载荷数据被传输,内容由实体首部和主体组成。
- HTTP报文的主体用于传输请求或响应的实体主体。报文主体等于实体主体,只有编码时候才会有差异。
2、压缩传输的内容编码:发邮件添加附件时,为了让邮件的体积变小,通常将附件进行压缩,再发送。HTTP中也有类似功能。常见的内容编码有以下几种:
- gzip
- compress
- deflate
- identity(不进行编码)
3、分割发送:请求的编码实体资源尚未完全传输完成之前,浏览器无法显示请求页面的内容。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。(先分后编码再传)
4、发送多种数据的多部分对象集合:(类似发送邮件时可以发送不同类型的文件采用了MIME多用途英特网邮件扩展),HTTP协议中也采用了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。多部分对象集合包含的对象如下:
- multipart/form-data:在web表单文件上传时使用;
- multipart/byteranges:响应报文包含了多个范围的内容时使用。
- 使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入‘--’标记, 最后插入 --XXX--作为结尾。
5、获取部分内容的范围请求,曾经加载一个尺寸稍大的图片或者文件就很吃力了,如果网络中断,必须重头开始,现在就有一种恢复机制(从中断处恢复)——指定范围发送的请求叫做范围请求。
- 对一份10000字节大小的资源,如果使用范围请求,可以只请求5000-10000字节内多资源;
- Range: bytes=5001-10000:5000-10000字节
- Range: bytes=5001-:5000到最后
- Range: bytes=-3000:最开始到3000
- Range: bytes=-3000, 5000-7000:多重范围(响应会在首部字段Content-type标明multipart/byteranges后返回响应报文)
- 如果无法响应范围请求,则会返回状态码200 OK和完整实体内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)