两个浏览器如何同时监听端口80?

17

我尝试使用程序将套接字绑定到80端口时出现错误,但是两个浏览器如何同时监听同一端口80呢?


21
服务器监听,浏览器连接... - miku
1
当端口80有连接时,两个程序中哪一个应该回答? - Álvaro González
1
@Alvaro 这不是套接字的工作方式。 - anon
@Neil:你是什么意思?端口是套接字层决定哪个应用程序应该接收连接的方式。 - erikkallen
但是,从答案中可以明显看出,浏览器不会在80端口上监听。 - erikkallen
7个回答

24

浏览器不会监听端口80,HTTP服务器会(虽然这只是一种约定,你可以轻松地使用端口80来搭建FTP或telnet服务器)。

在TCP/IP中,“会话”必须是唯一的,而“会话”被定义为5元组(协议,源IP,源端口,目标IP,目标端口)。这允许数据包在互联网上正确路由。

通常,当客户端尝试联系服务器时,它将其源端口指定为0,这意味着操作系统将分配一个未使用的端口。这意味着客户端实际上将监听端口,而不是端口80

因此,当您的浏览器访问Microsoft的网页时,您可能会获得以下属性的会话:(TCP,mybox.com,1101,www.microsoft.com,80)

如果您发现无法将服务器绑定到端口80,则很可能是因为您已经有一个在该端口上运行的服务器,或者您的程序没有必要的特权来绑定该端口(小于1024的端口通常被视为特权端口)。

运行netstat -a(在Linux Windows上)将告诉您是否有服务器绑定到端口80。查找在端口80上的监听器(如果它正在将端口解析为服务名称,则是http),类似于:

tcp  0  0  localhost:http  *:*  LISTEN

你将会话列为5元组(协议,源IP,目标IP,源端口,目标端口),但是你给出的例子是(TCP,mybox.com,1101,www.microsoft.com,80)。难道不应该是(TCP,mybox.com,www.microsoft.com,1101,80)吗? - Jon McClung
2
@Jon,谢谢你。元组并不是我自己想要按任何方式排序的,它只是识别会话所需的信息。我会修复它以保持一致性,因为你绝对正确,这可能会引起混淆。 - paxdiablo

20
他们不监听80端口,而是与80端口通信,如果使用SSL则为443(或任何其他端口,如果管理员违反惯例,则可能会看到像http://www.site.com:8080这样的URL,其中站点已设置在端口8080上)。
浏览器将从一个随机高端口发出请求,因此可以同时使用多个浏览器。
如paxdiablo所说,您可以使用netstat查看哪些程序正在侦听连接(使用"netstat -a -b"将显示哪个可执行文件绑定到哪个端口)。

8
浏览器实际上不监听80端口,而是由Web服务器执行此操作,浏览器使用49152到65535之间(我认为是动态端口)的端口打开连接。

4
在网络连接中,通常有一个对等方(称为客户端)连接到另一个对等方(称为服务器)。服务器被认为正在监听某个端口,而客户端被认为正在连接到该端口。
在这种情况下,Web 服务器在端口80上进行监听,而所有客户端(浏览器)都连接到它。

3
浏览器实际上并没有绑定到80端口。您可能会发现,您还在运行IIS或其他绑定了端口的Web服务器,这就是导致问题的原因。

3
当浏览器连接服务器时,它绑定到本地的非特权端口,但是连接到Web服务器的80端口。当服务器发送响应时,它会发送到浏览器计算机上的非特权端口。如果同一台计算机上有两个浏览器,它们将绑定到不同的端口。

0

如果您的意思是“如何让两个服务器监听端口80”,请考虑使用HTTP Server API。 两个服务器都可以注册一个回调函数,以及一个URL。客户端可以根据URL决定调用哪个服务器。

http://localhost/Service1 会到指定了 "http://localhost/Service1" 作为其URL 的服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接