我好像上了个假的网络!
一、http长连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;持久连接可以设置过期时间,也可以不设置。
1,同一个客户端可以使用这个长连接处理其他求情,避免http重新链接和断开所消耗的时间。
然后在请求头中设置Connection:keep-alive
,为什么响应之后,还是断开了呢?原来connection
字段只有服务端设置才有效。
Keep-Alive: timeout=60
连接建立之后,空闲时间超过60秒之后,就会失效
Connection:keep-alive
连接永久有效
二、管线化
管线化也可以理解为流水线。在长连接的基础上,将客户端的其他请求都交给这一个连接去处理(HTTP/1.0不支持)。
三、长连接和管线化的区别
长连接的一个缺点是请求和响应式是顺序执行的,只有在请求1的响应收到之后,才会发送请求2;而管线化不需要等待上一次请求得到响应就可以进行下一次请求。实现并行发送请求。
长连接:某个连接消息的传递类似于
请求1 -> 响应1 -> 请求2 -> 响应2
管线化:某个连接上的消息变成了类似这样
请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
四、HTTP协议的keep-alive和TCP的keep-alive的差别
HTTP的keep-alive 是为了维持连接,以便复用连接,以减少tcp连接建立次数。
TCP的 keep-alive 是检测TCP连接状况的机制。当网络两端建立了TCP连接之后,空闲时,服务器就会向客户端发送侦测包,直到收到对方的回答(ack包),如果一直不回答,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了
五、Http2.0
Http2.0 同个域名并发请求,半双工变成全双工
- 多路复用 :一次TCP握手,多个同域并行请求,请求和响应同时发送接受,然后再拼装组合,不阻塞;
- 优先级和依赖性(Priority) :可以请求的时候告知服务器端,资源分配权重,优先加载重要资源;
- 服务器推送(Server Push) :根据客户端需求,服务端主动推送资源,减少请求耗时;