端口号如何在 TCP 中真正起作用?

Posted

技术标签:

【中文标题】端口号如何在 TCP 中真正起作用?【英文标题】:How does Port Number really work in TCP? 【发布时间】:2012-10-22 19:31:45 【问题描述】:

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

how can an application use port 80/HTTP without conflicting with browsers?

How do multiple clients connect simultaneously to one port, say 80, on a server?

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

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

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

或仅:

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

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

如果同一浏览器中的不同标签页会发生什么情况?

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

【问题讨论】:

我没有阅读裁判的问题,但序列号对于识别连接也有重要作用。 【参考方案1】:

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

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

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

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

    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 地址和端口的组合。

    您的计算机从 google.com 获取响应,并根据接收到的目标“套接字”对它们进行分类,并通过端口号解析,将来自 google.com 的响应分配给相应的浏览器窗口或标签,视情况而定。每次都在正确的窗口中看到正确的响应,因此您最终没有问题。

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

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

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

【讨论】:

本地端口是 @paul1307 - 有关如何处理服务器端多个请求的更多信息将使这个答案完整且具有高度教育意义。 但是,如果您有两台计算机作为同一个 LAN 的一部分,并且浏览器恰好将相同的端口号分配给 PC-A 上的一个 google.com 实例和另一个 google 实例,该怎么办? .com 在 PC-B 上? @AleksandrH 两台计算机的 IP 地址不同。除了 Google 之外,任何地方都没有“coogle.com 的实例”。大概您的意思是 google.com 的连接。【参考方案2】:

依次回答你的问题:

连接由以下定义:

协议、本地IP、本地端口、远程IP、远程端口

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

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

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

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

【讨论】:

我对您的回答有疑问。假设我在 ***.com 的两个不同选项卡中打开了两个连接(为了这个问题,假设我正在连接到同一台服务器)。假设套接字 1 在本地端口 1 和远程端口 80 上。第二个假设是本地:2 和远程:80。从服务器的角度来看,它是否在本地:80 和远程:1 上通信,套接字 1 和本地: 80 遥控器:2 用于插座 2 ?还是本地:1 和远程:80 用于套接字 1 和本地:2 远程:80 用于套接字 2?如果是前者,那么服务器如何维护 2 个具有相同本地端口的开放连接? 这是第一种方式。服务器上的本地端口是客户端上的远程端口,反之亦然。它能够做到这一点,因为连接是由端口和 IP 定义的,只要远程端口和/或 IP 不同,就可以使用同一个本地端口进行多个连接。【参考方案3】:

我已经在各自的论坛上阅读了上述问题,但我猜人们 也有不同意的地方。

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

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

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

或只有

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

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

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

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

如果同一浏览器中有不同的标签页。

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

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

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

【讨论】:

"如果它们在同一个源 IP,则不会。这将违反上述身份定义。"他们肯定会使用不同的临时源/本地端口(他们的“退出”端口),从而导致您具有来自以下位置的唯一身份:“本地IP,本地端口,远程IP,远程端口” - 即示例是'不现实。 @Joe He 询问有关使用 same 源端口和目标端口的问题。你的观点? 只是让某些东西设法使用相同的源端口和目标端口似乎是做作的。通常你会得到为你分配的出口端口,我想知道这是否是混淆点。定义出口端口并不典型,是吗? @Joe 当然不是,但这并不会使我在这里所说的任何内容无效。在我看来,您的评论属于他的问题,而不是我的回答。

以上是关于端口号如何在 TCP 中真正起作用?的主要内容,如果未能解决你的问题,请参考以下文章

TCP/应用层如何识别目的端口号?

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

TCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号

如何使用 jQuery 从 URL 中获取端口号?

如何使用 jQuery 从 URL 中获取端口号?

网络通信与信息安全之深入解析TCP连接中如何确定客户端的端口号