host字段的作用. 同一个IP可以设置多个不同站点, 如果访问不同的域名都转发到同一IP,怎么区分这些不同的站点呢 , 就是用的Host字段 ,如果服务器后台解析出Host但是服务器上找不到相应的站点,那么这个连接很可能会被丢弃,从而报错。. 虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的。
HTTP 1.0
-
短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能
-
无host头域,也就是http请求头里的host,
-
不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象
-
队头阻塞(head of line blocking)
由于HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
HTTP 1.1
- 长连接,流水线,使用connection:keep-alive使用长连接
- 请求管道化 ,尴尬的假并行传输:服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。
- 增加缓存处理(新的字段如cache-control)
- 增加Host字段,支持断点传输等
- 由于长连接会给服务器造成压力
- a. 对域名进行分片,使得客户端可以创建更多的 TCP 连接提高请求并发度 b. 设置 Connection: Keep-Alive Header 保持长连接,减少 TCP 连接握手的开销 d. 将小的静态资源直接嵌入到页面中,减少 HTTP 请求次数
HTTP 2.0
- 二进制分帧
- 头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小
- 多路复用(或连接共享),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求
- 服务器推送(Sever push):利用 ServerPush 将页面上的关键静态资源直接推送到客户端,无需等待客户端请求
HTTP 3.0
- 基于google的QUIC协议,而quic协议是使用udp实现的
- 减少了tcp三次握手时间,以及tls握手时间
- 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题
- 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
- 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
- 更合适的流量控制
基于UDP实现 0RTT建连 基于UDP的多路复用 加密认证的报文 向前纠错机制