了解端口:多个浏览器选项卡如何同时通信?

了解端口:多个浏览器选项卡如何同时通信?

我今天意识到我从根本上不了解端口通信是如何工作的。

如果我启动一个监听端口 80 的 Web 服务器实例,它可以响应来自许多不同浏览器选项卡的许多请求,所有请求都通过端口 80 进行通信。

但是,我无法启动两个服务器实例,都监听端口 80,因为这会导致端口冲突。

我一直认为这是理所当然的(在任何给定时间只有一个进程可以绑定到特定端口),而从未真正仔细考虑过 - 难道没有多个进程在端口 80 上进行通信吗?(即浏览器中运行的每个选项卡?)

答案1

基本上,一次只有一个进程可以侦听一个端口(从技术上讲,一个套接字专用于侦听)。但是,一个端口可以处理多个套接字传输数据,套接字是本地 IP/端口和远程 IP 地址/远程端口的组合。这样,一旦服务器在侦听时接受传入连接,它就会打开一个专用于该对话的新套接字,并将处理交给其他程序,然后返回侦听。

更多详细信息请点击此处

答案2

浏览器从您计算机上的随机高(即 > 1024)端口连接到远程服务器的端口 80。因此,您的机器上没有端口冲突。

如果您使用多个选项卡连接到同一个远程服务器(或者有许多用户连接到该服务器),那么它们都会转到同一个端口并由同一个进程(即站点的 Web 服务器)提供服务。

答案3

监听端口 80 的服务器不必处理多个进程。旧时代的简单 TCP 守护进程每次只能处理一个连接。您可以通过让类似程序netcat监听特定端口并尝试将两台机器连接到该端口来模拟此行为。其中一台机器会进入,另一台机器会在没有连接的情况下退出。这些守护进程几乎毫无用处,因此您再也看不到它们了。

对于 Web 服务器之类的东西,它会直接监听端口。需要记住的是,它位于操作系统的套接字库之上。建立新连接时,套接字库会将全新的套接字传递给 Web 服务器软件。此时,Web 服务器软件有一些选择。

一种可能性是它将套接字对象传递给同一进程中的新线程。每当通过此套接字发生通信时,此线程都会处理它。父进程会调解在给定时间内哪些线程处于活动状态,这可能很多。

另一种可能性是它启动一个新进程并将套接字对象传递给该进程。据我了解,现在由操作系统的套接字系统来调解这些子进程与其目标之间的通信。父进程仍然对进程有一定的控制权,例如终止挂起的进程和其他进程间通信。

哪种方法更有效取决于操作系统。如果我没记错的话,Apache 可以在任一模式下运行。

本质上,套接字库为 Web 服务器提供了一定程度的并行处理。它可以处理多个同时主动传输数据的连接,同时接受新连接。

对于可以启动多次连接网络服务器以缩短加载时间的浏览器来说,并行性也适用于浏览器端,这是一件好事。浏览器在加载页面时会跟踪页面的状态,它启动的多次连接尝试都是该过程的一部分。

答案4

您的问题让我想起了自己在几年前获得思科 CCNA 资格之前也曾有过同样的疑虑:)

首先,建立多个 HTTP 连接并不一定与您在浏览器中打开的选项卡数量有关。例如,当访问带有广告或 Google Analytics 代码的网站时,尽管您只在一个选项卡中,但您将连接到多个网站。

无论如何,当您的浏览器与 Web 服务器通信时,发送到 Web 服务器的流量的目标端口是端口 80,而源端口是一个随机数。源端口是为了让 Web 服务器知道他应该在哪个端口与您通信。每个已建立的 http 连接都会在您的计算机上打开自己的端口。尝试在打开几个网站的情况下运行 netstat,您就会立即明白我的意思。

你可能会笑,但是这本书是快速掌握 TCP/IP 基础知识的绝佳方式。它对我帮助很大。

相关内容