在上一篇文章中,回顾了http协议从产生到发展。以及在发展过程中,随着互联网的发展,随之变化增加的一系列的新特性。交代了http协议发展的大背景。这篇文章我们从http协议本身出来来了解它。
本篇的目录结构如下:
http协议的结构
用于http协议交互的信息叫做http报文。请求端叫请求报文,响应端(服务器端)叫做响应报文。http报文本身是由多行数据构成的字符串文本,是http通信的基本单位,由8位组字节流组成。
- 报文的结构
请求报文和响应报文的结构基本都由以下几部分构成:
首部:
请求行:包含用于请求的方法,请求URI和http版本。
状态行:包含表明响应结果的状态码,原因短语和http版本。
请求(响应)首部字段:包含请求响应的各种条件和属性的各类首部。
空行:首部和报文主体的分割点。
报文主体:报文补充内容。作为请求或响应的有效载荷被传输,内容由实体首部和实体主体组成。 - 报文的传输
在报文传输过程中,为了压缩报文体积,传递更快,使用了内容编码的功能。内容编码指明应用在实体内容上的编码格式,并保持实体原样压缩。常用的内容编码有gzip,compress(Unix系统的压缩标准),deflate(zlib),identity(不进行编码)
。
由于在http通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。所以在传输大容量数据时,使用分块传输来使浏览器逐步显示页面,这个功能叫做分块传输编码。分的块称为chunk。 - 传输对象的扩展
http协议吸收了邮件中可以传输文本,图片,视频等附件的MIME机制。使得发送的报文主体可以包含不同类型的数据,包括但不仅限于文本。这其中包含的对象有以下几种:- multipart/form-data 在web表单提交时使用。
- multipart/byteranges 状态码206响应报文包含了多个范围的内容时使用。
http协议的请求响应字段
在http协议的结构里面提到,在首部包含了各类请求/响应首部字段,具体包含以下几类,每类中又包含各种各种常见的字段,下面列出常见的字段及其作用解释:
- 通用首部字段
- cache-control:操作缓存的工作机制
- no-cache:为了防止从缓存中返回过期的资源
- no-store:暗示请求或响应中包含机密信息
ps: no-cache容易被理解为不缓存,但事实上no-cache只是代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。no-store才是真正的不缓存。
- connection:作用1:控制不再转发给代理的首部字段;作用2:管理持久连接。(Keep-Alive,Upgrade)
- Transfer-Encoding: 规定传输报文主体时的编码格式
- Upgrade:用于检测http协议及其他协议是否可使用更高的版本通信。参数值可用来指定一个完全不同的通信协议(比如socket),与connection字段联合使用。
- 请求首部字段
- Accept:客户端通知服务器可处理的媒体类型的相对优先级。采用type/subtype方式指定多种类型。可使用q=来额外表达权重值,使用分号(;)来分隔。q的范围0~1,1最大。
- Host:告知服务器,请求的资源所处的互联网主机名和端口号。它和单机服务器分配多个域名的虚拟服务器的工作机制联系密切,这是它必须存在的意义。
- Referer:告知服务器请求资源的原始URI。其正确拼写应该是
referrer
。 - User-Agent: 将创建请求的浏览器和用户代理名称等信息传达给服务器。
- 响应首部字段
- Age:告知客户端源服务器多久前建立了响应,单位秒。
- Location:将响应接收方引导到某个与请求URI位置不同的资源。
- 实体首部字段
- Allow: 用于通知客户端能够支持的request-URI指定资源的所有http方法,当接受到不支持的http请求方法时,报405 Method Not Allowed 错误,同时返回支持的方法。
- Content-Type: 说明实体主体内对象的媒体类型。
- Content-Location:指明报文主体返回资源时对应的URI。
- 其他
- domain:Cookie的domain属性指定的域名可做到与结尾一致。在右匹配的情况下会发送Cookie会不安全。所以除非指定具体域名,其他情况domain最好不指定。
- HttpOnly:使JavaScript脚本无法获取Cookie,主要目的是为了防止跨站脚本攻击。
http协议状态码含义
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,可迅速判断服务器是否正常处理了请求。以下给出状态码的大致分类和其中比较常见的状态码。
- 1xx
接收的请求正在处理。 - 2xx
- 200 ok
- 204 no content 请求成功处理,但是不返回实体。
- 206 partial content 进行了范围请求,服务器成功执行这部分get请求,响应报文中包含由content-range指定范围的实体内容
- 3xx
表明浏览器需要执行某些特殊的处理以正确处理请求。- 301 Moved Permanently 永久性重定向
- 302 Found 临时性重定向。
- 303 See Other 请求的资源存在另一个URI,应使用get方法定向获取请求的资源。
- 304 Not Modified 客户端发送附带条件的请求时,服务器允许请求访问资源,但未满足条件的情况。当提示305时,不包含任何响应的主体部分。
- 307 Temporary Redirect 临时重定向。与302一样,但是会遵循浏览器标准,不会从post改为get。
- 4xx
表明客户端是发生错误的原因所在。- 400 Bad Request 请求报文存在语法错误。
- 401 Unauthorized 发送的请求需要通过http请求的认证。
- 403 Forbidden 对请求资源的访问被服务器拒绝。
- 404 Not Found 无法从服务器上找到需要的资源,也可以在服务器拒绝响应时不想说明理由时使用。
- 5xx
表明服务器本身发生了错误。- 500 Internal Server Error 服务器端在执行请求时发生了错误。
- 503 Service Unavailable 服务器暂时处于超负载或者停机维护,暂时无法处理请求。