Http 协议的基本认识
URI 和 URL 的关系
URI = Universal Resource Identifier 统一资源标志符(某个人)URL = Universal Resource Locator 统一资源定位符(这个人的地址)
URN = Universal Resource Name 统一资源名称(这个人的身份证)
URL 的基本格式:
<schemem>://<user>:<password>@<host>:<port>/<path>?<query>#<frag>
HTTP 协议的三个特征
持久连接:以前的 http 通信都是完成后断开连接的,下一次重新连接,如果资源不多的情况下,并不会造成什么问题。但是随着 http 的普及,越来越多的资源需要加载,一个 html 可能有 css 、js 等文件,如果还是这样操作,会造成巨大的通信开销。
为了解决这个问题,出现了持久连接,只要通信两端没有一端提出断开,就保持连接,下次通信复用这个链接。
管道化:过去客户端发送请求,要服务端返回响应才继续下一个请求。
启用管道化后,就会将队列迁移到服务器,这样客户端就可以同时发送多个请求,然后等服务器一个接一个响应。状态管理:http 是一种无状态协议,请求和响应一一对应,不会出现两个请求复用一个响应的情况,每个请求都是独立的。
有些业务场景需要有状态,比如登录,为了管理状态,引用了 cookie 技术,cookie 能让请求和响应的报文都附加 cookie 信息,那个之间就有一个状态了。
HTTP 报文
1.请求报文
<Method><Request URL><Version>
<Headers>
<Body>
#Example
GET /books/?s=http&action= HTTP/1.1
<Headers>
<Body>
2.响应报文
<Version><Status Code><Reason Phrase>
<Headers>
<Body>
#Example
HTTP/1.1 200 OK
<Headers>
<Body>
3.请求方法
方法 | 功能 |
---|---|
GET | 获取数据 |
POST | 提交数据 |
PUT | 上传文件 |
DELETE | 删除文件 |
HEAD | 获取除了内容以外的资源信息 |
4.状态码
状态码 | 类别 | 原因短语 |
---|---|---|
1xx | 信息 | 请求已被接受,正在处理中 |
2xx | 成功 | 请求已处理成功 |
3xx | 重定向 | 客户端需要附加操作才能完成请求 |
4xx | 客户端错误 | 客户端发起的请求服务器无法处理 |
4xx | 服务器错误 | 服务器在处理请求时发生错误或异常 |
HTTP 首部
1. 通用的首部
首部 | 描述 |
---|---|
Connection | 管理持久连接 |
Date | 报文的创建时间,HTTP 协议使用了特殊的日期格式 |
Transfer-Encoding | 传输报文主体时的编码方式,例如分块传输编码 |
Connection: keep-alive
Date: Tue, 11 Jun 2019 16:31:19 GMT
Transfer-Encoding: chunked
2. 请求的首部
首部 | 描述 |
---|---|
Accept | 可接受的 MIME 类型 ,q 表示权重,用;分割开 |
Accept-Charset | 可接受的字符集 |
Accept-Encoding | 可接受的编码格式,服务器按指定的编码格式压缩数据 |
Accept-Language | 可接受的语种类型 |
Host | 服务器域名和端口 |
Referer | 上一个页面的地址 |
User-Agent | 用户代理信息,例如操作系统,浏览器名称和版本号等 |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Charset:utf-8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Host: cn.epubee.com
Referer: http://cn.epubee.com/books/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
3. 响应首部
首部 | 描述 |
---|---|
Accept-Ranges | 服务器接受的范围类型 |
Server | 服务器软件的名称和版本 |
Age | 响应存在时间,单位为秒,这个首部可能由代理发出 |
Accept-Ranges: bytes
Server: Microsoft-IIS/7.5
Age: 600
4. 实体首部
首部 | 描述 |
---|---|
Content-Encodeing | 内容编码,告知客户端用这个编码格式解压 |
Content-Language | 内容语言 |
Content-Length | 内容尺寸,单位是字节 |
Content-Type | 内容的 MIME 类型 |
Content-Encoding: gzip
Content-Language: zh-CN
Content-Length: 9191
Content-Type: text/html;charset=utf-8
缓存
缓存的处理过程可以简单分为几步
第一步:首先在缓存中搜索指定资源的副本
第二步:如果命中,对资源副本进行新鲜度检测(是否过期)
第三步:与服务器进行再验证,验证通过,就更新资源副本的新鲜度,再返回副本资源(此时应该是 304 Not Modified),若不通过就返回资源,再将资源的副本放入缓存中
1. 新鲜度检测
Cache-Control 中可以设置,no-cache、no-store、max-age
no-cache:将资源缓存,但是要与服务器进行新鲜度验证
no-store: 禁止资源缓存
max-age: 多少秒过后就过期要重新请求
Expires: Fri,24 Sep 2020 07:0032 GMT
一般时间在每台服务器不能确认,不太建议使用Cache-Control: max-age=315360
用秒数来计算过期,比较靠谱
2. 日期对比法进行验证
- response: 有返回
Last-Modified: Fri, 17 May 2019 14:50:06 GMT
- 当客户端在缓存资源的时候,把
Last-Modified
也缓存起来,当对缓存资源副本再验证的时候,请求报文附加If-Modified-Since: Fri, 17 May 2019 14:50:06 GMT
进行日期对比
3. 实体标记法进行再验证
服务器会生成一个标记,该标记会存在实体首部 ETag 中,在响应报文中附加 ETag
ETag: "023e1d0bfcd51:0"
HTTP/1.1 304 Not Modified Last-Modified: Fri, 17 May 2019 14:50:06 GMT Accept-Ranges: bytes ETag: "023e1d0bfcd51:0" Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Tue, 11 Jun 2019 09:53:16 GMT
当客户端在缓存资源的时候,把
ETag: "023e1d0bfcd51:0
也缓存起来,当检测是否过期的时候向服务器发请求在头部加多一个If-None-Match: "023e1d0bfcd51:0"
HTTP/1.1 304 Not Modified Last-Modified: Fri, 17 May 2019 14:50:06 GMT Accept-Ranges: bytes ETag: "023e1d0bfcd51:0" Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Tue, 11 Jun 2019 09:53:16 GMT GET /books/?s=http&action= HTTP/1.1 Host: cn.epubee.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Referer: http://cn.epubee.com/books/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: identify=21742230; user_localid=ip_112.96.67.54; identifyusername=; uemail=biyongyao%40qq.com; kindle_email=; leftshow=1 If-None-Match: "023e1d0bfcd51:0" If-Modified-Since: Fri, 17 May 2019 14:50:06 GMT