HTTP/0.9
1996年公布了HTTP/1.0,在这之前的协议成为HTTP/0.9
HTTP/0.9规范:
request只有一行且只有一个GET命令,命令后跟着资源路径:GET /index.$html$response只包含文件内容本身
❌ 缺陷:
- 没有
header的概念 - 没有
Content-Type的概念,只能传递HTML文件 - 没有状态码
statusCode,通过返回一个错误描述的html文件表示异常
HTTP/1.0
- 构建请求行和响应行
- 请求行增加
schema和版本号 - 增加响应行:
HTTP/1.0 200 Success
- 请求行增加
- 增加头部概念
header:请求头,响应头- 增加
Content-Type来支持不同编码格式的文件传输 - 支持长连接
Connection: keep-alive | close
- 增加
-
请求头
Content-Type text/plantext/htmltext/cssimage/jpegimage/pngimage/svg+xmlapplication/javascriptapplication/zipapplication/pdf
Content-encoding
gzip采用LZ77压缩算法compress采用LZW压缩算法deflate采用zlib压缩算法
客户端传Accept-Encoding: gzip, deflate表示客户端支持此两种压缩算法
服务端传Content-Encoding: gzip表示实际采用了gzip的压缩算法
❌ 缺陷:
- 对头阻塞
- 每个
TCP连接只能发送一个请求,请求响应结束则关闭连接。 - 如果要请求多个资源,需要新建多个连接
- 每个
- 默认是短连接,每个资源请求都需要经过三次握手建立连接,四次挥手关闭连接
HTTP/1.1
- 可重复使用连接
keep-alive,不再需要多次打开才能显示嵌入在单个原始文档中的资源 - 添加了
Pipeline,允许在第一个请求完成之前发送第二个请求,降低了通信的延迟 chunked机制,分块响应- 动态资源,无法在传输之前知道待传递资源的大小
Transfer-Encoding: chunked
- 引入缓存控制机制,及内容协商
增加了
Host头部- 从同一
IP地址托管不同域的能力允许服务器搭配 1.0 默认每台服务器绑定一个唯一的
IP,1.1 中加入Host处理一个IP地址上面多个虚拟主机的情况
⚠️keep-alive中是默认关闭的(默认短连接)
只属于程序员的自定义行为,在 1.0 中没有被纳入标准
- 从同一
❌ 缺陷:
- 高延迟,队头阻塞导致宽带无法被充分利用
- 无状态特性,巨大的
http头部 - 明文传输,不安全
-
管道化持久连接
🚫 管道化有几条限制:
客户端不支持成就连接,就不应该使用管道
- 必须按照请求相同的顺序响应,否则响应失序就无法与请求匹配
- 客户端必须做好随时连接关闭的准备,还要准备好重发所有未完成的管道化请求
- 比如客户端发出10个请求,服务端处理完5个之后就关闭了连接,剩下5个请求失败
- 管道化不应发送会产生副作用的请求(比如
POST)
❌ 缺陷:
- 管道化持久连接,可以解决长肥管道的网络时延。但仍无法解决队头阻塞问题,因为响应顺序需要和请求顺序一致
长肥管道:拥有长RRT:Round Trip Time 往返时间和高的宽带
幂等:如果一个事物,不管是执行一次还是很多次,得到的结果都相同,这个事物就是幂等的
关闭连接的问题
服务器会在管道空闲的时候关闭它,可是如何判断管道是空闲呢?
可能服务器关闭时,客户端正在写入数据:此时客户端就会在写入半截请求报文时发现出现了连接错误
HTTP2和HTTP1.1的性能对比:地址
