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

ETag验证图

Last modification:August 26th, 2020 at 06:30 pm
小编很用心去写文章的,大家伙们给点支持呗。