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

Aje*_*ddy 4 networking http 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
...
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ter 8

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

浏览器可以打开与Web服务器的一个或多个连接以请求资源。对于这些连接中的每一个,有关HTTP保持活动的规则都是相同的,并且适用于HTTP 1.0和1.1:

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

    Connection 1: [Open][Request1][Response1][Close]
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果启用HTTP keep-alive,则可以将一个“持久”连接重用于后续请求。这些请求仍通过相同的连接顺序发出,因此:

    Connection 1: [Open][Request1][Response1][Request3][Response3][Close]
    Connection 2: [Open][Request2][Response2][Request4][Response4][Close]
    
    Run Code Online (Sandbox Code Playgroud)

使用HTTP 1.1引入的HTTP Pipelining(如果启用了HTTP Pipelining)(在大多数浏览器中,由于服务器故障,默认情况下处于禁用状态),浏览器可以在不等待响应的情况下互相发出请求,但是响应仍在与要求的顺序相同。

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

    Connection 1: [Open][Request1][Request2][Response1][Response2][Close]
    Connection 2: [Open][Request3][Request4][Response3][Response4][Close]
    
    Run Code Online (Sandbox Code Playgroud)

两种方法(保持活动和流水线)仍使用HTTP的默认“请求-响应”机制:每个响应将以请求的顺序到达同一连接。它们还存在“行头阻塞”问题:如果[Response1]速度较慢和/或较大,它将阻止该连接上的所有响应。

它通过给每个片段一个标识符来指示它属于哪个请求-响应对来做到这一点,以便接收者可以重新组成消息。


DaS*_*rer 2

我认为您在这里确实要求HTTP 管道。这是HTTP/1.1中引入的技术,通过该技术,所有请求都将由客户端按顺序发出,并由服务器按相同的顺序响应。所有血淋淋的细节现在都在RFC 7230 秒中。6.3.2 .

\n

HTTP/1.0 有(或已经)有一个类似的方法,称为Keep Alive。这将允许客户端在前一个请求得到答复后立即发出新的请求。这种方法的好处是客户端和服务器不再需要通过另一次 TCP 握手来协商新的请求/响应周期。

\n

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

\n