OKHttp全解析系列(一) -- HTTP基础 - Go语言中文社区

OKHttp全解析系列(一) -- HTTP基础


目录.JPG

前言

本系列主要分析OKHttp源代码的框架和设计思想,因为OKHttp实现了HTTP协议,所以在做源代码分析之前,对于HTTP的基础知识做一个简单的回顾还是非常有必要的,以免陷入知其然不知其所以然的尴尬境地。
本文主要基于《图解HTTP》进行介绍,从某种意义上说,本文也算是一篇读书笔记吧,若是有些地方说得不是很清楚,建议大家参考原书。另外,《HTTP权威指南》也是业界经典,如果大家有时间,建议也一起研读一下。

基础知识

为了理解HTTP,我们有必要事先了解一下TCP/IP协议族。其是互联网相关联的协议集合的总称,通常使用的网络就是在TCP/IP协议族的基础上运作的,而HTTP属于它内部的一个子集,除此之外,还包括大家所熟知的FTP,DNS,TCP,UDP,IP等等协议。
学习过《计算机网络》的我们都应该知道OSI的七层协议模型。


七层协议模型.png

其核心思想就是把数据信息包装起来,即封装:发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
值得一提的是,层次化之后,设计也变得相对简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、对方的传输线路是怎样的、是否能确保传输送达等问题。
最后我们以一张图结束本段落的介绍。


协议总览.png

HTTP协议简介

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

应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色。仅从一条通信线路来说,服务器端和客服端的角色是确定的。并且,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。

告知服务器意图的 HTTP 方法(HTTP/1.1)

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

HTTP 是不保存状态的协议,使用 Cookie 的状态管理

HTTP 是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
可是随着 Web 的不断发展,我们的很多业务都需要对通信状态进行保存。于是我们引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。


使用 Cookie 的状态管理.jpg

持久连接

HTTP 协议的初始版本中,每进行一个 HTTP 通信都要断开一次 TCP 连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无畏的 TCP 连接建立和断开,增加通信量的开销。
为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。

管线化

持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
比如,当请求一个包含多张图片的 HTML 页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术要比持久连接速度更快。请求数越多,时间差就越明显。

HTTP报文简介

HTTP报文结构

用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
HTTP 报文大致可分为报文首部和报文主体两部分。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。


HTTP报文结构.png

请求报文结构

HTTP请求报文结构.jpg

请求报文的首部内容由以下数据组成:

  • 请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)

请求报文的示例,如下:

HTTP请求报文示例.png

响应报文结构

HTTP响应报文结构.jpg

响应报文的首部内容由以下数据组成:

  • 状态行 —— 包含表明响应结果的状态码、原因短语和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)

响应报文的示例,如下:


HTTP响应报文示例.png

HTTP首部

首部字段概述

在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息。
使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容。

首部字段类型

根据实际用途被分为以下4中类型

  • 通用首部字段:请求报文和响应报文两方都会使用的首部
  • 请求首部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
  • 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。

各类型首部字段简介

通用首部字段
  • Cache-Control:控制缓存的行为
  • Connection:逐挑首部、连接的管理
  • Date:创建报文的日期时间
  • Pragma:报文指令
  • Trailer:报文末端的首部一览
  • Transfer-Encoding:指定报文主体的传输编码方式
  • Upgrade:升级为其他协议
  • Via:代理服务器的相关信息
  • Warning:错误通知
请求首部字段
  • Accept:用户代理可处理的媒体类型
  • Accept-Charset:优先的字符集
  • Accept-Encoding:优先的内容编码
  • Accept-Language:优先的语言(自然语言)
  • Authorization:Web认证信息
  • Expect:期待服务器的特定行为
  • From:用户的电子邮箱地址
  • Host:请求资源所在服务器
  • If-Match:比较实体标记(ETag)
  • If-Modified-Since:比较资源的更新时间
  • If-None-Match:比较实体标记(与 If-Macth 相反)
  • If-Range:资源未更新时发送实体 Byte 的范围请求
  • If-Unmodified-Since:比较资源的更新时间(与 If-Modified-Since 相反)
  • Max-Forwards:最大传输逐跳数
  • Proxy-Authorization:代理服务器要求客户端的认证信息
  • Range:实体的字节范围请求
  • Referer:对请求中 URI 的原始获取方
  • TE:传输编码的优先级
  • User-Agent:HTTP 客户端程序的信息
响应首部字段
  • Accept-Ranges:是否接受字节范围请求
  • Age:推算资源创建经过时间
  • ETag:资源的匹配信息
  • Location:令客户端重定向至指定 URI
  • Proxy-Authenticate:代理服务器对客户端的认证信息
  • Retry-After:对再次发起请求的时机要求
  • Server:HTTP 服务器的安装信息
  • Vary:代理服务器缓存的管理信息
  • WWW-Authenticate:服务器对客户端的认证信息
实体首部字段
  • Allow:资源可支持的 HTTP 方法
  • Content-Encoding:实体主体适用的编码方式
  • Content-Language:实体主体的自然语言
  • Content-Length:实体主体的大小(单位:字节)
  • Content-Location:替代对应资源的 URI
  • Content-MD5:实体主体的报文摘要
  • Content-Range:实体主体的位置范围
  • Content-Type:实体主体的媒体类型
  • Expires:实体主体过期的日期时间
  • Last-Modified:资源的最后修改日期时间
为 Cookie 服务的首部字段

Cookie的工作机制是用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前存放的Cookie。
Cookie相关的首部字段如下:

  • Set-Cookie:开始状态管理所使用的 Cookie 信息,存在于响应首部字段
  • Cookie:服务器接收到的 Cookie 信息,存在于请求首部字段
其他首部字段

HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。
以下就是一些最为常用的首部字段:

  • X-Frame-Options:属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
  • X-XSS-Protection:属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
  • DNT: 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
  • P3P:属于 HTTP 响应首部,通过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

HTTP状态码

状态码概述

HTTP 状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。
HTTP 状态码如 200 OK ,以 3 位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。
不少返回的响应状态码都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,状态码依然返回 200 OK。

状态码类型

  • 1XX:Informational(信息性状态码),接收的请求正在处理
  • 2XX:Success(成功状态码),请求正常处理完毕
  • 3XX:Redirection(重定向状态码),需要进行附加操作以完成请求
  • 4XX:Client Error(客户端错误状态码),服务器无法处理请求
  • 5XX:Server Error(服务器错误状态码),服务器处理请求出错

各类型状态码简介

2XX成功
  • 200 OK
  • 204 No Content
  • 206 Partial Content
3XX 重定向
  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 307 Temporary Redirect
客户端错误
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
服务器错误
  • 500 Internal Server Error
  • 503 Service Unavailable

HTTP报文主体相关

报文和实体的差异

  • 报文:是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
  • 实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。(实体首部相关内容在上面已有阐述。)

如果把报文想象成因特网货运系统中的箱子,那么实体就是报文中实际的货物。


HTTP报文结构2.png

我们可以看到,上面示例右图中深红色框的内容就是报文的实体部分,而蓝色框的两部分内容分别就是实体首部和实体主体。而左图中粉红框内容就是报文主体。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。

内容编码与传输编码

内容编码和传输编码很容易搞混,这里放在一起说一下

  • 内容编码:指明应用在实体主体上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常见的内容编码有以下几种:gzip,compress,deflate,identity。
  • 传输编码:在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
内容编码和传输编码的对比.png

异同如下:

  • 相同点:均是可逆变化。
  • 不同点:内容编码是和内容的具体格式细节紧密相关的;传输编码同内容的格式无关,使用它们是由于架构方面的原因,使用传输编码是为了改变报文中的数据在网络上传输的方式。

传输编码之分块传输编码

通过以上内容,我们了解到,传输编码只定义作用于分块传输编码中,那么我们就来介绍一下分块传输编码。
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。
当使用持久连接时,在服务器写主体之前,必须知道它的大小并在 Content-Length 首部中发送。如果服务器动态创建内容,就可能在发送之前无法知道主体的长度。
分块编码为这种困难提供了解决方案,只要允许服务器把主体分块发送,说明每块的大小就可以了。因为主体是动态创建的,服务器可以缓冲它的一部分,发送其大小和相应的块,然后在主体发送完之前重复这个过程。服务器可以用大小为 0 的块作为主体结束的信号,这样就可以继续保持连接,为下一个响应做准备。从而就不需要在发送之前知道整个报文的大小了。
分块传输编码的报文示例如下:


分块传输编码的报文.png

发送多种数据的多部分对象集合

发送邮件时,我们可以在邮件中写入文字并添加多份附件,这是因为采用了MIME机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。而在MIME扩展中会使用一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。
相应地,HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可包含多种类型实体。
多部分对象集合包含的对象如下:

  • multipart/form-data:在 Web 表单文件上传时使用。
  • multipart/byteranges:状态码 206 Partial Content 响应报文包含了多个范围的内容时使用。

获取部分内容的范围请求

文件下载中断,如果继续下载,我们需要一种可恢复机制,即能从之前下载中断处恢复下载。要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求。


范围请求示例.png

针对范围请求,响应会返回状态码为206 Partial Content的响应报文。如果服务端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。

与HTTP协作 的Web服务器

网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送过来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。网关能使通信线路上的服务器提供非HTTP协议服务。

隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。

代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
代理服务器的好处:

  • 利用缓存技术减少网络带宽的流量
  • 组织内部针对特定网站的访问控制
  • 以获取访问日志为主要目的

代理服务器的分类

  • 是否使用缓存:缓存代理和非缓存代理
  • 是否会修改报文:透明代理和非透明代理

代理之缓存

根据以上内容,我们知道有一种代理为缓存代理,即当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。优点在于利用缓存可避免多次从源服务器转发资源。
因为涉及缓存的HTTP首部字段有好多,所以服务器的缓存策略,分析起来比较麻烦,易出错。彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法 将缓存机制看做是HTTP缓存策略三个要素(缓存存储策略,缓存过期策略,缓存对比策略)相互作用后的集合。分析和设置HTTP报文缓存头时,只要能从中精准的分解出缓存三要素,就能非常准确的预判到缓存设置最终能达到的效果。大家可以阅读参考之,这里就不详细赘述了。

HTTPS简介

HTTP协议的不足

HTTP虽然如此优秀,但也有缺点,主要缺点如下:

  • 通信使用明文(不加密),内容可能会被窃听;
  • 不验证通信方的身份,有可能遭遇伪装;
  • 无法证明报文的完整性,所以有可能已遭篡改;

HTTPS

为了解决上述问题,HTTPS应运而生。其提供了身份验证信息加密完整性校验的功能,可以解决HTTP存在的安全问题。
经常在Web的登录页面和购物结算界面等使用HTTPS通信。另外,也可以使用HTTPS通信来防止运营商劫持。

HTTPS本质
HTTPS本质.png

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。注:TLS是在SSL基础上制定的升级版协议。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。

信息加密--HTTPS采用混合加密机制
  • 对称密钥加密
    加密和解密同用一个密钥的方式成为对称密钥加密。
    优点:对称加密强度非常高,一般破解不了。
    缺点:以对称密钥加密方式加密时必须将密钥也发送给对方。这时,密钥就有被窃听的风险,但不发送,对方就不能解密。
  • 非对称密钥加密
    使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。私有密钥不能让其他人任何人知道。而公开密钥则可以随时发布,任何人都可以获得。
    优点:不需要发送用来解密的私有密钥,也不用担心密钥被攻击者窃听而盗走,解决了对称密钥加密的缺点。
    缺点:处理起来更为复杂,因此性能和速度要慢很多。
  • HTTPS采用混合加密机制
    HTTPS采用对称密钥加密和非对称密钥加密两者并用的混合加密机制,在交换密钥环节使用非对称密钥加密方式(安全地交换在稍后的对称密钥加密中要使用的密钥),之后的建立通信交换报文阶段则使用对称密钥加密方式。
身份验证--证明公开秘钥正确性的证书

非对称密钥加密最大的一个问题,就是无法证明公钥本身就是货真价实的公钥。比如,正准备和某台服务器建立非对称密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。
为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。


证书的运作流程.png

证书的运作流程如下:

  1. 服务器的运营人员向数字证书认证机构(CA)提出公开密钥的申请;
  2. CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
  3. 如果信息审核通过,CA会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
    证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
    签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA的私钥对信息摘要进行加密,密文即签名;
  4. 客户端在HTTPS握手阶段向服务器发出请求,要求服务器返回证书文件;
  5. 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
  6. 客户端然后验证证书相关的域名信息、有效时间等信息;
  7. 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应CA的证书,证书也会被判定非法。

在这个过程注意几点:

  1. 申请证书不需要提供私钥,确保私钥永远只能被服务器掌握;
  2. 证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
  3. 根证书:内置CA对应的证书;自签名证书:颁发者和使用者相同,自己为自己签名;
  4. 证书=公钥+申请者与颁发者信息+签名;
完整性校验--HTTPS的安全通信机制

我们来观察一下HTTPS单向验证的握手流程


HTTPS单向验证的握手流程.png

主要分为四个步骤:

  1. 交换各自支持的功能,对需要的连接参数达成一致;
  2. 验证出示的证书,或使用其他方式进行身份验证;
  3. 对将用于保护会话的共享主密钥达成一致;
  4. 验证握手消息是否被第三方团体修改;

在以上流程中,应用层发送数据时会附加一种叫做MAC(Message Authentication Code)的报文摘要。MAC能够查知报文是否遭到篡改,从而保证报文的完整性

HTTPS的缺点

当然,HTTPS当然也有缺点:

  • SSL慢。SSL的慢分两种。一种是指通信慢。另一种是指由于消耗CPU及内存等资源,导致处理速度慢。
  • SSL开销大。SSL需要购买证书,这需要一定的开销。

因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。

访问用户的身份认证

对于客户端的认证,本文不做重点介绍,一语带过,想要了解的同学,可以参考相关书籍。
除了对于服务端的认证,在某些情景下,还需要对客户端进行认证。HTTP/1.1使用的认证方式如下所示

  • BASIC认证(明文)
  • DIGEST认证(防止密码被窃,但不防止用户伪装)
  • SSL客户端认证(以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟上文所讲的服务器证书如出一辙。但需要花钱)
  • 基于表单的认证(Web应用程序,多用此方式)

基于HTTP的追加协议

HTTP标准自身带来瓶颈

HTTP标准建立时,制定者主要想把HTTP当做传输HTML文档的协议。但是随着时代的发展,HTTP标准自身就出现了各种瓶颈和限制,不能满足所有需求。

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始。客户端不可以接收除响应以外的指令
  • 请求/响应首部未经压缩就发送。首部信息越多延迟越大
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多
  • 可任意选择数据压缩格式。非强制压缩发送。

HTTP功能上的不足可通过创建一套全新的协议来弥补。可是目前基于HTTP的Web浏览器的使用环境已遍布全球,因此无法完全抛弃HTTP。有一些新协议的规则是基于HTTP的,并在此基础上添加了新的功能。

SPDY

  • Ajax
    局部更新
  • Comet
    推送功能&局部更新
  • SPDY
    多路复用、请求优先级、压缩HTTP首部、推送功能、服务器提示功能

发展到SPDY,其真正从协议级别消除HTTP所遭遇的瓶颈。
有好几家Web浏览器已经针对SPDY做出了相应的调整,但SPDY在Web网站端却进展不佳。其一是因为一个网站多个域名,不能多路复用;其二是很多Web网站存在的问题并非仅仅是由HTTP瓶颈所导致。

WebSocket

WebSocket是一套新协议及API,即Web浏览器与Web服务器之间全双工通信标准。
连接刚开始时还是HTTP协议,所以由客户端先发起连接。成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。WebSocket协议支持全双工通信,因此服务器端不必等待请求,可直接发送数据。

HTTP 2.0

目标是改善用户在Web时的速度体验。可以说HTTP 2.0是SPDY的升级版(其实也是基于SPDY设计的)。


HTTP2.0vsHTTP1.1.png

由于篇幅的限制,HTTP 2.0的详细内容不再详细介绍,有兴趣的朋友,可以参考相关书籍和资料。

参考

《图解HTTP》
《HTTP权威指南》
一篇文章带你详解 HTTP 协议
彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
HTTPS 原理浅析及其在 Android 中的使用


版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/8962f1f175e8
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-07 21:30:49
  • 阅读 ( 1422 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢