所有请求如何使用相同的端口连接到Web服务器?

时间:2011-12-16 21:40:47

标签: apache tomcat tcp webserver

Web服务器如何使用相同的端口(80)为其客户端提供TCP连接。对于UDP连接,我知道本身没有连接,因此我们可以让多个客户端将数据包发送到同一端口。如果我尝试在我的localhost上使用已经使用的端口,我会得到BindException。

我看到的一个解决方案是为每个连接启动一个线程,但对于像google / yahoo这样每个服务器中有> 100000个连接的网站来说这不会很麻烦吗?

Web服务器采用哪些解决方案来解决此问题?

3 个答案:

答案 0 :(得分:2)

您只有一个端口可供侦听,但连接有两个端口,连接两侧各一个。这种做法必须是独一无二的。

因此,假设您连接到google.com端口80,那么您的连接将在您的计算机上有一些端口,例如42312和google.com上的端口80。您可以通过 netstat -a 查看您的连接。要获得更短的列表: netstat -an | grep ESTABLISHED“显示所有已建立的连接,而不将其IP解析为名称。

答案 1 :(得分:2)

服务器侦听一个众所周知的端口(80),并在收到请求后将请求委托给工作套接字。这样它就可以满足下一个要求。您可以编写自己的简单服务器来了解最新情况。 Oracle站点有一个很好的示例代码。 [1]

[1] http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServer.java

首先创建一个服务器套接字;

ServerSocket ss = new ServerSocket(port);

然后它在指定端口上列出并在接受请求后创建一个新套接字;

Socket s = ss.accept();

如代码所示,它有一个工作线程池,因此在给定时刻您可以控制服务器在给定时间服务的请求数。其他人在队列中等待可能会。

答案 2 :(得分:1)

AFAIK,Apache will start a new thread for every request,这是像Node.js这样的事件驱动服务器是little faster的一个重要原因。谷歌和雅虎也拥有大量服务器,并在其中传播大量处理负载。罗杰所说的也是有道理的,虽然我不是百分之百确定谷歌在端口42312上输出的确切内容将如何通过端口80到达您的计算机:P