Http1.0和Http1.1主要是在以下几个方面的区别
连接方式
Http1.0默认使用短连接 在一个TCP连接上只传送一个HTTP请求和响应
Http1.1默认使用长连接:在一个TCP连接上可以传送多个HTTP请求和响应
注意:
HTTP1.0默认短连接但也可以开启长连接,需要手动设置请求头 Connection:Keep-Alive
HTTP1.1默认开启长连接,如果要使用短连接,加入 Connection:close
才关闭。
状态码
http1.1新增了大量的状态码
例如:
100 continue 预请求接收状态码
206 Partial Content 范围请求
Host字段
Http1.1在请求头中添加了Host字段
在Http1.0中认为一个IP应该只绑定一个服务器,但随着虚拟主机技术的发展,一台物理服务器上可以存在多台主机,他们共享一个IP,所以通过IP找到服务器后还需要通过Host字段确定请求的是哪一台主机
范围请求
HTTP1.0中存在一些浪费带宽的现象,例如:(1)客户端只需要某个对象的一部分,而服务器却将整个对象发送过来;(2)下载大文件不支持断点续传功能,在发生断连后需要重新下载完整的包。
HTTP1.1则在请求头中引入range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content) ,这样就方便了开发者自由的选择以便于充分利用带宽和连接。如果一个响应包含部分数据的话,那么将带有206(Partial Content)
状态码。该状态码的意义在于避免了HTTP/1.0代理缓存错误地把该响应认为是一个完整的数据响应,从而把他当作为一个请求的响应缓存。
缓存处理
HTTP1.0中使用expires
Last-Modified
和条件GET If-Modified-Since
来判断缓存是否过期
HTTP1.1中增加了If-None-Match
字段与响应头部中的 ETag
字段来判断缓存是否过期
Last-Modified 在第一次请求获得数据后会把数据在本地缓存,并且取得响应头中保存的该记录的上一次修改时间Last-Modify
和计算过期时间Expires,当后续的相同请求时就会先获取缓存的数据,若数据未过期(本地时间未超过Expires)则直接使用该数据,若过期了发起请求向服务端发起请求,请求头中携带If-Modified-Since:
字段,值为之前保存的Last-Modify的值,若服务端发现在该时间之后文件未修改则返回304状态码,修改了则返回最新的数据
If-None-Match
的方式和上面的差不多,不过比较的不是时间,而是 Etag
:响应资源的唯一标识,当过期了会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200