TCP/IP 协议栈(构成您内核中 TCP/IP 支持的协议驱动程序)通过端口号来区分不同的网络应用程序和会话。 每种需要通过 TCP 或 UDP 协议接受连接的应用程序/守护进程/进程都会被分配一个端口号。
这些端口号的范围是从 0 到 65,536,并且有两组:一组用于 TCP,一组用于 UDP。 换句话说,端口 TCP 2,000 可以被一个进程使用,而 UDP 2,000 可以被另一个进程使用(当然,假设进程 #1 使用 TCP 协议,而进程 #2 使用 UDP)。
端口 0 到 1,023 只能由具有 root 权限运行的进程使用,因此被称为系统端口或特权端口。 互联网号码分配机构 (IANA) 维护着一个官方的端口号分配列表: telnetd 几乎普遍使用 TCP 23,因为 IANA 建议这样做。
请注意,与互联网的许多其他方面一样,这只是一种约定,而不是国际法:没有什么可以阻止程序员编写一个使用 TCP 23 的非 Telnet 应用程序。 不过,如果您扫描一台主机并发现 TCP 23 处于活动状态,那么可以相当肯定地说,那里有一个 Telnet 守护进程正在监听。
端口 1,024 到 49,151 可以被非 root 特权进程使用,也由 IANA 注册(作为“对社区的便利”),并且被称为注册端口。 端口 49,152 到 65,535 可用于私有(未连接到互联网)或动态分配的进程,因此被称为动态或私有端口。
您可能感兴趣的关于 TCP/UDP 端口的最后一点是源端口和目标端口之间的区别。 每个 TCP 或 UDP 数据包都有一个目标端口(即,数据包被发送到的端口号)和一个源端口(即,数据包的原始进程发送数据包所用的端口号,以及远程服务/守护进程的回复应发送到的端口号)。
与目标端口不同,源端口通常(取决于应用程序)由内核在每次事务处理时动态分配。 然后,您系统 /etc/services 文件中的端口分配和服务列表仅适用于本地侦听/目标端口(例如,telnetd),而不适用于本地出站客户端进程的源端口(例如,Telnet)。
某些应用程序(例如 NFS 和 NIS)也使用动态目标端口分配,但那是另一个话题了。