1

我是所有这些 http 和 tcp/ip 事物的初学者。因此,这些问题中可能有很多东西可能没有意义或完全不正确。

首先,我将添加所有我想到的问题,因为我无法将它们放在标题上。

我在 django(python 框架)上工作以进行 Web 开发。

我对服务器的工作方式感到困惑。而目的端口又是如何通过url来决定的呢?

主要问题:到目前为止,我学到的是通过 DNS 我们获得了网站的 IP 地址。端口(目标和源)由 TCP 决定。并通过 TCP 标头发送。但是它如何决定它应该去服务器中的哪个端口(即目标端口)。

我对上述问题的回答:花了很多时间之后,我才知道,http 请求默认为 80,https 默认为 443,类似地,其他类型的请求也默认为某些端口。所以我们可以根据这个计算出IP地址。

但这在我的脑海中提出了另一个问题。

另一个问题:我还建立了一个简单的 django 网站并将其部署在 pythonanywhere 上。但我将它部署为一个完整的应用程序。假设我的 django 应用程序接受不同类型的请求,如 HTTP、HTTPS、SMTP 等。那么这些特定任务的端口将如何决定?因为所有这些请求都将来自单个应用程序,所以它们应该在同一个端口上运行。我认为服务器不会改变应用程序本身的任何内容。那么现在目的港将如何决定呢?

注意:我不确定是否可以在 django 中创建一个接受不同类型请求的应用程序。但这应该是可能的,因为我们可以创建不同的应用程序 - 使用 startapp 并在不同的 url 上运行。

我在哪里读到,它说http的默认端口是80,那么这意味着它也应该可以更改它?

最重要的问题并总结所有疑问 假设我有一个接受不同请求的项目。我想将它部署在服务器上,那么如何将 http 请求和 smtp 请求分开?我是否必须手动制作不同的应用程序,然后部署在不同的端口或其他东西上?如果不是,并且所有东西都在同一个端口上运行,那么这个端口是如何在浏览器中决定的?假设我的域名是 xyz.com 那么服务器上的具体端口如何访问呢?

基本上目的港是如何决定的?

4

1 回答 1

3

正如您已经看到的,协议通常有一个默认分配的端口(80 用于 http,443 用于 https,25 用于 smtp,...)。Internet 上使用的主要协议的端口由 IANA 分配

某些应用程序还默认使用端口(例如,数据库服务 PostreSQL 默认配置为使用端口 5432)。 https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html

大多数时候您可以省略端口,因为您使用的应用程序知道默认值并为您使用它。当您要求 Web 浏览器向http://example.com发送请求时,该请求在后台被发送到http://example.com:80

您可以将应用程序配置为侦听不同于默认端口的端口。人们可能希望出于不同目的这样做(非详尽列表):

  • 出于安全考虑(更改服务使用的端口,使攻击者更难知道该服务存在 - 不使用端口 22 进行 ssh)
  • 因为某些端口范围需要一些特权。您的操作系统需要 root/admin 帐户才能使用 1024 以下的端口(这就是为什么开发工具默认使用一些奇异的端口 - 如 Web 服务器的 8080 或 8000 -,预计使用非管理员帐户)。大多数 ISP 会阻止其 Internet 设备上的端口 25 以防止垃圾邮件。等等。
  • 由于冲突(端口已被占用)

以这种方式更改端口可能需要大量配置(您必须配置服务及其所有客户端)。

现在,问题的另一部分:不同的服务如何使用同一个端口?

如果你想在同一个端口上公开不同的服务,你可以使用反向代理之类的东西。它是一个侦听端口并根据规则重定向流量的应用程序,有时它们提供修改内容的可能性(仅举几例:Traefik、Caddy。一般 Web 服务器也具有反向代理功能:Nginx、Apache 和mod_proxy,...)。

例如,假设您有 2 个 Web 应用程序,并且您希望它们可以在端口 80 上访问。您可以将这些应用程序配置为使用不同的端口(例如 8080 和 8081),让反向代理侦听端口 80 并基于重定向请求在使用的 url 上(它可以重定向app1.example.com:80localhost:8080app2.example.com:80localhost:8081)。只有端口 80 必须可以从外部访问。

于 2021-11-06T10:00:13.967 回答