我有一种困惑,当我从我的电脑请求某个网页时,让我们说www.example.com然后我的电脑会向DNS服务器发出请求以找到目的地的IP地址,它将绑定源ip,目标IP和源端口,用于查找请求网页的应用程序。我的问题是,如果我从chrome请求(让我们说),那么它已经有一个与之关联的特定进程ID。为什么我们不使用该进程ID而不是端口地址?我知道套接字ID应该关联,因为它标识了在此示例中在chrome内部运行的不同应用程序。 对不起,如果我的概念错了。
答案 0 :(得分:0)
端口是服务的逻辑ID。您可以通过打开/ etc / services在Unix系统上看到这些端口ID。以下是定义SMTP端口的几行示例:
smtp 25/udp # Simple Mail Transfer
smtp 25/tcp # Simple Mail Transfer
这些服务众所周知。他们没有变化。相反,处理服务(如SMTP)的守护程序的进程ID会有所不同,最有可能在重新启动后很可能会在服务器启动的单个实例中发生变化(例如,管理员停止并重新启动它将导致它获得一个新的进程ID)。
服务ID /端口必须是唯一的,以便应用程序可以指定服务器上应该发送的数据包的位置。这只是一种简短的说法,可以将我的数据包发送到这个应用程序/服务"。 ID可以是字符串或名称,例如" webserver"," emailserver"," ftpserver"但这不会像发送的短整数ID那样有效,但它实际上是相同的概念 - 无论是字符串还是id,它都标识了一个服务。
好吧,你可能会问,如果你有一个服务(有点像DNS),你打电话来说"给我一个smtp服务器的进程ID"?首先,为什么这样做,你可以说"发送到smtp服务器"开始?您可以通过在发送的每个数据包中嵌入端口号来实现这一点(它是客户端发送的每个TCP / UDP数据包中的一个字段)。其次,该进程ID必须在客户端会话期间有效,但正如我所提到的,可以停止并重新启动进程,这意味着服务的进程ID可能会发生变化。因此,使用静态的,商定的端口号;流程ID最好效率低下(因为你需要查找它们才能找到它们),更糟糕的是不可靠(因为流程ID会发生变化)。
IP地址告诉您路由数据包的机器/主机(将发送到SMTP)。机器的IP地址可能会发生变化,这也是您需要DNS之类的名称(例如,www.google.com)转换为IP地址的原因之一。相比之下,服务的数量text file with IANA port number assignments足够小,可以在每个主机上本地表示(例如在/ etc / services中),不需要某种查找服务(更不用说端口号通常只是某些东西)该服务的程序员或客户的程序员需要知道)。
通过类比,每个人的家都在不同的街道地址/城市。这就是IP地址提供的一种在Internet上查找服务器/主机的方法。 DNS就像要求服务回答问题" Joe Smith的地址是什么?"。
现在我们可以找到家,我们需要就家中房间的术语达成一致。按照惯例,每个人都称他们的卧室为“卧室”。这类似于将服务器内的服务标识为端口号。
服务器端的众所周知的服务端口,以及客户端如何解决它。如果您询问如何为客户端连接分配端口,或者询问由绑定到特定客户端的服务器的子级或线程建立的连接(通常,服务器将生成子进程的线程并执行事务通过与监听客户端的连接不同的连接,然后经常使用临时端口(在特定的指定范围内)。在这种情况下,客户端和服务器并不特别关心端口号,因为他们已经找到了彼此,可以这么说,这些端口号会有所不同,并且实际上是随机的(至少对客户端和服务器使用它们)。但是,这些端口号不能真正随机,因为它们可能与众所周知的服务使用的端口分配或可由未在IANA注册的服务明确使用的端口范围冲突。它们来自IANA为此目的预留的保留范围。仅使用进程的PID不能确保端口不会与另一个端口冲突,或者在为此目的分配的范围内。