你可能不知道的HTTP协议


应用协议都有哪些

  • 域名系统(Domain Name System,DNS):用于实现网络设备名字到IP地址映射的网络服务。
  • 文件传输协议(File Transfer Protocol,FTP):用于实现交互式文件传输功能。
  • SMTP是一种提供可靠且有效电子邮件传输的协议。SMTP 是建模在 FTP 文件传输服务上的一种邮件服务,SMTP 服务器在默认端口 25 上监听客户请求,主要用于传输系统之间的邮件信息。
  • 简单网络管理协议(simple Network Management Protocol,SNMP):用于管理与监视网络设备。
  • 远程登录协议(Telnet):用于实现远程登录功能。
  • 超文本传输协议(HyperText Transfer Protocol,HTTP):超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。请求和响应消息的头以ASCII形式给出。

延展了解:WWW是什么
凡是上网的人,谁不知道“WWW”的重要作用?要输入网址,首先得打出这三个字母来。
万维网是无数个网络站点和网页的集合,它们在一起构成了因特网最主要的部分。

(伯纳斯·李,在世界上最大型的粒子物理学实验室-欧洲核子研究组织,发明了万维网。)

二.在我上网的过程中,都发生了什么

1.打开浏览器,输入网址URL,看看都有什么

a

2.通过访问的域名找出其IP地址(专门保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器)

b

3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器

  • 请求长这样
    c
    • (请求方法一般有:GET、POST、PUT、DELETE等)
    • POST和GET区别(传参方式一个通过 url,一个通过正文)
  • 接下来应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操作。
    d

  • 在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立,通常称为三次握手。这个所谓的「连接」,只是双方计算机里维护一个状态机,在连接建立的过程中,双方的状态变化时序图就像这样。

  • e
  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。
    然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。
    服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。
    客户端收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了。
    服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。
  • (延展阅读SYN攻击属于DDoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。)
  • TCP 报文生成。在双方建立了连接后,TCP 报文中的数据部分就是存放 HTTP 头部 + 数据,组装好 TCP 报文之后,就需交给下面的网络层处理。
  • 至此,网络包的报文如下图。
  • f
  • IP 报文生成。
  • g
  • MAC 报文生成。
  • h
  • 最后网络包格式
  • i
  • 网卡驱动从 IP 模块获取到包之后,会将其复制到网卡内的缓存区中,接着会其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
  • j
  • 互相扒皮 —— 服务器 与 客户端
  • k

4.服务器给浏览器响应一个301永久重定向响应

5.浏览器跟踪重定向地址

6.服务器处理请求


7.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

  • 状态行:由协议版本、数字形式的状态代码<1xx,2xx,4xx,5xx>、及相应的状态描述,各元素之间以空格分隔。)示例:HTTP/1.1 200 OK \r\n
  • 响应头(Response Header):由关键字/值对组成,每行一对,关键字和值用英文冒号”:”分隔。示例:l
  • 响应正文:包含着我们需要的一些具体信息,比如cookie,html,image,后端返回的请求数据等等。这里需要注意,响应正文和响应头之间有一行空格,表示响应头的信息到空格为止

    8.浏览器显示 HTML

    9.浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)


三.问题来了

  • 1.现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
  • 2.一个 TCP 连接可以对应几个 HTTP 请求?
  • 3.一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
  • 4.浏览器对同一 Host 建立 TCP 连接到数量有没有限制?




















四.原来如此

  • 1.现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
    答:在 HTTP/1.0 中,一个服务器在发送完一个HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。既然维持TCP 连接好处这么多,HTTP/1.1 就把 Connection 头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。
  • 2.一个 TCP 连接可以对应几个 HTTP 请求?
    答:如果维持连接,一个 TCP 连接是可以发送多个 HTTP 请求的。
  • 3.一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
    答:在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。

  • 4.浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
    答:有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。


五.HTTP1.0 & HTTP1.1 & HTTP2.0

3.png

1.HTTP1.0和HTTP1.1的区别

  • 长连接(Persistent Connection)
    HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启长连接keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。HTTP1.0需要使用keep-alive参数来告知服务器端要建立一个长连接。
  • 节约带宽
    HTTP1.0中存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。
  • HOST域
    在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname),HTTP1.0没有host域。随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都支持host域,且请求消息中如果没有host域会报告一个错误(400 Bad Request)。
  • 缓存处理
    在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  • 错误通知的管理
    在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

2.HTTP1.1和HTTP2.0的区别

  • HTTP/2 采用二进制格式传输数据
  • 多路复用
    HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
  • 头部数据压缩
    在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。
  • HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
  • 服务器推送
    服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。 为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。

六.HTTPS

HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上,所以很容易遭到黑客的攻击。

下面两图中,浏览器中填入的是相同的URL,左边是正确响应,而右边则是被劫持后的响应
s
所以 HTTP 传输面临的风险有:

(1) 窃听风险:黑客可以获知通信内容。

(2) 篡改风险:黑客可以修改通信内容。

(3) 冒充风险:黑客可以冒充他人身份参与通信。


为了防止上述现象的发生,人们想到一个办法:对传输的信息加密(即使黑客截获,也无法破解)

(关于加密方式)

  • 对称加密
    • 这种方式加密和解密同用一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。
  • 非对称加密

    • 使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
    • 缺点:公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容;

      • 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;

      • 使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率;

  • 结合两者

    • 对称加密+非对称加密(HTTPS采用这种方式)
    • 发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信
  • 假如 Alice 向 Bob 传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为

    • Alice 准备好要传送的数字信息(明文); [3]
      • Alice 对数字信息进行哈希运算,得到一个信息摘要; [3]
      • Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上; [3]
      • Alice 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文; [3]
      • Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES密钥连同密文一起传送给Bob; [3]
      • Bob 收到 Alice 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密,得到 Alice随机产生的加密密钥; [3]
      • Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃; [3]
      • Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要; [3]
      • Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要; [3]
      • Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。 [3]
  • 如何证明公钥的真实性
    • CA证书颁发机构
    • 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。

思考题:HTTPS能被劫持吗