http1.0
- 缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接(TCP连接的新建成本很高,因为需要客户端和服务器三次握手),服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求;
- 解决方案:
- 添加头信息——非标准的Connection字段
Connection: keep-alive
- 添加头信息——非标准的Connection字段
http1.1:
-
改进点:
- 持久连接
- 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明
Connection: keep-alive
(对于同一个域名,大多数浏览器允许同时建立6个持久连接)
- 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明
- 管道机制
- 即在同一个TCP连接里面,客户端可以同时发送多个请求。
- 分块传输编码
- 即服务端每产生一块数据,就发送一块,采用”流模式”而取代”缓存模式”。
- 新增请求方式
- PUT:请求服务器存储一个资源;
- DELETE:请求服务器删除标识的资源;
- OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求;
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断;
- CONNECT:保留将来使用
- 持久连接
-
缺点:
- 虽然允许复用TCP连接,客户端不用等待上一次请求结果返回,就可以发出下一次请求,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着。这将导致“队头堵塞”
- 避免方式:一是减少请求数,二是同时多开持久连接
HTTP/2.0
- 特点:
- 采用二进制格式而非文本格式;
- 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行;
- 使用报头压缩,降低开销
- 服务器推送
-
二进制协议
- HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。
- 二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
-
完全多路复用
- HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了队头堵塞。
-
报头压缩
- HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。
- 对于相同的头部,不必再通过请求发送,只需发送一次;
- HTTP/2 对这一点做了优化,引入了头信息压缩机制;
- 一方面,头信息使用gzip或compress压缩后再发送;
- 另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。
- https://http2.github.io/
-
服务器推送
- HTTP/2 允许服务器未经请求,主动向客户端发送资源;
- 通过推送那些服务器任务客户端将会需要的内容到客户端的缓存中,避免往返的延迟
http2缺点
当某个tcp packet丢包, 触发重传定时器, 继而触发“拥塞发生” 其拥塞窗口降为1, 对丢包进行重传, 未收到ack之前其他包阻塞 ! 在频繁丢包的网络环境下, http2比http1的多连接更低效。
- 有序字节流引出的 队头阻塞(Head-of-line blocking),使得HTTP2的多路复用能力大打折扣;
- TCP与TLS叠加了握手时延,建链时长还有1倍的下降空间;
- 基于TCP四元组确定一个连接,这种诞生于有线网络的设计,并不适合移动状态下的无线网络,这意味着IP地址的频繁变动会导致TCP连接、TLS会话反复握手,成本高昂。
QUIC
HTTP3
HTTP3协议解决了这些问题:
- HTTP3基于UDP协议重新定义了连接,在QUIC层实现了无序、并发字节流的传输,解决了队头阻塞问题(包括基于QPACK解决了动态表的队头阻塞);
- HTTP3重新定义了TLS协议加密QUIC头部的方式,既提高了网络攻击成本,又降低了建立连接的速度(仅需1个RTT就可以同时完成建链与密钥协商);
- HTTP3 将Packet、QUIC Frame、HTTP3 Frame分离,实现了连接迁移功能,降低了5G环境下高速移动设备的连接维护成本。
Head-of-Line blocking
https://calendar.perfplanet.com/2020/head-of-line-blocking-in-quic-and-http-3-the-details/
HTTPS
HTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.
-
HTTPS主要作用
对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全; - (2)对网站服务器进行真实身份认证。
-
HTTPS和HTTP的区别
HTTPS是加密传输协议,HTTP是名文传输协议 HTTPS需要用到SSL证书,而HTTP不用; HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO, HTTPS标准端口443,HTTP标准端口80; HTTPS基于传输层,HTTP基于应用层;
3、HTTPS和HTTP的工作过程区别
- HTTP 包含动作:
- 浏览器打开一个 TCP 连接
- 浏览器发送 HTTP 请求到服务器端
- 服务器发送 HTTP 回应信息到浏览器
- TCP 连接关闭
-
SSL 包含动作: 1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作: a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。 b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。 c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作: a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
HTTPS加密方式
-
对称加密:加密和解密都是使用的同一个密钥;
-
非对称加密:
- 加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥;
- 公钥和算法都是公开的,私钥是保密的。
- 非对称加密过程:
- 服务端生成配对的公钥和私钥
- 私钥保存在服务端,公钥发送给客户端
- 客户端使用公钥加密明文传输给服务端
- 服务端使用私钥解密密文得到明文
-
数字签名:签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过。
websocket
http和websocket的长连接区别
- 服务端主动发送通知给客户端
- Keep-Alive不会永久保持连接,它有一个保持时间
- WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的
- HTTP 1.1在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header
- websocket服务端客户端全双工通信,基于TCP
- 连接建立之后,数据的传输使用帧来传递,不再需要Request消息。
HTTP/2 是否可以替代 WebSocket
HTTP/2 引入了服务器推送,它使服务器能够主动将资源发送到客户端缓存。但是,它不允许将数据向下推送到客户端应用程序本身。服务器推送仅由浏览器处理,不会弹出到应用程序代码,这意味着应用程序没有 API 来获取这些事件的通知。
grpc
gprc 是一种通信协议 ,使用protocol buffers作为结构数据序列化机制,通信协议格式
分成client server
- client
就像本地对象一样,可以远程调用不同机器server上的方法,轻松地创建分布式应用程序和服务
- server
服务器实现此接口并运行gRPC服务器来处理客户端调用
Rpc一般用于实现内部网络各服务间的高性能调用
客户端、服务端、注册中心
调用过程
-
生成stub存根,拦截调用
-
路由寻址和负载均衡,在选定provider之后就是直连了
-
寻址实现方案是在地址维护器中按配置加载直连分组和集群分组,在客户端指定路由策略时,进行分别获取。
-
负载一致性hash、本机优先、随机负载、轮询负载、加权一致性hash、加权轮询。
-
-
序列化和反序列化
-
编码 解码
序列化其实是为了将待传输的对象转化成标准二进制信息,为传递做准备,同时尽可能压缩大小,方便传输。
而编码,是为了通信高效,一般的,都会加上超时策略、请求ID、网络协议等信息。
-
网络传输
对于客户端来说,耗时主要由:建连时间 + 序列化时间 + 等待服务端处理时间 组成;
对于服务端来说,耗时主要由:线程池等待时间 + 服务处理时间 + 结果序列化时间 组成。