假设我通过浏览器向亚马逊网络服务器发送网页请求(www.amazon.com)。浏览器通过Internet服务提供商与Internet建立连接。 请求到达处理它的amazon服务器并发回响应。这里有两个问题: -
答案 0 :(得分:3)
客户端打开与服务器的TCP连接,发送HTTP请求,服务器使用相同的连接发送响应。因此,浏览器从连接中知道响应属于特定请求。这适用于基本HTTP 1。
这必须与AJAX Web应用程序的编程模型区分开来,该应用程序是异步的而不是同步的。应用程序不会主动等待响应。相反,它会在响应到来时触发。上面描述的连接处理是“引擎盖下”发生的事情。
回到连接处理:HTTP的优化使事情变得更复杂。 HTTP 1.1有一个名为“keep alive”的功能,HTTP 2进一步向这个方向发展。这个想法是通过单个TCP连接发送更多数据,因为建立TCP连接很昂贵( - >三次握手,慢启动)。因此,通过单个TCP连接发送多个请求和响应。在优化的情况下,您的问题再次出现。如果是。 G。在单个HTTP连接中有一系列请求A,B和一系列相应的响应B,A,浏览器如何知道响应所属的请求? HTTP 2引入了流(RFC 7540, section 5)的概念:
单个HTTP / 2连接可以包含多个并发打开的连接 流,其中任一端点交织来自多个的帧 流。
在流上发送帧的顺序非常重要。
流由整数标识。
因此,浏览器可以使用流标识符和流中的顺序来查找响应所属的请求。
HTTP 2引入了另一个有趣的功能,称为“推送”。客户端可以主动向客户端甚至没有请求的客户端发送资源。所以,像e这样的资源。 G。当请求HTML时,可以发送图像,避免另一次通信往返。
答案 1 :(得分:2)
- Amazon服务器是否与Internet建立新连接以发回响应或传入请求(由我发起)等待套接字 直到亚马逊处理回应?
醇>
它使用相同的连接。大多数情况下,由于防火墙限制或网络地址转换(NAT),甚至无法连接回Web浏览器。
- 一旦我的浏览器收到请求,它如何将响应(从亚马逊发送)映射回特定请求。我相信 必须有一些唯一的标识符,如requestId必须存在 浏览器必须映射到请求的响应。就是它 对吗?
醇>
它在同一个套接字上收到响应。所以套接字是标识符。如果使用HTTP2复用,则每个复用流都有一个流标识符,用于将响应映射回请求。
答案 2 :(得分:0)
- 亚马逊服务器是否与互联网建立新连接以发回响应或传入请求(由我发起)等待套接字直到亚马逊处理响应?
醇>
没有。大多数浏览器使用HTTP 1.1,因此客户端和服务器之间的连接只建立一次,直到关闭(持久连接)。
- 一旦我的浏览器收到请求,它如何将响应(从亚马逊发送)映射回特定请求。我相信必须有一些唯一的标识符,例如requestId必须存在以响应,浏览器必须映射到请求。这是对的吗?
醇>
有关于如何交换消息的协议(HTTP)。 HTTP规定响应必须按照请求的顺序到达。所以它就像 -
请求;响应;请求;响应;请求;响应; ...
还有一种特定格式的HTTP请求(来自您的浏览器 - HTTP客户端)和HTTP响应消息(来自amazon HTTP服务器)。有响应状态代码,让浏览器知道他们的请求是否成功,否则告诉错误。 一些示例代码 -