浏览器如何知道哪个响应属于哪个请求?

时间:2017-04-20 10:10:22

标签: http networking network-protocols

假设当我们通过HTTP请求资源时,我们会收到如下所示的响应:

GET / HTTP/1.1
Host: www.google.co.in

HTTP/1.1 200 OK
Date: Thu, 20 Apr 2017 10:03:16 GMT
...

但是当浏览器一次请求多个资源时,如何识别哪个请求得到了哪个响应?

3 个答案:

答案 0 :(得分:6)

  

当浏览器一次请求多个资源时,如何识别哪个请求得到了哪个响应?

浏览器可以打开一个或多个与Web服务器的连接以请求资源。对于每个连接,有关HTTP keep-alive的规则是相同的,并且适用于HTTP 1.0和1.1:

  • 如果HTTP keep-alive关闭,请求由客户端发送,响应由服务器发送,连接关闭:

    Connection 1: [Open][Request1][Response1][Close]
    
  • 如果启用了HTTP keep-alive,则可以为后续请求重用一个“持久”连接。请求仍然通过相同的连接顺序发出,因此:

    Connection 1: [Open][Request1][Response1][Request3][Response3][Close]
    Connection 2: [Open][Request2][Response2][Request4][Response4][Close]
    

使用HTTP 1.1引入的HTTP Pipelining,如果启用它(在大多数浏览器上默认禁用,因为有错误的服务器),浏览器可以在不等待响应的情况下相互发出请求,但是响应仍按照请求的顺序返回。

  • 这可以在多个(持久)连接上同时发生:

    Connection 1: [Open][Request1][Request2][Response1][Response2][Close]
    Connection 2: [Open][Request3][Request4][Response3][Response4][Close]
    

这两种方法(保持活动和流水线操作)仍然使用HTTP的默认“请求 - 响应”机制:每个响应将按照同一连接上的请求的顺序到达。它们还有"head of line blocking" problem:如果[Response1]速度很慢和/或很大,它会保留该连接后面的所有响应。

它通过为每个片段提供一个标识符来指示它所属的请求 - 响应对来实现这一点,因此接收者可以重新组合消息。

答案 1 :(得分:1)

我认为你真的在这里要求HTTP Pipelining。这是HTTP / 1.1中引入的一种技术,通过该技术,客户端将按顺序发送所有请求,并由服务器以相同的顺序响应。所有血腥细节现在都在RFC 7230, sec. 6.3.2

HTTP / 1.0拥有(或拥有)一种称为Keep Alive的可比方法。这将允许客户端在回答之前的请求后立即发出新请求。这种方法的好处是客户端和服务器不再需要通过另一次TCP握手协商以进行新的请求/响应周期。

重要的是,在两种方法中,响应的顺序与通过一个连接发出的请求的顺序相匹配。因此,响应可以通过客户端接收它们的顺序唯一地映射到发出请求:第一个响应匹配,第一个请求,第二个响应匹配第二个请求,......等等。

答案 2 :(得分:0)

除了上面的解释之外,考虑一个浏览器可以打开许多并行连接,通常最多6个连接到同一个服务器。对于每个连接,它使用不同的套接字。对于每个套接字中的每个请求 - 响应,很容易确定相关性。