2017-04-20 71 views
1

假设,当我们通过HTTP请求一个资源,我们得到的响应如下图所示:浏览器如何知道哪个响应属于哪个请求?

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

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

但是,当一个浏览器可以同时请求的资源,怎么能确定哪个请求得到它的响应?

+0

它不需要“识别”,请求和响应自动“归属”在一起。 – CBroe

+0

服务器是否连续响应,以便通知浏览器?这意味着HTTP中没有优先级。 –

+0

不,请求可以并行发生。客户端只是打开多个连接,并在每个连接上发送一个HTTP请求,以便响应通过相同的连接到达。 http://blog.catchpoint.com/2010/09/17/anatomyhttp/解释基础知识。 – CBroe

回答

1

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

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

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

+0

HTTP/1.1的流水线(依赖于KeepAlive)和HTTP/1.0之间的区别在于,在前者中,客户端可以在获取任何响应之前发出多个请求,但在HTTP/1.0中,客户端必须等待响应发出新的请求。 – symcbean

+0

@symcbean不需要。 HTTP/1.1的流水线不依赖Keep Alive,请参阅上面的链接。 HTTP只是假定连接保持打开状态直到关闭。请求/响应顺序:这几乎是我写的,不是吗? – DaSourcerer

+0

“不依赖Keep Alive” - 我完全被这个困惑了。如何通过只允许单个请求和响应的通道发送多个请求? – symcbean

1

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

浏览器可以打开一个或多个连接到Web服务器以请求资源。对于每个这些连接的关于HTTP keep-alive规则是相同的,并且同时适用于HTTP 1.0和1.1:如果HTTP保持活动是关闭的,则该请求由客户端发送,响应由所述发送

  • 服务器,连接被关闭:

    Connection 1: [Open][Request1][Response1][Close] 
    
  • 如果HTTP保持活动上,一个“老大难”的连接可以为后续的请求被重用。该请求仍然发出连续在同一个连接,所以:

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

随着HTTP Pipelining,与HTTP 1.1推出,如果启用了(大多数浏览器是默认情况下禁用,因为车的服务器) ,浏览器可以在不等待响应的情况下相互发出请求,但响应仍然按照请求的顺序返回。

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

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

两种方法(保持活动和流水线)仍然利用HTTP的默认的“请求 - 响应”机制:每个响应将按照同一连接上的请求顺序到达。他们也有"head of line blocking" problem:如果[Response1]缓慢和/或较大,它将阻止在该连接上进行的所有响应。

它通过给每个片段的标识符这是否以指示哪个请求 - 响应对它属于,所以接收者可以重构消息。

+0

谢谢你的回答。很好的解释 –

0

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

相关问题