为什么我们需要目标(服务器端)静态 TCP/IP 端口?

网络工程 通讯协议 协议理论 第4层 传输协议
2021-07-27 06:33:40

这可能是一个基于意见的问题,我知道在这里不赞成,但无论如何都在这里。我的问题正如标题所暗示的那样。我可以理解为什么我们需要在客户端上使用临时动态端口,因为它太复杂了,无法处理必须知道每个线程在接收传入数据包时请求什么的过程。

我在网上查过,但找不到我的问题的答案..为什么我们不能代替服务器端的静态端口,而是将协议绑定到服务。例如,Http、Https 绑定到 Web 服务器,SMTP 绑定到邮件服务器等。因此,不是通过 dest 端口(例如 Web 服务的 80)对传入数据包进行多路分解,而是 TCP/ip 过滤第 5 层标头是 Http, FTP、SMTP 等,然后将其转发到该特定服务上。

我可以理解这可能是一个奇怪的问题,但我喜欢在提出使用静态端口的方式之前将其分解并查看是否有任何替代方案。

感谢您的时间 :)

4个回答

由于 HTTP、SMTP 等是应用层协议,因此您需要先对协议进行解码,以便确定应该由哪个服务来处理它。您需要有一个理解所有协议的解码过程,以便将其传递给正确的过程。

每次开发新协议时,您都必须更新此解码功能。

我并不是说你不能那样做,但 TCP/IP 模型使坐下更容易。

第 1 层到第 4 层包括 OS 开发人员在 OS 中实现的网络堆栈,但他们从未真正实现第 5 到 7 层。由应用程序开发人员在其应用程序中提供这些服务。这意味着第 4 层协议没有标准化的方法来了解其上任何层中的内容。

第 2 层协议可以有地址,例如 MAC 地址,第 3 层协议向第 2 层注册,以便第 2 层知道将第 2 层帧的有效载荷发送到哪里,例如以太网在帧中具有 EtherType 字段标题。第 2 层协议不会查看帧负载以了解它是什么,这意味着我们可以将任意数量的第 3 层协议与第 2 层一起使用。

第 3 层协议有地址,例如 IPv4 地址,它们与第 2 层协议具有相同的类型,例如 IPv4 在 IPv4 报头中具有协议字段。第 3 层协议不查看数据包有效载荷以了解它是什么,这意味着我们可以将任意数量的第 4 层协议与第 3 层一起使用。

第 4 层协议具有地址,例如 TCP 端口。应用程序向第 4 层端口注册,表示任何到达该端口的内容都将传送到该端口。第 4 层协议不会查看帧有效载荷以了解它是什么,这意味着我们可以将任意数量的应用程序与第 4 层一起使用。

由于 OS 中没有定义第 5 层,因此第 4 层协议没有标准的方式让第 5 层协议向它们注册,并且第 4 层头中没有字段来注册第 5 层协议。相反,根据共识,某些应用程序使用了众所周知的端口,但这并不意味着与众所周知的应用程序不同的应用程序如果当前未在使用,则不能使用其中一个众所周知的端口. 例如,我可以编写一个使用端口 80(众所周知的 Web 服务器)的应用程序。如果我运行我的应用程序,然后尝试运行 Web 服务器,Web 服务器将无法在众所周知的端口上工作,因为它已在使用中。

没有明确的协议标识符是不可能的,因为许多 TCP 段不会携带任何用于识别协议的信息 - 通过 FTP 或 HTTP 下载文件可能会产生跨多个 TCP 段的非常长的二进制流。

理论上,您可以为所有 TCP 段添加前缀,例如,一个四字符的协议 ID - HTTP、FTP_、SMTP,... - 并省略端口号。

这将需要 OS 堆栈的 TCP 处理程序查看该段,提取这些协议 ID 字符,将它们从该段中删除,并将数据传递给已注册该 ID 的应用程序。

现在,看看缺点:

  • 你已经用四个 ASCII 字节替换了一个两字节的端口号,增加了传输开销
  • 你增加了 TCP 处理程序的处理开销
  • 您已经消除了在不同的编号 TCP 端口上运行多个 HTTP 服务器的可能性

有什么好处?

出于同样的原因,您的邮政地址是静态的 - 所以人们有一个地址可以联系到您。