Mar*_*itt 18 networking port tcp
我今天意识到我根本不了解端口通信是如何工作的。
如果我启动一个侦听端口 80 的网络服务器实例,它可以响应来自许多不同浏览器选项卡的许多请求,所有请求都通过端口 80 进行通信。
但是,我无法启动服务器的两个实例,它们都侦听端口 80,因为这会导致端口冲突。
我一直认为这是给定的(在任何给定时间只有一个进程可以绑定到特定端口)而没有真正考虑过——不是有多个进程在端口 80 上通信吗?(即,浏览器中运行的每个选项卡?)
Paw*_*cki 14
浏览器从您计算机上的一个随机高(即 > 1024)端口连接到远程服务器的端口 80。因此,您的计算机上没有端口冲突。
如果您使用多个选项卡连接到同一个远程服务器(或者有许多用户连接到服务器),它们都将转到同一个端口并由同一个进程(即站点的 Web 服务器)提供服务。
侦听端口 80 的服务器不必处理多个进程。古老的简单 TCP 守护进程一次只能处理一个连接。您可以通过让程序netcat监听特定端口并尝试将两台机器连接到它来模拟这种行为。一个会进入,另一个会在没有连接的情况下反弹。这些守护进程大多是无用的,所以你再也看不到它们了。
对于像网络服务器这样的东西,它直接监听端口。要记住的是,它位于操作系统的套接字库之上。当建立新连接时,套接字库将全新的套接字传递给网络服务器软件。那时,网络服务器软件有一些选择。
一种可能性是它将套接字对象传递给同一进程中的新线程。每当通过此套接字发生通信时,此线程都会处理它。父进程在任何给定时间调解哪些线程处于活动状态,这可能很多。
另一种可能性是它启动一个新进程并将套接字对象传递给该进程。据我了解,现在由操作系统的套接字系统来调解这些子进程与其目标之间的通信。父进程仍然对进程有一定的控制权,例如杀死挂起的进程和其他进程间通信。
这些方法中哪种更有效取决于操作系统。IIRC,Apache 可以在任一模式下运行。
本质上,套接字库为 Web 服务器提供了一个并行处理级别。它可以处理多个同时连接,主动传输数据,同时接受新连接。
对于一个浏览器,它可以多次尝试连接到一个网络服务器以提高加载时间,并行性也适用于浏览器端,这是一件好事。浏览器在页面加载时会跟踪页面的状态,并且它启动的多次连接尝试都是该过程的一部分。