读《图解HTTP》记录
- HTTP协议用于客户端和服务端之间通信
一般由客户端首先发起,由服务端响应 - 通过请求和响应的交换达成通信
- HTTP是不保存状态的协议(无状态)
后续引入了Cookie技术,就可以管理状态了
HTTP方法
- GET
GET请求用于访问资源 - POST
POST请求用于传输实体的主体 - PUT
PUT方法用于传输文件。由于HTTP/1.1的PUT方法不带验证机制,任何人都能上传文件,存在安全性问题,因此一般的Web网站不使用该方法。 - HEAD 获得报文首部
和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性以及资源更新的时间日期等。 -
DELETE:删除文件
DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按 请求 URI 删除指定的资源。
Http支持的方法
持久连接节省通信量
-
持久连接
之前每次进行HTTP请求的时候,都要先建立TCP连接,然后结束之后再断开TCP连接。这样如果在同一份HTML文档中有大量的图片等资源,就会建立和断开多次TCP连接,造成资源的浪费。HTTP1.1和一部分HTTP1.0想出了持久连接。持久连接的特点:只要任意一端没有明确断开连接,就保持TCP的链接状态。这样不会因为频繁的建立和断开TCP连接咋造成额外的开销,减轻了服务器的负载。同时减少了HTTP请求和响应的时间。
持久化连接 -
管线化
持久连接使得多数请求以管线化方式发送成为可能。从以前发送请求需要等待并收到响应,才能发送下一个请求。管线化技术出现后,就不用等待响应,直接可以发送下一个请求了。管线化技术比持久化连接更快。
管线化
使用Cookie的状态管理
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文内一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端自动会在请求报文中加入Cookie值后发送出去。
服务端发现客户端发过来的Cookie后,会去检查到底是从那个客户端发过来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
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
HTTP请求报文以及响应报文
- 请求行
包含请求的方法,请求的URI和HTTP版本。 - 状态行
包含表明响应结果的状态码,原因短语和Http版本。 - 首部字段
包含表示请求和响应的各种条件和属性的各类首部。
一般有4种首部:通用首部、请求首部、响应首部和实体首部 - 其他
可能包含HTTP的RFC里未定义的额首部(Cookie等)
编码提升传输速率
- 报文
是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。 - 实体
作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成
Http报文的主体用于传输请求或响应的实体数体。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体 主体的内容发生变化,才导致它和报文主体产生差异。
1、压缩传输的内容编码
HTTP 协议中有一种被称为内容编码的功能来完成压缩后传输的操作。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后由实体客户端接收并负责解码。
常用的内容编码有以下几种。
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
由服务器将要传输的内容进行压缩,然后传递给客户端,并且告诉客户端编码格式,由客户端接收后,再解压缩,拿到原来的内容。
2、分隔发送的分块传输编码
在Http通信过程中,请求的编码实体资源在尚未全部传输完成之前,浏览器无法显示请求页面。在传输大内容数据时,通过把数据分隔成多块,能过让浏览器逐步显示页面。
这种把实体主体分块的功能称为分块传输编码。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标 记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编 码前的实体主体。
发送多种数据的多部分对象集合
在http协议中发送的一份报文主体内,可包含多类型实体(图片,文件等)。通常在图片或者文本文件上传时使用。多部分对象集合包含的对象如下:
- multipart/form-data
在 Web 表单文件上传时使用。 - multipart/byteranges 状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。
在http报文中使用多部分对象集合时,需要在首部字段加上Content-type.
关于范围内容的说明
在下载大文件过程中,网络中断,需要重头重新下载。则还是很需要一种可以恢复的机制,从断开出恢复下载。像这种,需要发送范围请求,只请求目标资源中的一部分。执行范围请求时,回用到首部字段Range来指定资源的byte范围。
byte范围的指定形式如下。
- 5001~10000字节
Range: bytes=5001-10000 - 从 5001 字节之后全部的
Range: bytes=5001- - 从一开始到 3000 字节和 5000~7000 字节的多重范围
Range: bytes=-3000, 5000-7000
针对范围请求,响应会返回206的状态吗报文。对于多重范围的范围请求,响应会在不受字段Content-Type表明multipart/byteranges后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
HTTP的响应状态码
状态码如200 OK,以3位数字和短语组成,第一位数字指定了响应类别。分为一下五种。
类别 | 原因短语 | |
---|---|---|
1xx | Informational(信息性状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误代码) | 服务器无法处理的请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常用状态码
1XX
1xx表示临时性消息
- 100
比如,客户端上传大数据时,分段上传,这时候加一个请求头,说我这边还有数据会继续上传,如果你接收完了,返回一个100,告诉客户端,这次上传的成功了,继续上传吧。 - 101
比如客户端想问问服务器支持不支持http2的请求,服务器返回101,表示支持,这时候,客户端以后的请求就可以用http2了。
正在切换协议
2XX
2xx的响应结果表明请求被正常处理了。
- 200 OK
表示从客户端发来的请求在服务器端被正常处理了。
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改 变。比如,使用 GET 方法时,对应请求资源的实体会作为响应返 回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体 作为响应返回(即在响应中只返回首部,不会返回实体的主体部 分)。 - 204 No Content
服务器接收的请求已经成功处理,但是在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。 - 206 Partial Content
客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX
3xx的响应结果表明浏览器需要执行某些特殊的处理以正确处理该请求。
就是重定向到某个其他的地址,比如
- 307
在浏览器输入http://www.baidu.com/,然后浏览器会定位到https://www.baidu.com/,这时候你看code码就是307。 - 304
在浏览器输入https://www.jianshu.com/p/6b03753de31c ,然后再刷新一下,在看一下code码,返回的一堆请求里会有几个304,表示这些数据没有改变。
4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在。
400 Bad Request
表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。401 Unauthorized
该状态码表示发送的请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。如果之前已经进行过一次请求,就表示认证失败。
返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate 首部用以质询(challenge)用户信息。当浏览器初次接收 到 401 响应,会弹出认证用的对话窗口。403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要 给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发 送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服 务器端拒绝请求且不想说明理由时使用。
5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误。
500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。503 Service Unavailable
该状态码表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知接触以上状况需要的时间,最好写入RetryAfter首部字段再返回给客户端。