进程 ID 而不是端口地址

Process ID instead of port Address

我有一个困惑,当我从我的电脑请求某个网页时,让我们说 www.example.com 然后我的电脑将向 DNS 服务器发出请求以查找目标的 IP 地址,它将绑定用于查找哪个应用程序在那里请求网页的源 ip、目标 ip 和源端口。我的问题是,如果我从 chrome 请求(让我们说),那么它已经有一个与之关联的特定进程 ID。我们为什么不使用那个进程 ID 而不是端口地址呢?我知道应该关联套接字 ID,因为它在本例中标识 chrome 内的不同应用程序 运行。 如果我的概念有误请见谅。

端口是服务的逻辑标识。你可以通过打开 /etc/services 在 Unix 系统上看到这些端口 ID。下面是定义 SMTP 端口的几行示例:

smtp 25/udp # Simple Mail Transfer smtp 25/tcp # Simple Mail Transfer

这些服务众所周知。它们没有变化。相反,处理服务(如 SMTP)的守护程序的进程 ID 会有所不同,很可能会在重新启动时发生变化,并且很可能会在服务器启动的单个实例中发生变化(例如,管理员停止并重新启动它会导致它获取新的进程 ID)。

服务 ID/port 必须是唯一的,以便应用程序可以指定服务器上接收到的数据包应该发送到哪里。这只是 "send my packets to this application/service" 的简写方式。 ID 可能只是一个字符串或名称,例如 "webserver"、"emailserver"、"ftpserver",但发送时效率不如短整数 ID,但实际上是相同的概念 - 无论是字符串还是 id,它标识一个服务。

嗯,您可能会问,如果您有一个服务(有点像 DNS),您打电话说 "give me the process ID of the smtp server" 会怎么样?首先,既然可以直接说 "send this to the smtp server",那为什么还要这样做呢?您可以通过在发送的每个数据包中嵌入端口号来做到这一点(它是客户端发送的每个 TCP/UDP 数据包中的一个字段)。其次,该进程 ID 必须在客户端会话期间有效,但正如我提到的,进程可以停止和重新启动,这意味着服务的进程 ID 可以更改。因此,使用静态的、商定的端口号;进程 ID 充其量是低效的(因为您需要进行查找才能找到它们),更糟糕的是根本不可靠(因为进程 ID 会更改)。

IP 地址告诉你什么machine/host 路由数据包(目的地是要发送的 SMTP)。一台机器的 IP 地址可以改变,这就是为什么你需要像 DNS 这样的东西来将一个名字(例如,www.google.com)翻译成一个 IP 地址的原因之一。相比之下,服务的数量 text file with IANA port number assignments 足够小,可以在每个主机上本地表示(例如 /etc/services ),不需要某种查找服务(更不用说端口号通常只是服务或客户端的程序员需要注意的事情)。

以此类推,每个人的家都在不同的街道address/city。这就是 IP 地址提供的,一种在 Internet 上查找 server/host 的方法。 DNS 就像要求服务回答问题 "what is the address of Joe Smith?".

现在我们可以找到房源了,我们需要就房源内房间的术语达成一致。按照惯例,每个人都称自己的卧室为"bedroom"。这类似于将服务器内的服务标识为端口号。

关于服务器端众所周知的服务的端口,以及客户端如何寻址到此为止。如果您询问如何为客户端连接分配端口,或者询问由绑定到特定客户端的服务器的子进程或线程建立的连接(通常,服务器将生成子进程的线程并执行事务通过与侦听客户端的连接不同的连接),则经常使用临时端口(在特定的分配范围内)。在这种情况下,客户端和服务器并不特别关心端口号,因为它们已经找到了对方,可以这么说,并且这些端口号会变化并且实际上是随机的(至少对于使用它们的客户端和服务器而言) .然而,这些端口号并不是真正随机的,因为它们可能与众所周知的服务使用的端口分配或未在 IANA 注册的服务明确使用的可用端口范围发生冲突。它们来自 IANA 为此目的预留的保留范围。仅使用进程的 PID 并不能确保端口不会与另一个端口冲突,或者在为此目的分配的范围内。