SS 和其他网络程序如何从端口号查找端口名称?

SS 和其他网络程序如何从端口号查找端口名称?

SS、netstat 和 tcpdump 等程序在识别时都会将端口号转换为名称。因此,作为示例,端口 22 上的连接将显示为“ssh”。

我想知道这个映射是如何完成的?我假设这些程序不是每个都硬编码映射列表?是否有一个中央程序或服务负责帮助网络将端口号映射到名称?

相关问题,当我在同一版本的linux(6.9,所以有点旧)上运行SS时,我得到了不同的行为。在虚拟机上,我正在测试命令“ss -a”,列出了端口 11001 上的程序;在具有相同操作系统和命令的裸机上,端口被列为 metasys。修复我的脚本来解决这个问题很容易,但我很好奇为什么一个服务可以识别端口 11001,而另一个则不能。

答案1

通常使用getservbyport()API,它是名称服务框架。

它与将 IP 地址解析为主机名、将用户名解析为用户 ID 等的函数系列相同。

getservbyport()通常会查看/etc/nsswitch.conf(其中列出了每个类别要使用的数据库),以获取 的条目services

如果 的条目services显示files,则将使用该/etc/services文件作为平面文本文件,就像提到的(用户数据库)/etc/passwd一样。filespasswd

您可以拥有其他形式的数据库。在 GNU 系统上,如果有xyz列出的数据库,将使用libnss_xyz.so按需加载的共享库对其进行查询。

除此之外,files常见的还有db、、、...nisnisplusldap

在简单的部署中,通常只有files, 所以/etc/services

相关内容