29

https://serverfault.com/questions/296603/understanding-ports-how-do-multiple-browser-tabs-communicate-at-the-same-time

应用程序如何在不与浏览器冲突的情况下使用端口 80/HTTP?

多个客户端如何同时连接到服务器上的一个端口,比如 80?

我已阅读上述问题,但似乎答案不一致。

我想知道究竟是什么定义了套接字连接,是吗:

(sockid, source ip, source port, dest ip, dest port)

或仅:

(source ip, source port, dest ip, dest port)

两个不同的进程(例如,两个不同的浏览器)可以在同一个源端口上与 Web 服务器通信吗?(默认情况下目标端口相同)

如果同一浏览器中的不同选项卡会发生什么情况?

此外,如其中一个答案所述,单个网页可以同时连接到多个服务器(例如,广告服务器)。同时连接到多个服务器时,Web 浏览器(例如 Chrome、Firefox)是使用相同的端口连接到每个服务器,还是为每个服务器使用不同的端口?

4

3 回答 3

92

我知道这已经很晚了,但是由于该主题仍在互联网上,并且由于这是一个常见的问题,并且在网络上很少有权威的答案,因此对于那些可能偶然发现它的人来说,它值得一个更完整和简洁的解释,即使在这个迟到的日期。

  1. 你打开一个浏览器来打开一个网站,比如说 google.com。在指定网站的过程中,您的计算机将任意选择一个端口号用作其“源端口”。该数字将高于“动态、专用或临时端口”的开头 49152,但低于可用的最高端口号 65535。所选端口号与该浏览器“实例”相关联。

  2. 只是为了好玩,您在浏览器上打开一个新标签,并在 url 行上输入“google.com”。您的目标是运行 google.com 的两个实例,因为您正在寻找不同的东西。然后,您的计算机为该会话选择第二个端口号,不同于它用于第一个会话的“源”端口。实际上,您可以多次执行此操作,并且每个会话将具有与每个实例关联的唯一“源”端口。

  3. 您的数据包发送到 google.com,每个实例中的目标端口号将是端口 80。Web 服务器在端口 80 上“侦听”传入连接请求。对于您打开的与 google.com 的每个会话,从您计算机的角度来看,目标端口始终是端口 80,但对于您的浏览器上与 google.com 的每个连接实例,源端口将是唯一的唯一标识一个浏览器实例上的一个特定选项卡。这就是它们在您的计算机上的区别。

  4. google.com 收到您的第一个请求。它的回复将指定端口 80 作为其源端口。这就是有趣的地方。google.com 从您那里收到的每个查询都将被视为一个“套接字”,它是您的 IP 地址和与联系 google.com 的进程关联的特定端口号的组合。因此,例如,我们会说您的 IP 地址是 165.40.30.12,而您的计算机用作与 google.com 通信的四个实例的源端口的源端口号(假设四个不同的选项卡都打开 google.com)是61235、62421、58392 和 53925。这四个“套接字”将是 165.40.30.12:61235、165.40.30.12:62421、165.40.30.12:58392 和 165.40.30.12:53925。“IP地址:源端口号”的每个组合都是唯一的,并且google。com 会将每个实例视为唯一的。google.com 响应“套接字”并与之通信,即 IP 地址和端口的组合。

  5. 您的计算机从 google.com 获取响应,并根据接收到的目标“套接字”对它们进行分类,并根据端口号将其解析,然后将来自 google.com 的响应分配给适当的浏览器窗口或选项卡。因为您每次都在正确的窗口中看到正确的响应,所以您的事情结束没有问题。

  6. “但是,”你在想,“如果其他人不小心使用了相同的端口号——比如 61235——就像我用于我的源号一样?这不会让 google.com 感到困惑吗?” 一点也不,因为 google.com 正在跟踪由 IP 地址和端口号组合而成的“套接字”。当然,我们真诚地希望其他人使用与您使用的 IP 地址不同的 IP 地址,例如 152.126.11.27,并且 IP 地址和端口号的组合是唯一的 - 152.126.11.27:61235 - 区分为即使端口号相同,它们的 IP 地址也不同。

  7. google.com 是否收到来自 1000 个用户的 1000 个查询并不重要,所有用户都使用端口 80 作为其目标端口号(google.com 正在侦听传入通信的端口),因为这 1000 个用户中的每一个都将具有唯一的 IP 地址. google.com 通过其独特性来跟踪其客户——而且他们总是必须是独特的,不是吗?- 由其 IP 地址和“源”端口号组成的套接字号。即使这 1000 个客户端中的每一个都设法使用相同的“源”端口号(不太可能达到最大值),它们仍然会有不同的 IP 地址,使得它们的源“套接字”在所有其他客户端中是唯一的。

  8. 当你看到它以这种方式解释时,这一切都相当简单。它清楚地表明,Web 服务器始终可以侦听一个端口 (80),并且仍然可以与各种客户端区分开来。它不只是查看它在查询中收到的 IP 地址——你会认为它们乍一看都应该是唯一的,直到你意识到你可以在该 Web 服务器上打开多个网页——而是在源端口number 组合在一起,使每个查询都是唯一的。我希望这很清楚。当您考虑它时,它是一个优雅的系统,但一旦您理解它就很简单。

于 2015-03-14T04:22:29.253 回答
10

依次回答您的问题:

连接定义为:

{ 协议,本地 IP,本地端口,远程 IP,远程端口 }

(最好说本地和远程而不是源和目标,因为本地端口是发送时的源,但接收时是目标。)

sockid 只是用户进程中的一个描述符,它映射到内核中的连接,就像文件描述符映射到磁盘上已打开的文件一样。

两个不同的进程不能绑定到同一个本地端口。但是,两个进程可以使用相同的连接——套接字描述符可以从父进程继承到子进程,或者描述符可以使用进程间通信在进程之间传递。这两个进程将使用相同的端口,因为它们实际上共享相同的连接。

虽然该协议允许在连接到不同的远程服务器或端口时使用相同的本地端口,但大多数 TCP 堆栈不允许这样做。无论您是将其用于传出连接还是侦听传入连接,绑定本地端口的 API 都是相同的,并且在绑定端口之后才指定意图。由于只有一个套接字可以侦听特定端口,API 简单地拒绝允许多个套接字绑定到一个端口(对此有一个特殊的例外,但与本讨论无关)。因此,所有传出连接都将使用不同的本地端口。因此,当浏览器打开多个连接(到相同或不同的 Web 服务器)时,它们将具有不同的本地端口。

于 2012-11-02T06:59:51.117 回答
-2

我已经在各自的论坛上阅读了上述问题,但我想那里的人也不同意对方。

关于你提到的问题,我认为没有任何分歧。

我想知道究竟是什么定义了套接字连接

( sockid , 源 ip , 源端口 , dext ip , 目标端口 )

或仅

(源 ip,源端口,dext ip,目标端口)

后者。前者是虚构的。您引用的任何线程中都没有提到它。

我想问的是,两个不同的进程,比如两个不同的浏览器,是否可以在同一个源端口上与 Web 服务器通信。(默认情况下,目标端口是相同的)。

如果它们位于同一源 IP,则不会。这将违反上述身份定义。

如果同一浏览器中有不同的选项卡怎么办。

是的,因为连接池。如果您在谈论单独的连接,答案仍然是否定的。

同样如答案之一所述,单个网页尝试连接到许多不同的服务器,例如广告服务器等。Chrome 或 Firefox 也使用相同的端口连接到不同的服务器或使用单个端口。

你将不得不解释这一点。“同一个端口”和“一个端口”有什么区别?不是一个真正的问题。

于 2012-11-02T09:30:21.317 回答