爱客仕-前端团队博客园

网络协议(上)

前言

对于一名天天和Web打交道的程序员来说,了解一些网络知识是必不可少的。

HTTP

网络正常情况下,当我们打开浏览器输入URL然后回车就能看到相对应的页面,Web使用HTTP(HyperText Transfer Protocol,超文本传输协议)作为网络协议规范,实现客户端请求以及服务器响应的通信过程。HTTP处于计算机网络中的应用层,是建立在TCP协议之上的,因此HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的一些特性,例如tcp建立连接的3次握手和断开连接的4次握手以及每次建立连接带来的RTT延迟时间。

HTTP的发展

其实在HTTP建立之初,主要是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。第一版的HTTP文档是1991年提出来的 HTTP/0.9。这是有史以来最简单的协议:它仅有一个GET方法。如果客户端要访问服务器上的一些网页,它会作出如下的简单请求:

1
2
3
4
5
6
GET /index.html
服务器响应:
(response body)
(connection closed)

服务器会得到这个请求,然后通过HTML格式回复响应内容,一旦响应内容发送完毕,就会关闭这个连接。特点就是没有header数据块,仅有get请求方法,并且必须以html方式响应。1996年HTTP的下一个版本HTTP/1.0诞生,丰富了响应的内容,比如图像,文件,视频等等,并且可设置指定的header头,并且增加了更多的请求方法,但是HTTP/1.0不能在每个连接中发送多个请求,即一个请求,对应一个连接,请求完成即关闭,新请求发起时需要重新进行三次握手连接,会有较大的内存损耗。1999年HTTP/1.1版本发布,其特点是更加丰富的请求方法、响应状态码以及响应头等,本文将针对1.0版本以及1.1版本进行对比分析,在此之前我们先来了解下TCP/IP。
HTTP协议的发展历程:

TCP/IP

TCP/IP是一个协议集合。为了方便,所以统称为TCP/IP。TCP/IP中有一个重要的概念是分层,按照层次分为以下四层:应用层、传输层、网络层、数据链路层。一个层只负责一个层次的问题,如果出问题了,和其他的层次无关,只要维护这个层次也就好了。
下面是图解HTTP的图:

由图可知,发送层的传输途径为应用册–>传输层–>网络层–>链路层,每经过一层就添加相应层的首部并将源数据进行封装,而接收端对则进行相反的操作,对封装的数据进行解析,获得发送端传来的数据,这就完成了一个完整的http请求。

HTTP1.0 与HTTP1.1比较

HTTP1.1在1999年开始广泛应用于现在的各大浏览器网络请求中,也是当前使用最为广泛的HTTP协议。相较于HTTP/1.0,其主要的改进包括:

  1. 请求方法增多。PUT、PATCH、HEAD、OPTIONS、DELETE 每个都对应于不同的应用场景,比如PUT对应修改,DELETE对应删除;
  2. 持久性连接。由上可知HTTP/1.0存在每次请求都是新连接的性能问题,HTTP/1.1 引入了对持久性连接的支持,例如: 默认情况下连接不会被关闭,在多个连续的请求下它会保存连接的打开状态。想要关闭这些连接,需要将 Connection: close 加入到请求的头信息中。客户端通常会在最后一次请求中发送这个头信息用来安全的关闭连接。
  3. 缓存处理。HTTP1.0主要使用header里的If-Modified-Since、Expires来做为缓存判断的标准,HTTP1.1引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存。
  4. 带宽优化。HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便充分利用带宽。
  5. 错误通知的管理。在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  6. 主机名标识。在 HTTP/1.0 中,每台服务器都绑定一个唯一的IP地址,Host头信息不是必须项。但 HTTP/1.1 中要求必须要有Host头信息。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

HTTP1.X存在的问题

  1. 通信的信息明文(默认不对信息加密)。
  2. 客户端和服务器端都无法验证对方的身份。
  3. 无法保证报文的完整性与数据的安全性。
  4. header头携带的内容过大,增加了传输的成本,尤其在移动端增加用户流量。
  5. 虽然HTTP1.1支持了keep-alive,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
  6. HTTP1.X并未实现客户端与服务器全双工通信。

HTTPS

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。简单来说,HTTPS就是安全版的HTTP,不过HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的,。由于当今时代对安全性要求更高,在用户登录以及支付页面等强制使用HTTPS来传输数据以确保数据的安全性非常重要。

HTTPS工作流程

一个HTTPS工作流程大概包括以下几个部分:

  1. 完成TCP三次同步握手
  2. 客户端验证服务器数字证书,通过,进入步骤3
  3. DH算法协商对称加密算法的密钥、hash算法的密钥
  4. SSL安全加密隧道协商完成
  5. 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改

HTTPS改造

如果一个网站要全站由HTTP替换成HTTPS,可能需要关注以下几点:

  1. 安装CA证书,一般的证书都是需要收费的。
  2. 在购买证书之后,在证书提供的网站上配置自己的域名,将证书下载下来之后,配置自己的web服务器,同时进行代码改造。
  3. HTTPS 降低用户访问速度。SSL握手、HTTPS 对速度会有一定程度的降低,但是只要经过合理优化和部署,在很多场景下,HTTPS 速度完全不逊于 HTTP,如果使用 SPDY(下节介绍),HTTPS 的速度甚至还要比 HTTP 快。
  4. 相对于HTTPS降低访问速度,其实更需要关心的是服务器端的CPU压力,HTTPS中大量的密钥算法计算,会消耗大量的CPU资源。

淘宝网https改造

未完待续。。。