标签:set lag pipe source 部分 设计 业务 依赖 建立
HTTP是建立在TCP协议上的,HTTP协议的瓶颈及优化都是基于TCP协议本身的特性。
TCP建立连接时有三次握手 会有1.5RTT的延迟,为了避免每次请求都经历握手待来的延迟,应用层会选择不同策略的http长连接。
http1.0协议头里可以设置Connection:Keep-Alive。在header里设置Keep-Alive可以在一定时间内复用连接,具体复用时间的长短可以由服务器控制,一般在15s左右。到http1.1之后Connection的默认值就是Keep-Alive,如果要关闭连接复用需要显式的设置Connection:Close。
<br />
head of line blocking会因为一个request没有到达服务器或者一个response因为网络没有及时返回而影响后续所有请求。
客户端在初始状态会发送一个polling请求到服务器,服务器并不会马上返回业务数据,而是等待有新的业务数据产生时返回。所以连接会被保持,一旦结束马上又会发起一个新的polling请求,反复如此。
与long-polling不同,server并不会结束初始的streaming请求,而是持续的通过这个通道返回最新的业务数据,但这个通道时单向的。
与传统的 tcp socket连接相似,也是基于tcp协议,并提供双向的数据通道。
让每个请求不用等待其他请求的response返回之后才发出,而是几乎在同一时间把request发送给服务器。
http 1.X存在诸多问题,在尝试了各种优化手段后提出的SPDY方案。
X-Associated-Content header
告知客户端会有新的内容推送过来。X-Subresources header
来通知。http://和https://
的服务和应用不会要做任何更改。http 1.x是明文协议,格式由strat line
,header
,body
组成。需要做协议解析来识别这3哥部分,http1.x的解析是基于文本的,而文本格式解析存在天然缺陷,二进制比文本格式更方便且健壮。
http 2.0的格式定义更接近tcp。由Length
,Type
,Flags
,Stream ID
,Payload
5个部分组成。
length
定义了整个frame的开始到结束type
定义frame的类型flags
用bit位定义了一些重要的参数stream id
用作流控制payload
就是request的正文stream id
作用就是连接共享机制,一个request对应一个stream并分配一个id,这样一个连接上可以有多个stream,每个stream的frame随机混杂在一起,接收方根据stream id将frame再归属到各自不同的request里面。每个stream都可以设置优先级和依赖。
http2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,避免重复header传输,减少传输大小。
SPDY/2使用的是gzip 压缩算法,后来出现BREACH
和CRIME
2种攻击方式,即使走SSL的SPDY也可以破解内容,http2.0采用HPACK
的压缩算法。
对于http 1.x来说,是通过设置tcp segment里的reset flag来通知对端关闭连接。http2.0引入RST_STREAM
类型的frame,可以在不断开连接的前提下取消某个request的stream。
http2.0 通过类似receive window
的做法,数据的接收方通过告知对方自己的flow window
大小表明自己还能接收多少数据。只有Data类型的 frame才有流量控制功能。
http2.0 通过push的方式将客户端需求的内容预先推送过去,也叫cache push
。如果客户端退出,需取消server push
,可以通过发送RST_STREAM
类型的frame来做到。
Nagle Algorithm/TCP Delayed Ack
是一组对立的算法。http2.0可以通过TCP_NODELAY
禁用Nagle或TCP_QUICKACK
禁用ACK。官方推荐设置TCP_NODELAY
HTTP2.0使用了tls的拓展ALPN来做协议升级,除此之外加密这块还有一个改动,HTTP2.0对tls的安全性做了近一步加强
标签:set lag pipe source 部分 设计 业务 依赖 建立
原文地址:https://www.cnblogs.com/Ljohn/p/9144147.html