客户端与服务器端

image.png

请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。在两台计算机之间使用 HTTP 协议通信时,在一条通信路线上必定有一端是客户端,另一端是服务器端

客户端发出请求,服务器端回复响应

HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。
image.png

请求示例

  • GET 表示请求访问服务器的类型,称为方法
  • 字符串 / 实际发送时是 /index.htm 表示请求访问的资源对象,称为请求 URI
  • HTTP/1.1 表示 HTTP 协议的版本号为1.1

image.png

请求报文

请求报文是由请求方法、请求URI、协议版本、可选的请求头部字段和内容实体组合构成

image.png

请求 URI 定位资源

当客户端请求访问资源而发送请求时,URI 需要将作为请求报文中的请求 URI 包含在内
image.png

  • URI 为完整的请求 URI

    1. GET http://baidu.com/index.htm HTTP/1.1
  • 在头部字段 Host 中写明网络域名或 IP 地址

    GET /index.htm HTTP/1.1
    Host: baidu.com
    

    告知服务器意图的 HTTP 方法

    GET 获取资源

    GET 方法用来请求访问已被 URI 识别的资源。指定的资源经过服务器端解析后返回响应内容,如果请求的资源是文本,那就保存原样返回;如果是像 CGI 那样的程序,则返回经过执行后的输出结果。

GET /index.htm HTTP/1.1
Host: baidu.com
If-Modified-Since: Thu,12 Jul 2020 09:30:30 GMT

// 仅返回2020年7月12日9点30分以后更新过的index.htm页面资源。如果未有内容更新,则返回状态码304 Not Modified

image.png

POST 传输实体主体

POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容,而是传输数据。

image.png

PUT 传输文件

PUT 方法原多用来传输文档,但由于 HTTP/1.1 的 PUT 方法存在安全性问题,因此一般不实用该方法。 架构设计采用 REST 标准时可能会使用 PUT 方法用于更新资源

image.png

HEAD 获得报文头部

HEAD 方法和 GET 方法一样,区别在于不返回报文主体部分,一般用于确认 URI 的有效性及资源更新的日期时间

image.png

DELETE 删除文件

DELETE 方法顾名思义删除,按照请求 URI 删除指定的资源。和 PUT 方法一样多配合 REST 标准使用

image.png

OPTIONS 询问支持的方法

OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。浏览器中发送跨域请求时会发出 OPTIONS 方法

image.png

TRACE 追踪路径

TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。TRACE 方法因为容易引发 XST 攻击,一般不会使用

CONNECT 使用隧道协议连接代理

CONNECT 方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL 和 TLS 协议把通信内容加密后经网络隧道传输

CONNECT proxy.hackr.jp:8080 HTTP/1.1
Host: proxy.hackr.jp

image.png

响应报文

响应报文是由协议版本、状态码、用以解释状态的原因短语、可选的响应首部字段以及实体主体构成

image.png

HTTP 是不保存状态的协议

HTTP 是一种不保存状态,即无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行持久化处理。
image.png

持久连接

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源,因此,每次请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。
image.png

HTTP/1.1 引入 keep-alive 保持持久连接

当持久连接声明后,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。从而可以在建立一次 TCP 连接后进行多次请求和响应的交互。 持久连接明显减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载,同时利用减少开销的那部分时间,使 HTTP 请求和响应能够更早的的结束,让 Web 页面的显示速度相应得到提高。 在 HTTP/1.1 中,所有的连接默认都是持久连接。

image.png

持久连接带来的管线化能力

持久连接使得多数请求以管线化方式发送成为可能。使用管线化技术后,不用等待响应亦可直接发送下一个请求,达到能够同时做到并行发送多个请求,而不需要一个接一个的等待响应。

image.png

使用 Cookie 的状态管理

HTTP 协议是无状态协议,它不对之前发生过的请求和响应的状态进行管理。假设要求登录认证的 Web 页面本身无法进行状态的管理,那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。
image.png
Cookie技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后再发送出去。服务器端发现发送过来的 Cookie 后,通过比对服务器上的记录,最后得到之前的状态信息

  • 没有 Cookie 信息状态下的请求

image.png

// 请求报文
GET /reader/ HTTP/1.1
Host: hackr.jp
*头部字段中没有 Cookie 的相关信息

// 响应报文
HTTP/1.1 200 OK
Date: Thu,12 Jul 2020 09:30:30 GMT
Server: Apache
<Set-Cookie: sid=xxxxxx;path=/;expires=Thu,12 Jul 2020 19:30:30 GMT>
Content-Type: text/plain; charset=UTF-8
  • 第 2 次以后(存有 Cookie 信息状态)的请求

image.png

GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=xxxxxx