本文介绍了前端开发涉及的网络协议HTTP与WebSocket。HTTP协议部分着重介绍协议的演进与区别。而WebSocket则主要介绍来由和用法。

HTTP1.0/HTTP1.1/HTTP2

HTTP协议简介

  • HTTP(HyperText Transfer Protocol)协议为TCP/IP协议族中的一员,属于应用层协议。
  • HTTP协议用于客户端与服务器之间的通信
  • HTTP通过请求(request)和响应(response)达成通信
  • HTTP是无状态协议,即协议不对之前发送过的请求和响应进行保存处理
  • HTTP通过URI定位资源

HTTP1.0与HTTP1.1

早期网页采用HTTP1.0协议,HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,目前HTTP1.1是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

  1. 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如ETag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  2. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  3. 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  4. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
  5. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。Compares the performance of the three HTTP/1.x connection models: short-lived connections, persistent connections, and HTTP pipelining.

中间一图为长连接,由于始终保持连接,避免了频繁建立和关闭连接的时间成本。

最右边一图则为管线化,是HTTP2多路复用的雏形,HTTP2又在其基础上进行了修改。管线化在目前大多数浏览器中不得以实现,因此取而代之的是HTTP2中的多路复用。

HTTPS

HTTP的缺点
  • 通信使用明文,不进行加密,内容可能被窃听
  • 不验证通信方身份,可能遭遇伪装
  • 无法验证报文完整性,可能遭到篡改

为了解决HTTP以上涉及安全性的缺点,诞生了HTTPS协议。

HTTPS主要从加密、认证、完整性保护三个方面下手解决通信的安全性问题

SSL

针对HTTP协议可能被窃听的缺点,通过增加一层SSL(Secure Socket Layer)或TLS(Transport Layer Security),HTTP就演进成为了HTTPS。可以说SSL或TLS层就是HTTPS的核心。

数字证书

为了验证通信方身份,通常服务器需要购买由CA机构颁发的数字证书。

  • 使用权威的第三方机构也就是CA向安全的服务器颁发证书。来证明这台服务器的合法性。

  • 服务器通过这个证书来把自己的公钥加密以后发给客户端

  • 客户端收到这个加密后的公钥以后 ,就用第三方机构的公钥 把这个服务器返回的加密后的公钥 解密 从而得到真正的服务器 的公钥

完整性保护

为了防止篡改通常使用MD5或SHA-1确定报文的完整性

HTTPS带来的问题
  • 速度变慢

由于在通信协议中增加了一层,导致整体通信量增加以及花费更多CPU、内存资源去加密解密,这些都会影响速度

  • 成本问题

申请HTTPS证书通常都需要费用。证书费用与网站规模与安全等级正相关

HTTP2

HTTP2有以下新特性,使通信变得更迅速,目前也已经得到了广泛使用

1. 多路复用

img

由于HTTP2可以在一条请求中获取多个静态文件,减少了请求次数,使得通信时间大幅缩短。

HTTP2把要传输的信息分割成一个个二进制帧,首部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,充分利用了网络带宽,提高了并发度。更进一步,http2还能对这些流指定优先级,优先级能动态的被改变,例如把CSS和JavaScript文件设置得比图片的优先级要高,这样代码文件能更快的下载下来并得到执行。

2. header压缩

HTTP1.1中的头部显得有些冗长。而HTTP2通过将其压缩成二进制数据的方法来减小头部大小。具体实现方法类似于将字段映射为索引,然后对值进行哈夫曼编码。

3. 服务端推送Server Push

这个功能通常被称作“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。

WebSocket

HTTP只存在客户端到服务器的单向请求,为了获取服务器状态的连续变化,HTTP采用轮询的方式,即每隔一段时间发送一个请求获取服务器状态变化。这样做非常浪费资源,需要不停的进行HTTP请求,或连接始终打开。

由于HTTP本身存在服务器不能主动跟客户端建立通信的弊端,因此引入了WebSocket协议。

WebSocket的特点

  1. 建立在 TCP 协议之上,服务器端的实现比较容易。
  2. 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  3. 数据格式比较轻量,性能开销小,通信高效。
  4. 可以发送文本,也可以发送二进制数据。
  5. 没有同源限制,客户端可以与任意服务器通信。
  6. 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
1
ws://example.com:80/some/path