了解端口:多个浏览器标签如何同时通信?

我今天才意识到,我从根本上不了解港口通讯是如何工作的。

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

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

我一直把它当作给定的(只有一个进程可以绑定到特定的端口在任何给定的时间),没有真正考虑通过 – 是不是有多个进程在80端口通信? (即每个在浏览器中运行的选项卡?)

基本上,一次只能有一个进程监听一个端口(技术上,一个socket专用于监听)。 但是,一个端口可以处理多个传输数据的套接字,套接字是本地IP /端口和远程IP地址/远程端口的组合。 这样,一旦服务器在LISTENing接收到传入连接时打开一个专用于该对话的新套接字并将处理closures到其他事件,则返回到LISTENing。

更多细节在这里 。

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

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

侦听端口80的服务器不必处理多个进程。 老年人的简单TCP守护进程一次只能处理一个连接。 您可以通过像netcat这样的程序监听特定的端口并尝试将两台机器连接到它来模拟此行为。 一个会进来,另一个会反弹而没有连接。 这些守护进程大多是无用的,所以你再也看不到它们了。

对于像Web服务器的东西,它直接在端口上侦听。 要记住的是,它位于操作系统的套接字库之上。 当一个新的连接build立时,套接字库将全新的套接字传递给networking服务器软件。 在这一点上,networking服务器软件有一些select。

一种可能性是它在同一个进程中将套接字对象传递给一个新的线程。 每当通过这个套接字进行通信,这个线程就会处理它。 父进程在任何给定时间调解哪些线程是活动的,这可能是很多的。

另一种可能性是它启动一个新的进程,并将套接字对象传递给进程。 据我了解,现在是操作系统的套接字系统调解这些subprocess和目标之间的通信。 父进程仍然对进程有一定的控制,比如杀死挂机进程和其他进程间通信。

哪种方法更高效取决于操作系统。 IIRC,Apache可以在任何一种模式下运行。

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

对于一个浏览器来说,为了改善加载时间,可以将多个连接尝试连接到一个web服务器,并行性也适用于浏览器端,这是一件美妙的事情。 浏览器会在加载页面时跟踪页面的状态,并且多次连接的尝试都是整个过程的一部分。

实际上有两种“types”的stream套接字。 一个有一个通配符“另一端”,另一端有一个特定的主机:端口。

没有两个套接字可以(或者更确切地说)具有相同的“本端”和“另一端”标识符。 被“监听”(接受传入连接)的套接字是具有通配符“另一端”的套接字,因此一次只能存在一个套接字。 当连接到达时, accept完成,为另一端返回一个带有主机端口元组的套接字。

你的问题让我想起了在思科CCNA之前的几年 – 也有同样的怀疑:)

首先,build立多个HTTP连接不一定与您在浏览器中打开的标签数量相关联。 例如,在访问包含广告或Google Analytics代码的网站时,尽pipe只有一个标签,仍然可以连接到多个网站。

无论如何,当您的浏览器与networking服务器通信时,发送到networking服务器的stream量的目标端口是80端口,而源端口是随机数。 源端口是让networking服务器知道他应该通信哪个端口。 每个httpbuild立的连接将在您的计算机上打开它自己的端口。 尝试运行与几个网站打开netstat,你会立即明白我的意思。

你可能会笑,但是这本书是一个很好而且快速的方法来获得TCP / IP的基础知识。 它帮了我很多。