真正“搞”懂HTTP协议03之时间穿梭( 三 )


而且 , 在某一个文档真正标准化之前 , 实际上还有很多关于某些特性的讨论 , 不多说 , 大家有兴趣可以在文末的连接中自己取证 。
HTTP1.1在原有的HTTP1.0的基础上做了不少的性能改进 , 虽然说是一个小范围的改变 , 但是这些改变所带来的影响可不小 。我们下面就就简单的看看HTTP1.1相对于1.0版本都做了哪些核心的优化 。
1、增加持久连接HTTP/1.0每进行一次HTTP通信 , 都需要经历建立连接、传输数据、断开连接的操作 。换句话说 , 我发送一点点HTTP数据 , 就要额外的发送十几个包 , 后面我会用实际的过程带大家看为啥会是十几个包 。这实在是有点难受 。
但是为啥当时这样就可以呢?因为当时传输数据的体积小 , 页面也没啥引用的外部连接 , 全是HTML文本 , 所以也不会有什么太大的问题 , 但是随着发展 , 页面的体积和引用越来越大 , 这种方式显然已经无法支撑日益发展的需求了 。
那么HTTP/1.1为了解决这个问题 , 增加了持久连接的方法 , 它的特点是在一个TCP连接上可以传输多个HTTP请求 , 只要浏览器或者服务器没有明确断开 , 那么TCP连接就会一直保持 。
持久连接在HTTP/1.1中是默认开始的 , 如果你不想开启持久连接 , 可以在HTTP的请求头中加上Connection:close 。
目前浏览器中对同一个域名 , 默认允许同时建立6个TCP持久连接 , 注意!是浏览器默认允许 。
2、不成熟的HTTP管线化我们想象一下 , 在TCP这条马路上 , 只能一条单行道 , 所有跑在这条马路上的车都无法超越前面的车 , 假如前面的车追尾了 , 后面所有的车都只能等待前面的事故处理完才能继续同行 。
换句话说 , 假如前一个HTTP请求因为某些原因没有返回结果 , 那么就会阻塞后面所有的请求 , 这就是著名的队头阻塞问题 。
在HTTP/1.1中 , 试图通过管线化的技术来解决队头阻塞的问题 , 在HTTP/1.1中的管线化 , 会将多个HTTP请求整批提交给服务器的技术 , 也就是说 , 虽然马路还是单行道 , 但是我可以把车叠在一起 , 一下子发送一批 。但是马路上跑的时候可以这样 , 到了收费站 , 你还是要下来挨个排队收费 。
3、支持虚拟主机在HTTP/1.0中 , 每个域名绑定了一个唯一的IP地址 , 因此一个服务器只能支持一个域名 。但是随着虚拟主机技术的发展 , 需要实现在一台物理主机上绑定多个虚拟主机 , 每个虚拟主机都有自己单独的域名 , 这些单独的域名都公用同一个IP 。
因此 , HTTP/1.1增加了Host字段 , 用来表示当前的域名地址 , 这样服务器就可以根据不同的Host值做不同的处理 。
4、支持对动态生成的内容在HTTP/1.0中需要在响应头中完整的设置数据的大小 , 这样浏览器才能根据设置数据的大小来接受数据 。但是随着服务器端的技术发展 , 很多页面都是动态生成的 , 在传输数据之前无法知道完整的数据大小 , 这样肯定不行的 , 浏览器根本不知道什么时候数据传输完毕 。
HTTP/1.1就完美的解决了这个问题 , 通过把数据包分割成若干个任意大小的数据块 , 每个数据块都会附上当前数据块的长度 , 最后发送一个长度为0作为结束的标志 , 这样就提供了对动态内容的支持 。

经验总结扩展阅读