HTTP协议是一种建立在TCP传输层协议上的应用层协议,它规定了通信双方使用请求-响应模式和文本报文进行通信。
HTTP报文格式
//?请求报文
//?1.请求行
GET?/?HTTP/1.1
//?2.请求头
Host:?time.geekbang.org
//?3.请求头空两行之后是?请求体,可能包含表单或文件
//?响应报文
//?1.响应行
HTTP/1.1?301?Moved?Permanently
//?2.响应头
Date:?Fri,?25?Jan?2019?13:28:12?GMT
Content-Type:?text/html
Content-Length:?182
Connection:?keep-alive
Location:?https://time.geekbang.org/
Strict-Transport-Security:?max-age=15768000
//?3.响应头空两行之后是?响应体,可能一段HTML代码。
HTTP Method
请求方法 | 描述 |
---|
Get | 浏览器通过地址栏访问页面都是 GET 方法。 | Post | 表单提交产生 POST 方法 | CONNECT | HTTP代理使用的方法。可通过服务器代理访问别的网站。现在多用于 HTTPS 和 WebSocket。 |
HTTP Status
状态码 | 描述 |
---|
1XX | 临时响应,表示希望客户端继续发送请求。(在HTTP库被处理)。 | 2XX | 请求成功。 | 3XX | 请求的目标有变化,希望客户端进一步处理。 | 301 | 永久重定向。 | 302 | 临时重定向。 | 304 | 客户端缓存(页面、图片)没有更新。 | 4XX | 客户端出错。 | 403 | 无访问权限。 | 404 | 请求的资源(页面、接口)不存在。 | 5xx | 服务端出错。 | 500 | 服务端错误。 | 503 | 服务端暂时性错误,可以一会再试。 |
Request Header | 描述 |
---|
Host | 访问的目标地址。 | Cookie | 存放Cookie字符串。 | Connection | 指定是否复用TCP连接。HTTP/1.1默认是长连接,HTTP/1.0默认是短连接。 | Cache-Control | 控制代理服务器缓存行为。no-cache:表示使用协商缓存;no-store:禁止使用缓存(包括强缓存和协商缓存); | If-Modified-Since | 第一次请求该资源返回的Last-Modify值。服务器收到这个请求后,将 If-Modified-Since 和当前的 Last-Modified 进行对比。如果相等,则说明资源未修改,返回 304。否则返回200和新的数据。 | If-None-Match | 上次访问该资源时服务器返回的ETag。如果服务端判断ETag没有变,则返回304。否则,返回200和新的ETag。 | Accept | 浏览器接受的数据类型。例如:text/html。 | Accept-Encoding | 浏览器接受的编码格式。例如:gzip。 | Accept-Language | 浏览器接受的语言。 | User-Agent | 客户端标识(浏览器标识、操作系统标识、浏览器内核标识)。 |
Response Header | 描述 |
---|
Set-Cookie | 浏览器会把指定的Cookie保存到本地,下次请求时自动带上Cookie。 | Expires | 本地缓存资源的过期时间。 | Cache-Control | 控制客户端缓存行为。max-age:缓存的最大有效时间(秒);no-cache:表示使用协商缓存;no-store:禁止使用缓存(包括强缓存和协商缓存);public:默认设置;private:不能多用户共享,数据只能被指定用户缓存(通常指客户端)。如果需要HTTP认证,响应会自动设置为private。 | ETag | 资源内容的摘要信息。是资源的唯一标识。搭配If-None-Match使用。 | Last-Modified | 资源的最近一次更新时间(精确到秒)。搭配If-Modified-Since使用。 | Content-Length | 内容长度。有利于浏览器判断内容是否已结束。 | Content-Encoding | 内容编码方式。通常是gzip。 | Via | 服务端的请求链路。常用于调试。 | Date | 当前的服务器日期。 | Server | 服务端类型。例如:Nginx、Tomcat。 |
HTTP Body
常见的请求体格式有:
- application/json
- application/x-www-form-urlencoded
- multipart/form-data
- text/xml
使用 HTML 的 form 标签提交产生的 HTML 请求,默认会产生 application/x-www-form-urlencoded 的数据格式,当有文件上传时,则会使用 multipart/form-data。 HTTPS HTTPS使用TLS加密通道来传输HTTP内容。 有两个作用,一是确定请求的目标服务端身份,二是保证传输的数据不会被网络中间节点窃听或者篡改。
HTTP2 HTTP 2.0 最大的改进有两点,一是支持服务端推送,二是支持 TCP 连接复用。
服务端推送能够在客户端发送第一个请求到服务端时,提前把一部分内容推送给客户端,放入缓存当中,这可以避免客户端请求顺序带来的并行度不高,从而导致的性能问题。
TCP 连接复用,则使用同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接建立时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。
浏览器缓存
WHAT
第一次访问某个网站时,浏览器会把样式文件和图片等满足条件的静态资源保存到本地,下次再访问该网站时,浏览器就可以使用本地缓存数据,而不需要每次都要网络请求数据。
WHY
合理地使用缓存,不仅可以加快页面访问速度,提升用户体验;还可以减少带宽消耗,节约成本。
HOW
当浏览器在获取资源时,先判断本地缓存数据是否满足强缓存条件,如果是,就直接返回本地数据。否则,再判断是否满足协商缓存条件,如果是,就直接返回本地数据。如果这两者都不满足的话,再通过网络请求数据。
强缓存
强缓存的决策过程只发生在浏览器端,不需要跟服务器发生交互。
说明:
- 涉及Expire和Cache-Control两个HTTP Header(详见上文HTTP Header部分)。
- Cache-Control比Expire优先级更高。
- Expire指的是服务器的时间,是一个绝对时间。如果客户端系统时间与服务器时间不一致,则会存在偏差。而Cache-Control使用的是相对时间max-age,不存在偏差。
协商缓存
协商缓存的决策过程发生在服务器端。浏览器在使用本地缓存数据前,需要先跟服务器确认数据是否已被更新。
说明:
- 涉及Etag和If-None-Match、Last-Modify和If-Modify-Since两对HTTP Header(详见上文HTTP Header部分)。
- ETag比Last-Modify的优先级更高。
- Last-Modify的判断条件是资源的更新时间。时间精度是秒,如果资源在短时间内发生改变,Last-Modified并不会变化;当资源被多次修改后恢复原来的样子,此时Last-Modified改变了,但资源内容没有变化。
- Etag的判断条件是资源的唯一标识符,可以更准确地判断资源是否更新。
注:直接刷新页面会使用【协商缓存】,通过地址栏输入url使用【强缓存】。
缓存位置
缓存位置共四种,按优先级从高到低如下,当依次查找缓存且都没有命中的时候,才会去请求网络。
- Service Worker
- Memory Cache
- Disk Cache
- Push Cache
缓存位置 | 说明 |
---|
Service Worker | Service Worker 是运行在浏览器背后的独立线程。通过拦截请求的方式,允许用户精细化缓存控制,包括:控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。 | Memory Cache | 内存通常用于缓存当前页面包含的CSS、JS、PNG等资源。内存IO速度快,但无法持久化(Tab 页面关闭时,内存中的缓存也会被释放)。 | Disk Cache | 硬盘存储 容量大且可以持久化,在缓存中使用最普遍。它会根据 HTTP Herder 中的字段判断哪些资源需要缓存,哪些资源可以不请求直接使用,哪些资源已经过期需要重新请求。并且即使在跨站点的情况下,相同地址的资源一旦被硬盘缓存下来,就不会再次去请求数据。 | Push Cache | HTTP/2 中的内容。在国内不够普及。 |
|