深入理解HTTP协议(二)--http协议的报文首部和报文主体的分析

在上一篇文章中,回顾了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 服务器暂时处于超负载或者停机维护,暂时无法处理请求。
发布了43 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u013243938/article/details/103549567