http请求是我们常用的一种网络交互请求方式,在web应用中有广泛的运用,对http每次做一点点小的改动,对整个请求都能带来一些巨大的收益。我们经常使用的都是已经封装好的框架了,在框架的协议层提供了一些不同的策略来优化整个请求链路。,从而达到提高网络传输效率的目的。常用的算法有 Nagle 算法,和Delayed ACK。两种方式。
(1) Nagle 算法 通过减少通过网络发送的数据包数量来提高 TCP/IP 网络效率。每一次网络交互的时候不管发送的数据量有多少,都会花费 40 个字节长包头(即 IP 头部 20 字节 + TCP 头部 20 字节)的额外开销,这样有效负载的利用率比较低。在网络传输过程中 会存在一个最大传输的 分段数的限制 MSS(MSS 为 TCP 数据包每次能够传输的最大数据分段),如果达到 的 MSS 的限制的时候会立即发送,这样可以最大效率来提高带宽的利用率,但是如果之前没有包未被 ACK,则不需要等待 可以立即发送, 如果当时有包的 ack 没有被发送的话那么 ,存在缓存里面 ,等待pipe中轮到自己的时候再发送。如果收到了 一个 ack的时候,这个时候轮到 自己发送了可以马上发送数据到网络。
一般如果想控制的时候可以配置 参数来控制
注意:配置参数的时候,-Dsun.net.httpserver.nodelay=true 是 关闭 Nagle算法 ,
-Dsun.net.httpserver.nodelay=false 才是开启 Nagle算法。
在Socket 编程中,TCP_NODELAY参数来控制,是否开启
(2)Delayed ACK,优化 。为了保证每一次请求都被处理 ,我们会对每一次请求都会返回一个ack信息。在大多数情况下如果只处理 ack信息造成整个请求的有效利用率比较低,这个时候会采取多个 ack 或者是Ack+业务数据一块儿发送。同时处理达到高利用的目的。
(3)利用 pipeline方式来处理 只限于 HTTP1.1以上才支持。由于整个数据发送受到 网络带宽的限制,在延迟比较低的情况的一般会采用 pipeline + 滑动窗口+ 阻塞算法实现pipeline 语义
关于http1.X 和2.x的区别
http1.x是基于文本分割协议来的 如果多路复用的话没办法保证顺序 ,而 http2.x 采用的是帧的方式。每一帧都有相应的序列号来标识,多路复用的时候不容易出错。