HTTP1.0和HTTP1.1的区别

HTTP简介
web浏览器和服务器之类的交互过程必须遵守的协议.他是tcp/ip中的一个应用协议。用来协议数据交换过程和数据本身的格式.主要的有HTTP/1.0和HTTP1.1. 


HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进 程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的 “门”。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己 的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据 传输服务;这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。我们可从中看 到分层网络体系结构的一个明显优势——HTTP不必担心数据会丢失,也无需关心TCP如何从数据的丢失和错序中恢复出来的细节。这些是TCP和协议栈中更 低协议层的任务。


TCP还使用一个拥塞控制机制。该机制迫使每个新的TCP连接一开始以相对缓慢的速率传输数据,然而只要网络不拥塞,每个连接可以迅速上升到相对较高的速率。这个慢速传输的初始阶段称为缓启动(slow start)。


需要注意的是,在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象,服务器也不会响 应说:自己刚刚给它发送了这个对象。相反,服务器重新发送这个对象,因为它已经彻底忘记早先做过什么。既然HTTP服务器不维护客户的状态信息,我们于是 说HTTP是一个无状态的协议(stateless protocol)。



HTTP1.1和HTTP1.0的主要分别
在同一个tcp的连接中可以传送多个HTTP请求和响应.
多个请求和响应可以重叠,多个请求和响应可以同时进行.
更加多的请求头和响应头(比如HTTP1.0没有host的字段).
总之,在 HTTP/1.0 中,大多实现为每个请求/响应交换使用新的连接。在 HTTP/1.1 中,一个连接可用于一次或多次请求/响应交换,尽管连接可能由于各种原因被关闭.这是他们之间最大的分别.


一个典型的网页,是由一个 html 文件和内嵌的各类元素组成的,这些元素包括页面内的图片,css 文件,javascript 文件等等。每一个内嵌的元素在 HTTP 协议的层面上和那个 html 文件是没有区别的:也就是都需要浏览器去服务器上抓下来。一个早期典型的浏览器是这样实现的:当用户敲入网址之后,浏览器和服务器建立连接,请求这个 html 页面,然后边接收服务器发送的 html 页面,边解析,碰到内嵌元素,可以立即开第二条连接请求。另外,如果内嵌元素很多,他可能会开多条连接同时请求。当所有需要的元素都下载完毕之后,浏览器 就会将页面画出来。这个过程就是最早期的 HTTP/1.0 协议所设想 的浏览器实现。


HTTP/1.0 这种多连接的运作模式是可以改进的。建立 TCP 连接的过程是这样:客户端给服务器发一个网络包说我要和你建立连接,服务器收到之后回一个网络包说“我愿意”,然后客户端要再发给服务器一个网络包说“好 那咱们开始传数据吧”。这一来一去三个包才能建立 TCP 连接。连接建立之后,浏览器给服务器发请求,服务器给浏览器回应。完事之后又要来回几个网络包关闭 TCP 连接。如果页面有很多文件长度很短的元素,每个元素都需要单建一条连接就会导致网络上大量的都是 TCP 建立连接和断开连接的网络包。

另外,TCP 有一个特性叫做 slow start,其含义可以大致这样解释:TCP 连接要求发送端发送一定数量的网络包之后接收端就要回一个“我收到”的网络包,而且网络包在经过每个路由器的时候包头都要被重写,所以在网络不丢包的情况 下网络包越大网络的效率就越高。TCP 连接寻找最优网络包大小的方法是,在 TCP 连接建立的初期,网络包的大小是很小的,根据网络状况,两端的程序才会逐步增大网络包的大小以适应带宽提高网络传输的效率。所以浏览器给服务器发请求,如 果每发一个请求就关闭连接的话,那这个连接的数据传输很难达到带宽所能承载的速度。
基于这种种原因,HTTP/1.1 很快出来了,提出了持久连接(persistent connection)的概念,也就是说同一条 HTTP 连接,可以同时处理多个请求,同时用一定的机制保证各个请求之间的分离性。具体的操作过程是:服务器给浏览器发送回应之后,并不马上关闭连接;浏览器判断 上一个请求的回应已经收完的情况下,可以在这同一个连接上发第二个请求。这种运作模式大大减少了网络包,实验也表明这种做法很有效。但是,由于服务器上保 持连接要占用一定的资源,所以一般服务器不会永久保持持久连接,而且也不推荐浏览器和服务器之间建立过多的持久连接。
持久连接可以进一步提速。这就是 pipelining 了。

 

上面可以看到,浏览器需要等待持久连接里上一个请求的回应完全收完才能发送后面的请求。如果和服务器的连接比较慢,往往持久连接大部分时间都花在等待 而非数据发送/接收上。pipelining 的意思是,浏览器可以在一个持久连接里一次给服务器发送多个请求,服务器在这个连接上依次回应这些请求。这种运作方式和浏览器缓存结合起来的时候会尤其有 效果。比方,图片浏览过后会存在浏览器缓存中,再次请求的时候浏览器会对服务器说,我这里已经有这个图片的缓存了,修改时间是XXXX,如果服务器上这个 图片在这之后没有修改过,就不用重发了。这种情 况下,服务器会发一个很短的 304 Not Modified 类型的回应。如果没有 pipelining,每次这样问一下都要等待网络上传输打一个来回;而如果有 pipelining,浏览器可以同时问服务器我这里 4 个图片是否有修改,如果服务器对 pipelining 支持的好,它甚至可以将四个回应放到同一个网络包里面传回来,这是一个大大的加速。pipelining 最早提出的时候还有一种设想的用法是,如果服务器对 pipelining 支持的好,可以把同一个 pipeline 里面的两个请求放到两个 CPU 上去处理,这样能进一步加快响应速度。当然这个可能也没什么用。



关于火狐中HTTP参数的设置:
about:config network.http.* 的相关参数
network.http.keep-alive 默认是 true 是否允许持久连接,这个默认就是 true,改成 false 的是大傻瓜。
network.http.keep-alive.timeout 默认是 300 持久连接允许的保持时间,这个调大了没意义,因为一般 server 设置的就是 300。server 把你咔嚓了你还能有什么办法。
network.http.max-connections-per-server 默认是 8 连接同一个服务器允许的最大连接数,一般认为在开启持久连接的情况下把这个数值调大没什么作用,而且不太道德。需要调大的情况比方:你同时从网站下 10 个大文件。
network.http.max-persistent-connections-per-server 默认是 2 连接同一个服务器允许的最大持久连接数,这个数值 HTTP/1.1 标准推荐的是 2。调大了反而增加你自己的网络消耗,而且一般一个服务器允许的持久连接数是有限的,你调大了就可能造成别人可用的减少,如果大家都调大,就意味着网络效 率的丧失。我个人建议不要动这个数值。
network.http.pipelining 默认是 false 是否允许 pipelining,这个功能因为目前还是试验阶段,所以默认没有打开。强烈建议打开。
network.http.pipelining.maxrequests 默认是 4 每个持久连接允许一次发送的请求数。如果 pipeline 里面有一个大图片或者执行时间较长的脚本,后面已经发送的请求就会被阻塞(注意服务器必须是依次回应请求);而在这种情况下,如果没有使用 pipelining,浏览器发现一个请求处理时间很长,自然会使用另一条持久连接用作后续请求,甚至进一步开启非持久连接。另外,如果服务器支持 pipelining 不好而过早的关闭连接,浏览器势必要重新发送请求。基于这种种原因,有人认为这个数字设置得比 2 大反而会降低浏览速度。我个人的推荐是,这个数值一般情况可以保持默认值 4,如果浏览的网站有大量的静态小图片,或者网络速度较慢,可以尝试将其调大。
network.http.max-persistent-connections-per-proxy 默认是 4 每个代理服务器允许的最大持久连接数。4 是目前比较公认的最合适的数值,尽管HTTP/1.1 的推荐值是 2。
network.http.proxy.keep-alive 默认是 true 连接代理服务器是否允许持久连接。true 挺好的。
network.http.proxy.pipelining 默认是 false 连接代理服务器是否允许 pipelining。目前普遍认为大多数代理服务器支持 pipelining 并不好,所以一般不建议打开。
pipelining 目前是一个有争议的,仍旧在实验阶段的特性。虽然它可能确实会加快浏览速度,但是这在一定程度上取决于网络的各项因素,所以不要盲目的按照网上建议的方式设置相关的参数。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页