文章目录
3.HTTP报文内的HTTP信息
HTTP通信过程包括从客户端发往服务端的请求及从服务端返回客户端的响应。
3.1HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
HTTP报文大致可以分为报文首部和报文主体两块。两者由最初出现的空行(用CR+LF)来划分。通常,并不一定要有报文主体。
3.2请求报文及响应报文的结构
3.2.1请求报文的结构
请求行(请求方法 路径 协议)
头信息(格式为 key:value)
空行
主体信息(可选)(发送内容)
POST /0.1html HTTP/1.1
Host:Localhost
Content-type:application/x-www-form-urlencode
Content-length:5
Age=3
- 请求行
- 请求方式:POST\GET\HEAD\PUT\DELETE\TRACE\OPTIONS
- 请求的资源 :
- 协议版本
- 请求头信息
- 客户端发给服务器的一些信息,使用键值对表示 key:value,比如cookie、User-Agent(浏览器告知服务器,客户端浏览器与操作系统相关的信息)
- 请求主体信息
- 当请求方式是post的时候,请求体会有请求的参数,格式如下:username=zhangsan&password=123
- 当请求为get的时候,请求参数不会出现在请求体中,会拼接在url地址的后面
- 注意:头信息结束后,有一个空行,头消息和主体消息(如果有),需要这个空行进行区分,即使没有主体信息,空行也不能少。
- 头信息里,要标明主体长度,POST比GET多了主体信息,同时POST时,要加上Content-Type:application/x-www-form-urlencoded;Content-length:5
3.2.2响应报文的结构
响应行(协议版本 状态码 状态文字)
响应头(格式为key:value)
空行
主体信息(也可能没有)
HTTP/1.1 200 OK
Content-type:text/html
Content-length:5
hello
-
响应行
- HTTP协议版本
- 状态码
- 200:请求成功
- 301/2:永久/临时请求重定向 [redirect]
- 307:重定向中保持原有的请求数据
- 304请求的资源没有改变,访问本地缓存
- 404请求的资源不存在,通常用户地址写错或者服务器无该资源
- 500服务器内部错误,通常是程序抛异常
- 状态信息,描述状态码
200 OK
404 NOT FOUND
304 Not Modified
[
初次访问时,response 会返回 ETag 和Last Modified时间戳信息,再次访问时,request中会包含这两个信息
If-Mofified-Since,If-None-Match与服务器的进行比较,如果一样则使用缓存
]
-
响应头
- 也是键值对形式,服务器将信息以键值对的形式返还给客户端
- Location:指定响应的路径,需要与302配合使用,完成跳转
- Set-Cookie:
- content-length:接下来主体的长度
-
空行
-
响应体
- 服务器回写给客户端页面的正文
3.3 编码提升传输效率
HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU资源。
1.报文主体和实体主体
- 报文
是HTTP通信中的基本单位,由8位组字节流( octet sequence,其中octet 为8个比特)组成,组成HTTP通信。
- 实体
作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
HTTP报文的主体用于传输请求或者响应的实体主体。
通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体发生变化,才导致它和报文主体的区别。
2.压缩传输的内容编码
内容编码指明在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责编码。
3.分割发送的分块传输编码
在HTTP通信中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
把实体主体分块的功能称为分块传输编码。分块传输编码会将实体主体分成多个部分(块),每一块都会用十六机制来标记块的大小,而实体主体的最后一块会使用0(CR+LF)来标记。
3.4发送多种数据的多部分对象集合
HTTP中也采纳了多部分对象集合,发送的一份报文主体内可以包含多类型实体。通常在图片或文本文件上传时使用。
多部分对象集合包含的对象如下:
- multipart/from-data
在web表单文件上传时使用。
- multipart/byterange
状态码206(Partial Content,部分内容)响应报文包含了多个范围内容时可以使用。
在HTTP报文中使用多部分对象集合时,需要在首部字段中加上Content-type。
使用boundary 字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入-- 标记,而在多部分对象集合对于字符串的最后插入-- 标记作为结束。
多部分对象集合的每个部分类型中,都可以包含有首部字段,另外,可以在某个部分中嵌套使用多部分对象集合。
3.5获取部分内容的范围请求
执行范围请求时,会用到首部字段Range 来指定资源的byte范围,byte范围指定如下:
- 5001~10000字节
Range: bytes=5001-10000
- 从5001字节之后全部
Range: bytes=5001-
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。
3.6内容协商返回最合适的内容
内容协商机制是指客户端和服务器就响应的资源内容进行交涉,然后提供客户端最为合适的资源。内容协商会以响应薪资的语言、字符集、编码方式等作为判断的基准。