TCP客户端如何在握手开始时知道目的端口?

网络工程 通讯协议
2021-07-22 00:16:34

我知道在握手开始时,客户端应该填写该段的目标 IP(对于 IP 层)和目标端口号才能正确传递给服务器。客户端可以通过 DNS 服务获知目标 IP,但是 TCP 如何在握手的第一步知道目标端口号(假设它不是众所周知的端口)?

3个回答

对于大多数应用程序,端口实际上是众所周知的。这些通常由 IANA 维护。然后是产品特定的协议,这些协议不是由 IANA 维护,而是将(默认)端口编码到产品本身中。这些默认值之外的任何端口通常由用户明确指定(例如使用类似http://host:3000/端口 3000的 URL而不是http://host/默认端口 80)。

假设它不是一个众所周知的端口......

然后有一些机制可以动态分配端口,或者使用某种外部机制查找端口。例如 FTP(文件传输协议)使用 TCP 连接进行数据传输,它与仅传输命令的控制连接分开。这些数据连接的端口是动态分配的,然后在控制连接内部使用诸如 PORT、PASV、EPRT、EPSV 之类的命令发送到对等方,以便它知道要连接到哪个端口。类似的机制用于在 SIP(​​一种 VoIP 协议)内交换 RTP 数据(通常是 UDP 而不是 TCP)。此外,某些协议(如 SIP)可能会使用DNS SRV 记录来查找连接到特定服务所需的 IP 和端口。

换句话说:没有找到端口的单一机制。有一些通用机制适用于多个协议(即 IANA 维护、硬编码到产品、SRV 记录中),但也有特定于产品或协议的机制(如在 FTP 中)。要找出实际使用的机制,请查看特定协议。

在握手的第一步,TCP 如何知道目标端口号(假设它不是众所周知的端口)?

通过打开套接字的应用程序告诉 TCP 连接到哪个端口。应用程序需要知道。通常,应用程序只使用“众所周知的端口”——比如用于 HTTP 的 TCP 端口 80。否则,必须配置或指示应用程序使用另一个端口。很少,它只是猜测并尝试各种端口。

首先,了解 TCP 本身对客户端或服务器一无所知,它们是一个应用程序概念。TCP 在对等点之间创建连接。

服务有一些标准的端口分配。这些由 IANA 在服务名称和传输协议端口号注册表中维护

例如,TCP 端口 80 是为 HTTP 保留的。如果 Web 浏览器想要与 HTTP 服务器通信,它会默认将请求发送到 TCP 端口 80。这并不是说 HTTP 服务器不能使用不同的 TCP 端口,但 Web 浏览器需要在尝试之前知道连接 HTTP 服务器正在使用非标准 TCP 端口。