「图解HTTP」读书笔记

「 图解HTTP 」 读书笔记 第二章

2017-12-14  本文已影响10人  13kmsteady

简单的 HTTP 协议

1. HTTP 协议用于客户端和服务端之间的通信

HTTP 协议和 TCP/IP 协议族内的其他众多协议相同,用于客户端和服务器之间的通信。

客户端:请求访问文本或图像等资源的一端。

服务器:提供资源响应的一端。

使用 HTTP 协议能够明确区分哪端是客户端,哪端是服务器端。

角色.png

2. 通过请求和响应的交换达成通信

通信.png

请求必定由客户端发出,服务器端回复响应。

先从客户端开始建立通信,服务器端在没有接受到请求之前不会做出响应。

示例:

通信02.png

请求报文中的内容

GET /index.htm HTTP/1.1
Host: hackr.jp
...

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

请求报文构成.png

接受到请求的服务器,会将请求内容处理的结果以响应的形式返回。

HTTP/1.1 200 OK
Date:Tue, 12 Dec 2017 14:42:13 GMT
Content-Length: 362
Content-Type: text/html
    
    
<html>
....

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

响应报文构成.png

3. HTTP 是不保存状态的协议

HTTP 是一种无状态(stateless)协议,HTTP 协议自身不对请求和响应之间的通信状态进行保存。

在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。

无状态协议设计目的是为了更快的处理大量事物,确保协议的可伸缩性。

HTTP无状态协议.png

4. 请求 URI 定位资源

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

定位资源.png

指定请求URI的方式很多,以 http://hackr.jp/index.htm 作为请求为例:

完整的请求 URI.png
网络域名的URI.png

如果不是访问特定资源而是对服务器本身发起请求,可以用 * 来代替请求 URI。如:查询 HTTP 服务器端支持的 HTTP 方法种类:

OPTIONS * HTTP/1.1

5. 告知服务器意图的 HTTP 方法

1.GET: 获取资源

GET方法用来访问已被 URI 识别的资源,指定的资源经服务器端解析后返回响应内容。

GET.png

使用 GET 方法请求·响应的例子

请求 GET /index.html HTTP/1.1
Host: www.hackr.jp
If-Modified-Since: Thu, 12 Jul 2012 07:30:00 GMT
响应 仅返回2012年7 月12日7 点30分以后更新过的index.html页面资源。如果未有内容更新,则以状态码304 Not Modified作为响应返回

2. POST: 传输实体主体

POST 方法用来传输实体的主体。

POST 的主要目的并不是获取响应的主体内容。

POST.png

使用 POST 方法的请求·响应例子

请求 POST /submit.cgi HTTP/1.1
Host: www.hackr.jp
Content-Length: 1560(1560字节的数据)
响应 返回 submit.cgi 接收数据的处理结果

3. PUT: 传输文件

PUT 方法主要用来传输文件,就行 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

PUT.png

使用 PUT 方法的请求·响应例子

请求 PUT /example.html HTTP/1.1
Host: www.hackr.jp
Content-Type: text/html
Content-Length: 1560(1560字节的数据)
响应 响应返回状态码 204 No Content(比如 :该 html 已存在于服务器上)

4. HEAD: 获得报文首部

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

HEAD.png

使用 HEAD 方法的请求·响应例子

请求 HEAD /index.html HTTP/1.1
Host: www.hackr.jp
响应 返回index.html有关的响应首部

5. DELETE: 删除文件

DELETE 方法用来删除文件,与 PUT 相反的方法。DELETE 方法按照请求 URI 删除指定的资源。

DELETE.png

使用 DELETE 方法的请求·响应例子

请求 HEAD /index.html HTTP/1.1
Host: www.hackr.jp
响应 响应返回状态码 204 No Content(比如 :该 html 已从该服务器上删除)

6. OPTIONS: 询问支持的方法

OPTIONS 用来查询针对请求 URI 指定的资源支持的方法。

OPTIONS.png

使用 OPTIONS 方法的请求·响应的例子

请求 OPTIONS * HTTP/1.1
Host: www.hackr.jp
响应 HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
(返回服务器支持的方法)

7. TRACE: 追踪路径

TRACE 方法是让 Web 服务器端将之前的通信请求环回给客户端的方法。用来确认连接过程中发生的一些列操作。

TRANCE.png

使用 TRANCE 方法的请求·响应例子

请求 TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2
响应 HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 1024
TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2(返回响应包含请求内容)

8. CONNECT: 要求用隧道协议连接代理

CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Socket Layer,安全套接层) 和 TLS(Trasnport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

格式:

CONNECT 代理服务器名:端口号 HTTP 版本

CONNECT.png

使用 CONNECT 方法的请求·响应例子

请求 CONNECT proxy.hackr.jp:8080 HTTP/1.1
Host: proxy.hackr.jp
响应 HTTP/1.1 200 OK(之后进入网络隧道)

6. 使用方法下达命令

向请求 URI 指定的资源发送请求报文时,采用称为方法的命令。

方法的作用在于,可以指定请求的资源按期望产生某种行为。

Method.png

7. 持续连接节省通信量

HTTP 协议的初始版本,每进行一次 HTTP 通信都要断开一次 TCP 连接。

初始版本通信.png

初始版本通信缺点:每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。

初始版本通信02.png
7.1 持久连接

持久连接(HTTP Persistent Connections) 只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

持久连接.png

持久连接旨在建立一次 TCP 连接后进行多次请求和响应的交互。

持久连接优点:

注: HTTP/1.1 默认都是持久连接

7.2 管线化

持久连接使得多数请求以管线化(pipelining)方式成为可能,不用等待响应亦可发送下一个请求。

管线化.png

管线化技术比持久连接还要快,请求数越多,时间差越明显。

8. 使用 Cookie 的状态管理

HTTP 是无状态协议,不对之前发生过的请求和响应的状态进行管理。无法根据之前的状态进行本次请求的处理。

无状态协议.png

Cookie 技术

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

Cookie 会根据从服务器端发送的响应报文内一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值发出去。

服务器端发现客户端发来的 Cookie 后,检查是从哪一个客户端发来的连接请求,对比服务器上的记录,得到之前的状态信息。

没有 Cookie 信息的请求.png 存有 Cookie 信息的请求.png

HTTP 请求报文和响应报文内容如下:

  1. 请求报文(没有 Cookie 信息的状态)

    GET /reader/ HTTP/1.1
    Host: hackr.jp
    *首部字段内没有Cookie的相关信息
    
  2. 响应报文(服务器端生成 Cookie 信息)

    HTTP/1.1 200 OK
    Date: Thu, 12 Jul 2012 07:12:20 GMT
    Server: Apache
    <Set-Cookie: sid=1342077140226724; path=/; expires=Wed,
    10-Oct-12 07:12:20 GMT>
    Content-Type: text/plain; charset=UTF-8     
    
  3. 请求报文(自动发送保存着的 Cookie 信息)

    GET /image/ HTTP/1.1
    Host: hackr.jp
    Cookie: sid=1342077140226724
    
上一篇 下一篇

猜你喜欢

热点阅读