应用程序如何在不与浏览器冲突的情况下使用端口 80/HTTP?

Posted

技术标签:

【中文标题】应用程序如何在不与浏览器冲突的情况下使用端口 80/HTTP?【英文标题】:how can an application use port 80/HTTP without conflicting with browsers? 【发布时间】:2011-02-26 19:36:09 【问题描述】:

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

我觉得这是一个愚蠢的问题,但我以前从未想过这个问题,而且在其他情况下,当 2 个应用程序配置为使用相同的端口时,我会遇到问题。

【问题讨论】:

【参考方案1】:

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

Web 服务器收到应答后,会发送一个响应,其中源端口为 80,目标端口为 33123。

因此,如果您有 2 个浏览器同时访问 ***.com,您将拥有如下内容:

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

【讨论】:

对于并发连接,您似乎是从浏览器的角度来解释这一点。从应用程序的角度来看呢? 浏览器是一个应用程序。你能详细说明你的问题吗? 浏览器上的每个选项卡是否也有这样的单独端口? @huync 是的,每个选项卡都分配了一个独立的端口。在this answer 中有很好的解释【参考方案2】:

客户端通常选择 1024 到 65535 之间的端口。 这取决于操作系统如何处理。我认为 Windows 客户端会为每个新连接增加值,Unix 客户端会选择一个随机端口号。

某些服务依赖于静态客户端端口,例如 NTP (123 UDP)

【讨论】:

1024 和 65535(不是 65536)【参考方案3】:

传出的 HTTP 请求不会发生在端口 80 上。当应用程序请求一个套接字时,它通常会随机接收一个。这是源端口。

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

每个浏览器使用不同的 Source 来生成请求。这样,数据包就会返回到正确的应用程序。

【讨论】:

但是如果我的客户端/服务器在 80 上通信... 客户端将连接到服务器上的 80 端口,但自己会使用另一个端口。自己尝试一下:从服务器下载文件(例如 youtube 视频),打开提示并输入“netstat”。您自己的机器将使用一个随机端口(如 62123)连接到端口 80 上的服务器。 @John,不。 web 服务器 打开端口 80,但 浏览器 有一个不同的、随机分配的端口。如果您的应用在端口 80 上进行通信,那么您将阻止您的应用在与网络服务器相同的机器上使用,但您根本不会干扰网络浏览。 此外,选择的随机端口保证编号在 1024 以上,因为 1-1024 范围是为特定的基本服务保留的,例如 HTTP(S)、FTP、DNS 等。【参考方案4】:

你说的80端口是服务器上的remote端口,本地浏览器为每个建立的连接打开高端口。

每个连接的两端都有端口号,一个称为本地端口,另一个称为远程端口。

防火墙将允许流量到浏览器的高端口,因为它知道已经从您的计算机建立了连接。

【讨论】:

“本地浏览器为每个建立的连接打开高端口”......那么这如何通过防火墙呢?防火墙是否会默认打开特定范围的端口? @John:一般情况下,防火墙会在客户端第一次建立连接时检测所涉及的端口和地址,只要连接是“活着”。 防火墙允许任何端口上的传出连接。它们通常会阻止大多数端口上的传入连接,除非您明确打开它们。 @John 防火墙监视防火墙后面客户端建立的所有传出 TCP 连接,并为响应这些连接打开一个漏洞。实际上它可能比这更复杂,因为大多数防火墙也会执行网络地址转换 (NAT),即重写所有传出 TCP/UDP 数据包的本地 IP 地址和端口,以使用站点的单个公共 IP 地址和一个新的本地端口,在这种情况下,必须将反向转换应用于响应的远程端口和 IP 地址。 好吧,我明白了……即使您阻止端口 X,如果您使用本地端口 X 向远程端口 80 发送请求,防火墙也足够聪明,可以让响应返回。 【参考方案5】:

标识连接的是(IP 协议、本地 IP 地址、本地端口、远程 IP 地址、远程端口)的 5 元组。多个浏览器(或者实际上是一个浏览器同时加载多个页面)将各自使用目标端口 80,但本地端口(由 O/S 分配)在每种情况下都是不同的。因此没有冲突。

【讨论】:

所以在内部,服务器将响应发送回客户端的 对,在响应中服务器切换本地和远程端口以及本地和远程IP地址,因此响应有本地端口= 80和远程端口= 。【参考方案6】:

您需要小心区分“监听 80 端口”和“连接到 80 端口”。

当您说“应用程序有时使用 HTTP 发送消息,因为使用其他端口容易导致防火墙问题”时,您实际上是指“应用程序有时会向端口 80 发送消息”。

服务器正在侦听端口 80,并且可以在该端口上接受多个连接。

【讨论】:

【参考方案7】:

浏览器是一种客户端应用程序,您可以使用它来查看 web 服务器 上的内容,该服务器通常位于不同的机器上。 Web 服务器是监听 80 端口的服务器,而不是客户端上的浏览器。

【讨论】:

我不明白为什么这被否决了。这可能不是最全面的答案,但没有任何问题。

以上是关于应用程序如何在不与浏览器冲突的情况下使用端口 80/HTTP?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不与 MainActivity 交互的情况下从通知中打开片段页面?

怎么在一台服务器上运行mysql数据库,里面是两个不同软件的数据库,在不改端口的情况下,运行不冲突!

如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道

如何查看Windows下端口占用情况

Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

如何查看Windows下端口占用情况