HTTP相关-http协议

1,092 阅读8分钟

二,http协议

1 基础概念

1.1 报文格式

  • 请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
  • 响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

1.2 无状态

  • HTTP 是不保存状态的协议
  • 使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
  • HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。

1.3 http方法

  • GET和POST最常用
  • HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。
  • PUT和DELETE因自身不带验证机制,任何人都可以上传/删除文件 , 存在安全性问题。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的。

1.4 持久连接和管线化技术

  • 持久连接在建立 1 次 TCP 连接后进行多次请求和响应的交互
    • 减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
    • 减少开销的那部分时间,使HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。
    • 在 HTTP/1.1 中,所有的连接默认都是持久连接。
  • 管线化技术能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
    • 管线化技术则比持久连接还要快。请求数越多,时间差就越明显。

2 http报文

2.1 报文结构

2.2 编码

  • HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。
  • 通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
  • 常用的内容编码
  • 分块传输编码:在传输大容量数据时,通过把数据分割成多块(chunk),能够让浏览器逐步显示页面。

2.3 多部分对象集合

发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。

  • multipart/form-data 在 Web 表单文件上传时使用。
  • multipart/byteranges 状态码 206响应报文包含了多个范围的内容时使用。

2.4 范围请求

如果下载过程中遇到网络中断的情况,能从之前下载中断处恢复下载。

  • 针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。
  • 对于多重范围的范围请求,响应会在首部字段 ContentType 标明 multipart/byteranges 后返回响应报文。

2.5 内容协商

客户端和服务器端就响应的资源内容进行交涉,会以响应资源的语言、字符集、编码方式等作为判断的基准。

  • 请求报文中的首部字段
    • Accept
    • Accept-Charset
    • Accept-Encoding
    • Accept-Language
    • Content-Language

3 http状态码

状态码如 200 OK,以 3 位数字和原因短语组成。

3.1 2xx

  • 200 OK 请求已正常处理
  • 204 No Content 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
    • 浏览器显示的页面不发生更新。比如对于a标签,如果链接的页面响应码为204,页面也不会发生跳转。
  • 206 Partial Content 客户端进行了范围请求,而服务器成功执行了这部分的GET请求。

3.2 3xx

当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转。

  • 301 Moved Permanently 请求的资源已被分配了新的 URI,建议修改书签URI
  • 302 Found 请求的资源已被分配了新的 URI,将来还有可能发生改变
  • 303 See Other 请求对应的资源存在着另一个 URI,应使用 GET方法定向获取请求的资源
  • 304 Not Modified 客户端发送附带条件的请求,服务器端允许请求访问资源,但未满足条件的情况。
    • 附带条件的请求是指采用 GET方法的请求报文中包含 If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。
    • 304 虽然被划分在 3XX 类别中,但是和重定向没有关系。

3.4 4xx

表明客户端是发生错误的原因所在。

  • 400 Bad Request 请求报文中存在语法错误。
  • 401 Unauthorized 表示发送的请求需要有通过 HTTP 认证的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。
  • 403 Forbidden 对请求资源的访问被服务器拒绝了。
  • 404 Not Found 表明服务器上无法找到请求的资源。
    • 也可以在服务器端拒绝请求且不想说明理由时使用。

3.5 5xx

  • 500 Internal Server Error 表明服务器端在执行请求时发生了错误。
  • 503 Service Unavailable 表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

4 通信数据转发程序

HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。

4.1 代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

  • 每次通过代理服务器转发请求或响应时,会追加写入 Via 首部信息

4.2 网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。

  • 网关能使通信线路上的服务器提供非 HTTP 协议服务。
  • 利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

4.3 隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。

5 http首部

5.1 通用首部

请求报文和响应报文两方都会使用的首部。

  • Cache-Control 能操作缓存的工作机制。
    • no-cache 代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,no-store 才是真正地不进行缓存。
  • Connection
    • 控制不再转发给代理的首部字段
    • 管理持久连接
      • HTTP/1.1 版本的默认连接都是持久连接。当服务器端想明确断开连接时,则指定Connection 首部字段的值为 Close。
      • HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。要维持持续连接,则需要指定Connection 首部字段的值为 Keep-Alive。
  • Via 为了追踪客户端与服务器之间的请求和响应报文的传输路径。

5.2 请求首部字段

从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

  • Accept-Encoding 告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
  • Host 虚拟主机运行在同一个 IP 上,因此使用首部字段 Host 加以区分
    • Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。若服务器未设定主机名,那直接发送一个空值即可。

5.3 响应首部字段

从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

5.4 实体首部字段

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

5.5 Cookie相关的首部字段

  • Set-Cookie