为什么流行的 TCP 使用服务在 /etc/services 中有 UDP 和 TCP 条目?

six*_*bit 22 linux networking services protocols

我正在阅读一本关于使用 Go 进行网络编程的书。其中一章涉及 /etc/services 文件。在探索这个文件时,我注意到某些流行的条目,如 HTTP 和 SSH,它们都在传输层使用 TCP,还有一个用于 UDP 的条目。例如在 Ubuntu 14.04 上:

ubuntu@vm1:~$ grep ssh /etc/services  
ssh             22/tcp         # SSH Remote Login Protocol 
ssh             22/udp

ubuntu@vm1:~$ grep http /etc/services  
http            80/tcp          www             # WorldWideWeb HTTP            
http            80/udp                          # HyperText Transfer Protocol
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这些有两个条目?我不相信 SSH 或 HTTP 曾经使用过 UDP(这个问题证实了 SSH)。

der*_*ert 29

基本上,这是因为这是从归途的传统时,端口号开始被通过,直到2011年左右见,例如,分配§7.1“过去原理”RFC 6335

TCP 和 UDP 端口在被请求时同时分配

当然,它们可能有一天会被取消分配,因为端口 1023 及以下是“系统端口”,被大多数操作系统特别对待,并且当前分配了该范围的大部分。

而且,顺便说一下,HTTP/3 在 UDP 上运行。虽然它可以使用任何 UDP 端口,而不仅仅是 80/443。所以实际上那些仍然未使用。

就 Debian 而言,/etc/services在 1.0 (buzz 1996) 中已经有了 22/udp

然而,在 2016年的这次提交中被删除,首先在netbase包的5.4 版中发布。

在撰写本文时,Debian (buster) 的最新稳定版本有 5.6 . 最新的 Ubuntu LTS(18.04,仿生)netbase 包基于 Debian netbase 5.4,你可以看到它的更新日志也提到了 udp/22 的删除

  • @SergiyKolodyazhnyy 我不这么认为,因为这种做法早于防火墙。 (4认同)
  • @TobySpeight 这不仅仅是 Linux,这是相关标准的一部分。参见,例如,该 RFC 的 §6。虽然 IANA 也注册了更高的端口,但它们是不同的分类(这在实践中很重要,因为操作系统,而不仅仅是 Linux,如何对待它们)。我会澄清一点。此外,0 不是有效端口。它被套接字 API 用作通配符(告诉内核为您选择一个端口)。 (3认同)
  • “0 不是有效端口”是有问题的。它当然不是我们操作系统上的 * 可用 * 端口(这就是为什么我特地将其称为它的原因,以及为什么它目前被保留,并且不太可能分配给任何东西),但它在协议级别上并不特殊。 (3认同)
  • **虽然它可以使用任何 UDP 端口,而不仅仅是 80/443 ** 这对于任何协议 TCP/UDP 协议来说都是如此,这些只是与每个协议关联的默认端口。大多数使用 TCP 和 UDP 的应用程序不提供指定非默认端口的方法,但 HTTP 允许在 URL 中指定它们,因此更改端口更可行。 (3认同)