Linux
為什麼流行的使用 TCP 的服務在 /etc/services 中有 UDP 和 TCP 條目?
我正在閱讀一本關於使用 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 “過去的原則”:
請求時同時分配 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, bionic) netbase 包是基於 Debian netbase 5.4 的,你可以看到它的更新日誌還提到了刪除 udp/22。