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?
我已阅读上述问题但似乎答案不一致。
我想知道确切定义套接字连接是什么,是:
(sockid, source ip, source port, dest ip, dest port)
或仅限:
(source ip, source port, dest ip, dest port)
两个不同的进程(例如,两个不同的浏览器)可以与同一源端口上的Web服务器通信吗? (默认情况下,dest端口将是相同的)
同一浏览器中不同标签的情况会怎样?
此外,如其中一个答案中所述,单个网页可以同时连接到多个服务器(例如,广告服务器)。当同时连接到多个服务器时,Web浏览器(例如,Chrome,Firefox)是否使用相同的端口连接到每个服务器,还是为每个服务器使用不同的端口?
答案 0 :(得分:65)
我知道这已经很晚了,但由于该主题仍在互联网上,并且因为它是一个在网络上很少有权威答案的常见问题,所以对于那些可能绊倒的人来说,它应该得到一个更完整和简洁的解释。进入它,即使是在这个较晚的日期。
你打开一个浏览器来建立一个网站,让我们说google.com。在指定网站的过程中,您的计算机将任意选择一个端口号作为其源端口。"这个数字将高于49152,这是动态,私人或短暂港口的开始。但低于65535这是可用的最高端口号。所选端口号与该浏览器"实例相关联。"
只是为了好玩,您在浏览器上打开一个新标签页,然后输入" google.com"在网址上。您的目标是让两个google.com实例运行,因为您正在寻找不同的东西。然后,您的计算机为该会话选择第二个端口号,不同于" source"它用于第一次会话的端口。事实上,你可以多次这样做,每次会议都会有一个独特的来源"与每个实例关联的端口。
您的数据包将发送至google.com,每个实例中的目标端口号将为端口80.网络服务器"收听"在端口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获取响应,并按照收到的目的地对其进行排序" socket"它按端口号解析,并根据需要将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地址,使得它们的来源" socket"在所有其他人中独一无二。
当你看到它以这种方式解释时,这一切都很简单。它清楚地表明,Web服务器总是可以在一个端口上监听(80)并且仍然可以与各种客户端区分开来。它并不是简单地查看它在查询中收到的IP地址 - 您认为它们在乍一看都应该是唯一的,直到您意识到您可以在该Web服务器上打开多个网页 - 但在源端口号,它组合起来,使每个查询都是唯一的。我希望这很清楚。它是一个优雅的系统,当你想到它,但一旦你理解它就很简单。
答案 1 :(得分:10)
轮流提问:
连接定义如下:
{protocol,local IP,local port,remote IP,remote port}
(最好说本地和远程而不是源和目的地,因为本地端口是您发送时的来源,但是当您收到时是目的地。)
sockid只是用户进程中的一个描述符,它映射到内核中的连接,就像文件描述符映射到已打开的磁盘上的文件一样。
两个不同的进程无法绑定到同一本地端口。但是,两个进程可能使用相同的连接 - 套接字描述符可以从父进程继承到子进程,或者描述符可以使用进程间通信在进程之间传递。这两个进程将使用相同的端口,因为它们实际上共享相同的连接。
虽然协议允许在连接到不同的远程服务器或端口时使用相同的本地端口,但大多数TCP堆栈都不允许这样做。无论是将其用于传出连接还是侦听传入连接,绑定本地端口的API都是相同的,并且在绑定端口之后才会指定该意图。由于只有一个套接字可以侦听特定端口,因此API只是拒绝允许多个套接字绑定到端口(这有一个特殊的例外,但它与此讨论无关)。因此,所有传出连接将使用不同的本地端口。因此,当浏览器打开多个连接(对于相同或不同的Web服务器)时,它们将具有不同的本地端口。
答案 2 :(得分:-2)
我已经在各个论坛上阅读了上述问题,但我猜人们 也不相称。
对于你提到的事项,我认为没有任何异议。
我想知道究竟是什么定义了套接字连接
(sockid,source ip,source port,dext ip,dest port)
或仅
(源ip,源端口,dext ip,dest端口)
后者。前者是想象力的虚构。在您引用的任何主题中都没有提到它。
我想问的是,可以有两个不同的过程,比如两个 不同的浏览器与同一来源的Web服务器通信 port。(默认情况下,Dest端口是相同的。)
如果它们处于相同的源IP,则不会。它会违反上述身份定义。
同一浏览器中不同标签的情况。
是的,因为连接池。如果你在谈论单独的连接,答案仍然是否定的。
另外,如单个网页尝试的其中一个答案中所述 连接到许多不同的服务器,如广告服务器等。所以Chrome 或者firefox就此事与同一个端口连接到不同的端口 服务器或使用单个端口。
你将不得不解释这个。 “同一个端口”和“单个端口”之间有什么区别?不是一个真正的问题。