HTTP 的特点和缺点

特点: 无连接无状态灵活简单快速

  • 无连接: 每一次请求都要连接一次,请求结束就会断掉,不会保持连接。
  • 无状态: 每一次请求都是独立的,请求结束后不会记录连接的信息,减少了网络开销,这是优点也是缺点
  • 灵活: 通过http协议中头部的Content-type标记,可以传输任意数据类型的数据对象(文本、图片、视频等),非常灵活。
  • 简单快速: 发送请求访问某个资源时,只需传送请求方法和URL就可以,使用简单,正由于http协议简单,使得http服务器的程序规模小,因而通信速度很快。

缺点: 无状态不安全明文传输对头阻塞

  • 无状态: 请求不会记录任何连接信息,没有记忆,就无法区分多个请求的发起者身份是不是同一个客户端的,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
  • 不安全: 明文传输可能被窃听,不安全,缺少身份认证可能遭遇伪装,还有缺少报文完整性验证可能遭到篡改。
  • 明文传输: 报文(header部分)使用的是明文,直接将信息暴露给外界,WIFI陷阱就是复用明文传输的特点,诱导用户连上热点,疯狂抓去流量,从而获取用户敏感信息。
  • 队头阻塞: 开启长连接(下面有讲)时,只建立一个TCP连接,同一时刻只能处理一个请求,那么当请求耗时过长时,其他请求就只能阻塞状态(如何解决下面有讲)

HTTP 报文组成部分

http报文:由请求报文和响应报文组成.
请求报文:由请求行、请求头、空行、请求体四部分组成.
响应报文:由状态行、响应头、空行、响应体四部分组成.

  • 请求行:包含http方法,请求地址,http协议以及版本.

    1
    GET /index.html HTTP/1.1
  • 请求头/响应头: 包含了一系列的键值对,用于提供关于请求或响应的信息和配置,来告诉服务端我要哪些内容,要注意什么类型等,请求头/响应头每一个字段详解

  • 空行: 用来区分首部与实体,因为请求头都是键值对的格式,当解析遇到空行时,服务端就知道下一个不再是请求头部分,就该当作请求体来解析了.
  • 请求体:请求的参数.
  • 状态行: 包含协议版本号、状态码、状态信息。
    1
    HTTP/1.1 200 OK

http/https

HTTP 1.0(1996年)

  • 任意数据类型都可以发送
  • 有GET、POST、HEAD三种方法
  • 无法复用TCP连接(长连接)
  • 有丰富的请求响应头信息。以header中的Last-Modified/If-Modified-SinceExpires作为缓存标识

HTTP 1.1(1997年)

  • 引入更多的请求方法类型PUTPATCHDELETEOPTIONSTRACECONNECT
  • 引入长连接,就是TCP连接默认不关闭,可以被多个请求复用,通过请求头connection:keep-alive设置
  • 引入管道连接机制,可以在同一TCP连接里,同时发送多个请求
  • 强化了缓存管理和控制Cache-ControlETag/If-None-Match
  • 支持分块响应,断点续传,利于大文件传输,能过请求头中的Range实现
  • 使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址

缺点:主要是连接缓慢,服务器只能按顺序响应,如果某个请求花了很长时间,就会出现请求队头阻塞

虽然出了很多优化技巧:为了增加并发请求,做域名拆分、资源合并、精灵图、资源预取…等等

最终为了推进从协议上进行优化,Google跳出来,推出SPDY协议

HTTP 2.0(2015年)

说出http2中至少三个新特性?

  • 使用新的二进制协议,不再是纯文本,避免文本歧义,缩小了请求体积
  • 多路复用,同域名下所有通信都是在单链接(双向数据流)完成,提高连接的复用率,在拥塞控制方面有更好的能力提升
  • 使用HPACK算法将头部压缩,用哈夫曼编码建立索表,传送索引大大节约了带宽
  • 允许服务端主动推送数据给客户端
  • 增加了安全性,使用HTTP 2.0,要求必须至少TLS 1.2
  • 使用虚拟的流传输消息,解决了应用层的队头阻塞问题

缺点

  • TCP以及TCP+TLS建立连接的延时,HTTP2使用TCP协议来传输的,而如果使用HTTPS的话,还需要TLS协议进行安全传输,而使用TLS也需要一个握手过程,在传输数据之前,导致我们花掉3~4个RTT
  • TCP的队头阻塞并没有彻底解决。在HTTP2中,多个请求跑在一个TCP管道中,但当HTTP2出现丢包时,整个TCP都要开始等待重传,那么就会阻塞该TCP连接中的所有请求

HTTP 3.0/QUIC

由于HTTP 2.0依赖于TCP,TCP有什么问题那HTTP2就会有什么问题。最主要的还是队头阻塞,在应用层的问题解决了,可是在TCP协议层的队头阻塞还没有解决。

TCP在丢包的时候会进行重传,前面有一个包没收到,就只能把后面的包放到缓冲区,应用层是无法取数据的,也就是说HTTP2的多路复用并行性对于TCP的丢失恢复机制不管用,因此丢失或重新排序的数据都会导致交互挂掉

为了解决这个问题,Google又发明了QUIC协议

并在2018年11月将QUIC正式改名为HTTP 3.0

特点

  • 在传输层直接干掉TCP,用UDP替代
  • 实现了一套新的拥塞控制算法,彻底解决TCP中队头阻塞的问题
  • 实现了类似TCP的流量控制、传输可靠性的功能。虽然UDP不提供可靠性的传输,但QUIC在UDP的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些TCP中存在的特性
  • 实现了快速握手功能。由于QUIC是基于UDP的,所以QUIC可以实现使用0-RTT或者1-RTT来建立连接,这意味着QUIC可以用最快的速度来发送和接收数据。
  • 集成了TLS加密功能。目前QUIC使用的是TLS1.3

HTTPS = HTTP+ SSL/TLS

TLS(Transport Layer Security传输层安全性)SSL(Secure Socket Layer安全套接字层) 的后续版本,它们是用于在互联网两台计算机之间用于身份验证加密的一种协议

机密性:对称加密 AES + 非对称加密 RSA
完整性:摘要算法
身份认证:数字证书
https://juejin.cn/post/6844904089495535624#heading-13

HTTPS 的性能优化

访问速度优化

  1. 会话复用,上面说了,复用session可以减少 CPU 消耗,因为不需要进行非对称密钥交换的计算。可以提升访问速度,不需要进行完全握手阶段二,节省了一个 RTT 和计算耗时。
  2. 使用 SPDY 或者 HTTP2。SPDY 最大的特性就是多路复用,能将多个 HTTP 请求在同一个连接上一起发出去,不像目前的 HTTP 协议一样,只能串行地逐个发送请求。Pipeline 虽然支持多个请求一起发送,但是接收时依然得按照顺序接收,本质上无法解决并发的问题。HTTP2支持多路复用,有同样的效果。
  3. 设置HSTS,服务端返回一个 HSTS 的 http header,浏览器获取到 HSTS 头部之后,在一段时间内,不管用户输入www.baidu.com还是http://www.baidu.com ,都会默认将请求内部跳转成https://www.baidu.com。Chrome, firefox, ie 都支持了 HSTS。
  4. Nginx设置Ocsp stapling。Ocsp 全称在线证书状态检查协议 (rfc6960),用来向 CA 站点查询证书状态,比如是否撤销。通常情况下,浏览器使用 OCSP 协议发起查询请求,CA 返回证书状态内容,然后浏览器接受证书是否可信的状态。这个过程非常消耗时间,因为 CA 站点有可能在国外,网络不稳定,RTT 也比较大。如果不需要查询则可节约时间。
  5. False start。简单概括 False start 的原理就是在 clientkeyexchange 发出时将应用层数据一起发出来,能够节省一个 RTT。

计算性能优化

  1. 优先使用 ECC椭圆加密算术
  2. 使用最新版的 OpenSSL
  3. TLS 远程代理计算
  4. 硬件加速方案

HTTP1 和 HTTP2

  • HTTP2是一个二进制协议,HTTP1是超文本协议,传输的内容都不是一样的
  • HTTP2报头压缩,可以使用HPACK进行头部压缩,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小
  • HTTP2服务端推送(Server push),允许服务器预先将网页所需要的资源push到浏览器的内存当中
  • HTTP2遵循多路复用,代替同一域名下的内容,只建立一次连接,HTTP1.x不是,对域名有6~8个连接限制
  • HTTP2引入二进制数据帧的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况,同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。HTTP2对同一域名下所有请求都是基于流的,也就是说同一域名下不管访问多少文件,只建立一次连接

HTTP 和 HTTPS 的区别

  • HTTP是明文传输,不安全的,HTTPS是加密传输,安全的多
  • HTTP标准端口是80,HTTPS标准端口是443
  • HTTP不用认证证书免费,HTTPS需要认证证书要钱
  • 连接方式不同,HTTP三次握手,HTTPS中TLS1.2版本7次,TLS1.3版本6次
  • HTTP在OSI网络模型中是在应用层,而HTTPS的TLS是在传输层
  • HTTP是无状态(每一次请求都是独立的,请求结束不会记录连接的任何信息)的,HTTPS是有状态(session复用)的

总结:大功告成✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️

参考链接: