深入分析阿里云面试中HTTP/1.0与HTTP/1.1之间的主要区别和影响

分享一位读者在面试阿里云时遭遇的技术问题,内容依然新鲜。

以下是详细分析。

本文将从以下几个方面对比HTTP/1.0和HTTP/1.1的区别:

  • 响应状态码
  • 缓存处理
  • 连接方式
  • Host头处理
  • 带宽优化

响应状态码

HTTP/1.0仅定义了16种状态码,而HTTP/1.1则新增了大量状态码,仅错误响应状态码就增加了24种。例如,100 (Continue)用于请求较大资源前的预热请求,206 (Partial Content)用于表示范围请求,409 (Conflict)指明请求与当前资源的规范产生冲突,410 (Gone)则表示资源已被永久转移,且没有已知的转发地址。

缓存处理

缓存技术通过减少用户与源服务器的频繁交互,显著节省了网络带宽,并降低了用户接收信息时的延迟。

HTTP/1.0

HTTP/1.0的缓存机制相对简单。服务器端使用Expires标签标记响应体的过期时间,在此时间内的请求将得到缓存的响应体。服务器在初次返回给客户端的响应中包含一个Last-Modified标签,指明请求资源在服务器端的最后修改时间。客户端在请求头中使用If-Modified-Since标签来询问服务器:“该时间之后,请求的资源是否有更新?”如果服务器确认该资源没有被修改,将返回304 Not Modified响应头,表示“缓存有效,请从浏览器获取。”如果资源已被修改,服务器将返回200 OK响应头,并附上最新的资源内容。

图片图片

HTTP/1.1

相较于HTTP/1.0,HTTP/1.1的缓存机制显著增强了灵活性和扩展性。虽然基本原理保持不变,但它增加了更多详细特征,其中最常见的请求头特性是Cache-Control,详细信息请参见MDN Web文档。

连接方式

HTTP/1.0 默认使用短连接,即每次HTTP操作建立新连接,任务完成后中断连接。当客户端浏览器访问的网页包含其他Web资源(例如JavaScript、图像、CSS等)时,浏览器会为每个资源重新建立一个TCP连接,导致大量“握手报文”和“挥手报文”占用带宽。

为了解决HTTP/1.0的资源浪费,HTTP/1.1优化为默认长连接模式。长连接的请求报文会通知服务器:“我请求连接并希望在连接建立后保持连接。”因此,该TCP连接会保持打开状态,为后续的客户端与服务器数据交互提供服务。也就是说,在使用长连接的情况下,当一个网页完全加载后,客户端与服务器之间的TCP连接不会关闭,后续访问将继续使用已建立的连接。

尽管长连接可以提高效率,但若TCP连接长时间无请求,也会造成资源浪费,因此一些服务器软件(如Apache)支持超时机制,超时后才会关闭TCP连接。

需要指出的是,HTTP/1.0同样支持长连接选项,只需在请求头中加入Connection: Keep-alive。而在HTTP/1.1中,如果不希望使用长连接,可以在请求头中加入Connection: close,告知服务器:“我不需要长连接,连接成功后即可关闭。”

HTTP协议的长连接与短连接本质上是TCP协议的长连接与短连接。

实现长连接的前提是客户端与服务器都必须支持这一特性。

Host头处理

域名系统(DNS)允许多个主机名绑定到同一IP地址,但HTTP/1.0未考虑此问题。例如,对于资源URL http://example1.org/home.html,HTTP/1.0的请求报文为GET /home.html HTTP/1.0,并未包含主机名,因此服务器无法理解客户端的真实请求。

HTTP/1.1在请求头中增加了Host字段,使请求报文的头部如下:

GET /home.html HTTP/1.1  
Host: example1.org  

这样,服务器就能明确客户端请求的真实网址。

带宽优化

范围请求

HTTP/1.1引入了范围请求机制,以避免带宽浪费。当客户端希望请求文件的一部分或重新下载已部分下载的文件时,可以在请求中加入Range头部,服务器能够忽略Range头部并返回若干Range响应。

如果响应中包含部分数据,状态码将为206 (Partial Content)。此状态码的意义在于避免HTTP/1.0代理错误地将该响应视为完整数据响应,造成错误缓存。

在范围响应中,Content-Range头部显示该数据块的偏移量和长度。

状态码100

HTTP/1.1新增状态码100,适用于大文件请求,服务器可使用此状态码指示请求是否能正常响应。不同于HTTP/1.0,状态码100 (Continue)需要在请求中发送一个Expect头部,并包含100-continue的值。

压缩

许多数据在传输时经过预压缩,数据压缩显著提升带宽利用率。然而,HTTP/1.0对数据压缩的支持有限,不支持压缩细节选择,且无法区分端到端(end-to-end)压缩与逐跳(hop-by-hop)压缩。

HTTP/1.1则对内容编码和传输编码进行了区分,内容编码始终为端到端,传输编码则为逐跳。HTTP/1.0仅包含Content-Encoding头部用于端到端编码,而HTTP/1.1引入了Transfer-Encoding头部用于逐跳传输编码,并新增Accept-Encoding头部,允许客户端指示其支持的内容编码类型。

总结

  1. 连接方式 : HTTP/1.0使用短连接,HTTP/1.1支持长连接。
  2. 状态响应码 : HTTP/1.1新增多种状态码,尤其错误响应状态码增加了24种。
  3. 缓存处理 : HTTP/1.0主要使用If-Modified-SinceExpires作为缓存标准,而HTTP/1.1引入了更多缓存控制策略如Entity tag、If-Unmodified-Since、If-Match、If-None-Match等。
  4. 带宽优化及网络连接的使用 : 在HTTP/1.0中,存在带宽浪费现象,而HTTP/1.1通过引入Range头部改善了该问题,使得开发者能更加灵活地利用带宽和连接。
  5. Host头处理 : HTTP/1.1在请求头中加入了Host字段。