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

Arp*_*wal 22 port networking tcp

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服务器通信吗?(默认情况下,dest端口是相同的)

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

而且,如在一个答案中所提到的,单个网页可以同时连接到多个服务器(例如,广告服务器).当同时连接到多个服务器时,Web浏览器(例如,Chrome,Firefox)是否使用相同的端口连接到每个服务器,还是为每个服务器使用不同的端口?

小智 69

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

  1. 你打开一个浏览器来建立一个网站,比如google.com.在指定网站的过程中,您的计算机将任意选择一个端口号作为其"源端口".该数字将高于49152,这是"动态,私有或短暂端口"的开头,但低于65535这是可用的最高端口号.所选端口号与该浏览器"实例"相关联.

  2. 只是为了好玩,您在浏览器上打开一个新标签,并在网址行上输入"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服务器上打开多个网页 - 但是在源端口数字,它组合起来,使每个查询都是唯一的.我希望这很清楚.当你想到它时,它是一个优雅的系统,一旦你理解它就很简单.

  • @paul1307 - 有关如何处理服务器端多个请求的更多信息将使这个答案完整且具有高度的教育意义。 (2认同)
  • 但是,如果您有两台计算机作为同一个 LAN 的一部分,并且浏览器恰好将相同的端口号分配给 PC-A 上的一个 google.com 实例和 PC-B 上的另一个 google.com 实例,该怎么办? (2认同)

Bar*_*mar 10

轮流提出问题:

连接定义如下:

{protocol,local IP,local port,remote IP,remote port}

(最好说本地和远程而不是源和目的地,因为本地端口是您发送时的来源,但是当您收到时是目的地.)

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

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

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