如何使应用程序使用80端口/HTTP而不与浏览器冲突?

62

如果我理解正确,应用程序有时会使用HTTP来发送消息,因为使用其他端口可能会导致防火墙问题。但是如果不与其他应用程序(如Web浏览器)冲突,这该怎么办?实际上,同时运行多个浏览器时它们是如何不冲突的?它们是否都监视同一个端口并收到通知...可以通过这种方式共享端口吗?

我感觉这是一个愚蠢的问题,但这是我以前从未想过的事情,在其他情况下,我已经看到当两个应用程序配置为使用相同的端口时出现问题。

7个回答

90

有2个端口:一个是源端口(浏览器),另一个是目标端口(服务器)。浏览器向操作系统请求可用的源端口(假设它收到了33123),然后与目标端口(通常为80/HTTP443/HTTPS)建立套接字连接。

当 web 服务器接收到请求后,它会发送一个响应,其中包含80作为源端口和33123作为目标端口。

因此,如果你同时使用2个浏览器访问 stackoverflow.com,则会得到类似于以下内容:

Firefox (localhost:33123) <-----------> stackoverflow.com (69.59.196.211:80)
Chrome  (localhost:33124) <-----------> stackoverflow.com (69.59.196.211:80)

对于并发连接,您似乎是从浏览器的角度进行解释。那么从应用程序的角度呢? - Simcha Khabinsky
6
浏览器是一个应用程序。您能详细说明您的问题吗? - Flavius Stef
1
每个浏览器选项卡也有像那样的单独端口吗? - huync
2
@huync 是的,每个标签页都有一个独立的端口分配。这在这个答案中有很好的解释。 - Daniel Rodríguez

24

传出的HTTP请求不会使用80端口。当应用程序请求套接字时,通常会随机分配一个。这就是源端口。

端口80用于提供HTTP内容(由服务器提供,而非客户端)。这是目标端口。

每个浏览器使用不同的源端口来生成请求。这样,数据包才能返回到正确的应用程序。


但是如果我的客户端/服务器在80端口上通信,如果客户端在80端口上接收到消息(为什么),浏览器不会将其拦截为HTTP内容吗? - Mr. Boy
1
客户端将连接服务器上的80端口,但将使用另一个端口。您可以尝试自己下载服务器上的文件(如YouTube视频),打开命令提示符并输入“netstat”。您的计算机将使用随机端口(如62123)连接到服务器上的80端口。 - Konerak
6
@John,不是的。Web服务器打开80端口,但浏览器有一个不同的、随机分配的端口。如果你的应用程序在80端口通信,则会防止你的应用程序与Web服务器在同一台机器上使用,但你不会对Web浏览造成任何干扰。 - JSBձոգչ
此外,所选择的随机端口保证编号在1024以上,因为1-1024范围内保留了特定的基本服务,如HTTP(S),FTP,DNS等。 - alastairs

9

它是由五元组(IP协议、本地IP地址、本地端口、远程IP地址、远程端口)组成的,用于标识连接。多个浏览器(或者实际上是单个浏览器同时加载多个页面)将都使用目标端口80,但本地端口(由操作系统分配)在每种情况下都是不同的。因此不会出现冲突。


所以在内部,服务器将响应发送回客户端的<本地端口>? - Mr. Boy
在响应中,服务器会交换本地和远程端口以及本地和远程IP地址,因此响应中的本地端口为80,远程端口为<客户端的本地端口>。 - jchl

6
客户端通常选择1024到65535之间的端口。如何处理这些端口取决于操作系统。我认为Windows客户端会为每个新连接递增该值,Unix客户端会选择一个随机端口号。
一些服务依赖于静态客户端端口,例如NTP(123 UDP)。

1024和65535(不是65536) - exoddus

5

浏览器是一种客户端应用程序,您可以使用它来查看通常位于不同计算机上的网页服务器上的内容。

Web服务器监听的是端口80,而不是客户端上的浏览器。


1
我不明白为什么这被踩了。它可能不是最全面的答案,但没有错。 - Ed Graham

5
你需要注意区分“监听端口80”和“连接端口80”的区别。
当你说“应用程序有时使用HTTP发送消息,因为使用其他端口可能会导致防火墙问题”时,实际上是指“应用程序有时会向端口80发送消息”。
服务器正在侦听端口80,并且可以在该端口上接受多个连接。

3
您所说的端口80是服务器上的远程端口,本地浏览器为每个建立的连接打开高端口。
每个连接都有两端的端口号,一个叫做本地端口,另一个叫做远程端口。
防火墙将允许流量到浏览器的高端口,因为它知道该连接是从您的计算机建立的。

本地浏览器为每个建立的连接打开高端口...那么防火墙如何通过呢?防火墙是否默认保留特定范围的端口开放? - Mr. Boy
1
@John:一般来说,防火墙会在客户端首次建立连接时检测涉及的端口和地址,并只要连接保持“活动”,就会自动允许服务器返回的流量通过。 - Dave Costa
防火墙允许任何端口的出站连接。它们通常会阻止大多数端口的入站连接,除非您明确打开它们。 - Tomas Andrle
1
@John 防火墙监视防火墙后面的客户端建立的所有传出TCP连接,并为这些连接打开一个响应的洞。实际上,情况可能比这更复杂,因为大多数防火墙还将执行网络地址转换(NAT),即重写所有传出TCP / UDP数据包的本地IP地址和端口,以使用站点的单个公共IP地址和新的本地端口,在这种情况下,必须对响应的远程端口和IP地址应用反向转换。 - jchl
好的,我明白了......即使你阻止端口X,如果你发送一个请求到远程的80端口并使用本地的端口X,防火墙也足够聪明以允许响应通过。 - Mr. Boy
“阻塞端口X”通常实际上意味着“阻止在端口X上的监听”。此外,防火墙足够智能,只允许来自已建立连接的服务器的流量进入该端口。 - vartec

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