计算机网络:非持久HTTP连接 VS 持久性HTTP 连接

  • 非持久HTTP连接(non-persistent HTTP)是在http/1.0中定义
  • 持久HTTP连接(persistent HTTP)是在http/1.1中定义,其默认带流水线

非持久HTTP连接

某网页由最基本的 HTML 和10个JPEG 图像构成,10个JPEG 图像文件存放在同一台服务器中。如果用户请求该网页并采用“非持久连接”,那么在HTTP 客户(通常是用户浏览器)和服务器之间将发生以下操作:

  1. HTTP 客户端初始化一个与服务器主机www.server.com中的HTTP服务器的TCP 连接。服务器使用默认端口80监听来自HTTP客户的建立连接请求。
  2. HTTP客户端经由与TCP关联的本地Socket发出一个HTTP请求消息(Request)。这个消息中包含路径名 …/index.html。
  3. HTTP服务器经由与TCP关联的本地Socket接收到这个请求消息,再从服务器主机的内存或者硬盘中取出文件 …/index.html,经由同一Socket向 HTTP客户端发送包含该文件的响应消息 (Response Message)。
  4. HTTP服务器通知TCP服务层关闭这个TCP连接;TCP服务层并不立即关闭这个连接,而是在客户收到刚才那个响应消息后才会真正终止这个连接。
  5. HTTP客户端经由同一 Socket 接收这个响应消息 (Response Message)。TCP连接随后终止。客户端所收到的消息中封装了客户端所请求的 HTML文件。客户端浏览器从中取出这个文件,加以分析后发现这个文件中还有有10个JPEG对象引用。
  6. 对每个引用到的JPEG对象重复步骤1~4。

上述步骤之所以称为使用非持久连接,原因是每次服务器发送一个对象后相关的TCP连接就被关闭,也就是说每个连接没有持续到可以传输其他对象。每个TCP连接只能传送一个请求消息和响应消息。就上述例子,用户请求的那个Web页面就产生了11个TCP连接(1个网页请求连接和10个图象请求连接)。
   
在上述的例子中,并没有明确指出客户是依次打开10 逐一取得每个 JPEG 对象,还是同时打开多个 TCP连接同时取得多个 JPEG 对象。实际上,现今的浏览器允许用户通过配置来控制并行连接的程度。大多数浏览器默认可以打开5~10个并行TCP连接,每个连接处理一个请求/响应事务。如果把并行连接数设置为1,那样的话这个传送 JPEG 的10个连接是串行建立的。使用并行连接可以缩短响应时间。

非持久连接缺点

  1. 客户要为每个待请求的对象建立并维护一个新得连接。对于每个连接,TCP 必须同时在客户端和服务器端分配 TCP 缓冲区,并维护 TCP 变量。对于有可能同时为来自数百个不同客户的请求提供服务的Web服务器来说,这会严重增加服务器的负担;
  2. 对每个对象请求都有2个 RTT 的响应延迟:一个 RTT 用于建立 TCP 连接,另一个 RTT 用于请求和接收对象;
  3. 每个对象都要经历 TCP 缓启动,因为每个TCP连接都要起始于 slow start 阶段。并行 TCP 连接的使用能够部分减轻 RTT 延迟和缓启动的影响。

持久HTTP连接

在持久连接情况下,服务器在发出响应后保持TCP连接继续打开着。同一客户/服务器之间的后续请求和响应可以通过这个连接传递。整个Web页面上,比如 1 个基本HTML和 10 个JPEG对象的页面,可以通过单个的持久TCP连接发送。甚至存放在同一个服务器中的多个Web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置了一段时间后就关闭它,而这段时间通常是可以配置的。

流水线(Pipeline)

持久连接分为不带流水线(without pipeline)和带流水线(with pipeline)两个版本。

如果是无流水线的版本,那么客户只能在接收到前一个请求的响应后才会发送新的请求。这种情况下,Web页面所引用的每个对象(上例中的10个JPEG图像)都经历1个RTT延迟用于请求和接收该对象。于非持久连接中每个对象需要2个RTT相比,不带流水线的持久连接已经有所改善。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新的请求却不能马上到达。这段时间服务器资源便闲置了。带流水线的持久连接还能进一步降低响应延迟。

HTTP/1.1的默认模式是使用带流水线的持久连接。这种情况下,HTTP客户每遇到一个对象引用就立即发出一个请求,因而HTTP客户可以一个接一个连续发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个连续发送各个对象。如果所有的请求和响应都连续发送的,那么所有引用到的对象供给经历1个RTT延迟,而不是像不带流水线版本那样,每个引用都必须有1个RTT延迟。
与非持久连接相比,持久连接,无论是否带流水线降低了1个RTT延迟外,缓启动延迟也比较小。其原因在于既然各个对象都使用同一个TCP连接,服务器发送第一个对象后就不必再以一开始的缓慢速率发送后续对象了。

参考来源:http://ordinarysky.cn/zblog/post/persistentinhttp.html

猜你喜欢

转载自blog.csdn.net/SongXJ_01/article/details/106806378