我正在阅读一本关于使用 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
有人知道为什么这些有两个条目吗?我不相信 SSH 或 HTTP 曾经使用过 UDP(通过这个问题确认SSH)。
基本上,这是因为这是从开始分配端口号直到大约 2011 年的传统。例如,参见RFC 6335的§7.1 “过去的原则”:
当然,它们有可能有一天会被取消分配,因为端口 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, bionic) netbase 包是基于 Debian netbase 5.4 的,你可以看到它的更新日志还提到了删除 udp/22。