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-Since
和Expires
作为缓存标识
HTTP 1.1(1997年)
- 引入更多的请求方法类型
PUT
、PATCH
、DELETE
、OPTIONS
、TRACE
、CONNECT
- 引入长连接,就是TCP连接默认不关闭,可以被多个请求复用,通过请求头connection:keep-alive设置
- 引入管道连接机制,可以在同一TCP连接里,
同时发送
多个请求 - 强化了缓存管理和控制
Cache-Control
、ETag
/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 的性能优化
访问速度优化
会话复用
,上面说了,复用session可以减少 CPU 消耗,因为不需要进行非对称密钥交换的计算。可以提升访问速度,不需要进行完全握手阶段二,节省了一个 RTT 和计算耗时。- 使用
SPDY
或者HTTP2
。SPDY 最大的特性就是多路复用,能将多个 HTTP 请求在同一个连接上一起发出去,不像目前的 HTTP 协议一样,只能串行地逐个发送请求。Pipeline 虽然支持多个请求一起发送,但是接收时依然得按照顺序接收,本质上无法解决并发的问题。HTTP2支持多路复用,有同样的效果。 - 设置
HSTS
,服务端返回一个 HSTS 的 http header,浏览器获取到 HSTS 头部之后,在一段时间内,不管用户输入www.baidu.com还是http://www.baidu.com ,都会默认将请求内部跳转成https://www.baidu.com。Chrome, firefox, ie 都支持了 HSTS。 Nginx
设置Ocsp stapling
。Ocsp 全称在线证书状态检查协议 (rfc6960),用来向 CA 站点查询证书状态,比如是否撤销。通常情况下,浏览器使用 OCSP 协议发起查询请求,CA 返回证书状态内容,然后浏览器接受证书是否可信的状态。这个过程非常消耗时间,因为 CA 站点有可能在国外,网络不稳定,RTT 也比较大。如果不需要查询则可节约时间。False start
。简单概括 False start 的原理就是在 clientkeyexchange 发出时将应用层数据一起发出来,能够节省一个 RTT。
计算性能优化
- 优先使用 ECC椭圆加密算术
- 使用最新版的 OpenSSL
- TLS 远程代理计算
- 硬件加速方案
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复用)的
总结:大功告成✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️
参考链接: