【问题标题】:How browser maps the web response back to request?浏览器如何将 Web 响应映射回请求?
【发布时间】:2017-01-18 09:42:30
【问题描述】:

假设我通过浏览器向亚马逊网络服务器发出网络请求 (www.amazon.com)。浏览器通过互联网服务提供商与互联网连接。 请求到达处理它并发回响应的亚马逊服务器。这里有两个问题:-

  1. 亚马逊服务器是否与互联网建立新连接以发回响应或传入请求(由我发起)在套接字上等待直到亚马逊处理响应?
  2. 一旦我的浏览器收到响应,它如何将响应(从亚马逊发送)映射回特定请求。我相信必须有一些唯一的标识符,比如 requestId 必须在响应中出现,浏览器必须通过它映射到请求。对吗?

【问题讨论】:

  • 如果您想了解事物的运作方式,您应该学习网络。在不了解 TCP/IP 的情况下尝试了解 HTTP(以及不同的版本)将会很困难。
  • @Kayaman 我浏览了几篇网络文章。读完之后问题就出来了。实际上,我想在未来深入阅读有关网络的书籍,但目前我正在寻找高层次的理解。
  • 你的第二个问题是关于低层次的理解。

标签: http browser tcp


【解决方案1】:
  1. 亚马逊服务器是否与 Internet 建立新连接以发回响应或传入请求(由我发起)在套接字上等待 直到亚马逊处理响应?

它使用相同的连接。由于防火墙限制或网络地址转换 (NAT),大多数情况下甚至无法连接回 Web 浏览器。

  1. 一旦我的浏览器收到请求,它如何将响应(从亚马逊发送)映射回特定请求。我相信 必须有一些唯一标识符,例如 requestId 必须存在于 浏览器必须通过其映射到请求的响应。就是它 正确吗?

它在同一个套接字上接收响应。所以套接字是标识符。如果使用 HTTP2 多路复用,那么每个多路复用的流都有一个流标识符,用于将响应映射回请求。

【讨论】:

  • 对于第一个答案It uses the same connection 我了解浏览器将使用相同的连接。但在服务器端,请求来自互联网(通过服务器 ISP)。互联网上的 http 请求将等待亚马逊服务器套接字(最终将调用 webserver)还是 web 服务器将完全创建新的响应线程,最终将在连接仍然打开的浏览器机器上接收?对不起,如果我仍然不清楚。
  • 第二个答案It receives the response on the same socket. So the socket ,通过互联网返回的响应如何知道它需要去哪个套接字?
  • 你的问题似乎本质上是 TCP 是如何工作的,它是 http 的底层传输协议。 TCP连接由((本地地址,本地端口),(远程地址,远程端口))标识。操作系统的内核会保存一个映射到本地套接字的信息表。每当一个传入的 IP 数据包使用 TCP 协议到达时,就会从数据包中提取上述信息并用于在此表中查找。
  • @ErwinBolwidt 说浏览器同时向亚马逊服务器发送两个请求(假设 ajax)(相同的端口号)它们将通过不同的套接字发送。现在,一旦我的计算机收到响应,操作系统将如何知道哪些请求映射到哪个套接字(端口和远程地址相同)。是否还有其他特定于请求的标识符也来自远程地址、远程端口?
  • @user3198603 每个传出的 TCP 连接也会获得一个“本地端口”号。通常你看不到这一点,但使用 Unix 上的“netstat”命令你可以找到。如果您有两个连接到同一远程服务器上的端口 80,它们将具有不同的本地 端口。在典型的 Linux 服务器上,本地端口的范围是从 32768 到 61000。
【解决方案2】:

客户端打开到服务器的 TCP 连接,发送 HTTP 请求,服务器使用相同的连接发送响应。因此,浏览器从连接中知道响应属于特定请求。这适用于基本的 HTTP 1。

这必须与异步和非同步的 AJAX Web 应用程序的编程模型区分开来。应用程序不会主动等待响应。相反,它稍后会在响应到达时触发。上面描述的连接处理是“在幕后”发生的。

回到连接处理:HTTP 的一些优化使事情变得更加复杂。 HTTP 1.1 有一个叫做“keep alive”的特性,而 HTTP 2 在这个方向上更进一步。这个想法是通过单个 TCP 连接发送更多数据,因为建立 TCP 连接是昂贵的(-> 三向握手,启动缓慢)。因此,多个请求和响应通过单个 TCP 连接发送。在这种优化的情况下,您的问题再次出现。如果 e。 G。在单个 HTTP 连接中有一系列请求 A、B 和相应的响应序列 B、A 浏览器如何知道响应属于哪个请求? HTTP 2 引入了流的概念(RFC 7540, section 5):

单个 HTTP/2 连接可以包含多个并发打开 流,其中任一端点交织来自多个的帧 流。

在流上发送帧的顺序很重要。

流由一个整数标识。

因此,浏览器可以使用流标识符和流中的顺序来找出响应所属的请求。

HTTP 2 引入了另一个有趣的特性,称为“推送”。客户端可以主动向客户端发送甚至没有请求的资源。因此,像 e 这样的资源。 G。当请求 HTML 时,图像可能已经发送,避免了另一个通信往返。

【讨论】:

  • 对于The client opens a TCP-connection to the server .... 我了解浏览器将使用相同的连接。但在服务器端,请求来自互联网(通过服务器 ISP)。互联网上的 http 请求将等待亚马逊服务器套接字(最终将调用 webserver)还是 web 服务器将完全创建新的响应线程,最终将在连接仍然打开的我的浏览器机器上接收?
  • 基本上当你说The client opens a TCP-connection to the server.. 时,实际上这个连接是连接到互联网而不是连接到服务器,我这个连接必须等待它得到响应。所以不知何故应该有一个标识符作为响应,以便它进入正确的套接字?
  • TCP 连接通常是客户端和服务器之间的端到端连接。服务器通常将请求委托给线程,这样新请求就不必等到所有其他请求都处理完毕。客户端和服务器(它的线程)都有自己的套接字,每个套接字都知道通信伙伴的 IP 地址和端口。因此,假设浏览器(客户端)从端口 50000 发送到服务器的端口 80。服务器的线程将响应发送回客户端的 50000 端口。 IP 地址和端口一起就像信封上的地址。
  • TCP 是一种网络协议,可在两台主机之间提供虚拟连接。连接由两者的 IP 地址和端口定义。 “连接”是指数据按照发送的顺序到达,没有包丢失,也没有包重复。协议本身使用的 IP 只关心由路由器传递的单个数据包。虚拟连接就像一根电缆,直接连接两台主机。应用程序使用套接字。套接字负责连接工作。应用程序只使用它。他们只将数据输入“行”的末端并从中获取数据。
【解决方案3】:

HTTP 使用传输控制协议。事情就是这样发生的——

  1. 亚马逊服务器是否与互联网建立新连接以发回响应或传入请求(由我发起)在套接字上等待直到亚马逊处理响应?

没有。大多数浏览器使用 HTTP 1.1,因此客户端和服务器之间的连接只建立一次,直到关闭(持久连接)。

  1. 一旦我的浏览器收到请求,它如何将响应(从亚马逊发送)映射回特定请求。我相信必须存在一些唯一标识符,例如 requestId 必须存在以响应浏览器必须映射到请求。对吗?

有一个关于如何交换消息的协议 (HTTP)。 HTTP 规定响应必须按照请求的顺序到达。所以它就像 -

请求;响应;请求;响应;请求;响应;...

还有一种特定格式的 HTTP 请求(来自您的浏览器 - HTTP 客户端)和 HTTP 响应消息(来自亚马逊 HTTP 服务器)。有响应状态代码让浏览器知道他们的请求是否成功,否则告诉错误。 一些示例代码 -

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多