Answers:
基本上,一次只能在一个端口上监听一个进程(从技术上讲,一个套接字专用于侦听)。但是,一个端口可以处理许多传输数据的套接字,一个套接字是本地IP /端口和远程IP地址/远程端口的组合。这样,服务器在侦听时接受了传入的连接后,便会打开一个专用于该会话的新套接字,并将处理交给其他事务,然后返回侦听。
浏览器从计算机上的随机高端口(即> 1024)连接到远程服务器的端口80。因此,计算机上没有端口冲突。
如果使用许多选项卡连接到同一台远程服务器(或有许多用户连接到该服务器),它们都将进入同一端口并由同一进程(即站点的Web服务器)提供服务。
侦听端口80的服务器没有处理多个进程。较早的简单TCP守护程序一次只能处理一个连接。您可以通过netcat
在特定端口上侦听这样的程序并尝试将两台计算机连接到该端口上来模拟此行为。一个会进入,另一个会在没有连接的情况下反弹。这些守护程序几乎没有用,因此您再也看不到它们了。
对于Web服务器之类的东西,它直接在端口上监听。要记住的事情是它位于操作系统的套接字库的顶部。建立新的连接后,套接字库会将全新的套接字传递给Web服务器软件。此时,Web服务器软件具有一些选项。
一种可能是它在同一进程中将套接字对象传递给新线程。每当通过此套接字进行通信时,此线程将对其进行处理。父进程会在任何给定时间中介哪些线程处于活动状态,这可能很多。
另一种可能性是,它启动了一个新进程并将套接字对象传递给该进程。据我了解,现在取决于操作系统的套接字系统来介导这些子进程与其目标之间的通信。父进程仍对该进程具有一定的控制权,例如杀死挂起的进程和其他进程间通信。
这些方法中哪种更有效取决于操作系统。IIRC,Apache可以在任何一种模式下运行。
本质上,套接字库为Web服务器提供了一定程度的并行处理。它可以在接受新连接的同时处理多个同时进行的连接,从而积极地传输数据。
对于可以增加到Web服务器的多次连接尝试以缩短加载时间的浏览器,并行性也适用于浏览器端,这是一件很好的事。浏览器会在页面加载时跟踪其状态,并且它旋转的多个连接尝试都是该过程的一部分。
您的问题使我想起了我自己,早在思科CCNA之前-有同样的疑问:)
首先,建立多个HTTP连接不一定与您在浏览器中打开的选项卡数量有关。例如,当访问带有广告或Google Analytics(分析)代码的网站时,尽管仅位于一个标签中,您仍将连接到多个网站。
无论如何,当您的浏览器与Web服务器通信时,发送到Web服务器的流量的目标端口是端口80,而源端口是随机数。源端口是为了让Web服务器知道他应该通过哪个端口与您通信。每个建立的HTTP连接都会在您的计算机上打开其自己的端口。尝试在打开几个网站的情况下运行netstat,您将立即明白我的意思。
您可能会笑,但是这本书是了解TCP / IP基础知识的好方法。这对我帮助很大。
recv()
在每个过程中进行尝试。