这些文件是包含 IP 协议号、别名和服务映射的数据库。作为一名用户,我通常不会与任何人互动直接的方式,但是需要创建特殊的 Linux/GNU 发行版,并且我注意到 perl 测试套件由于无法从 /etc/protocols 数据库中获取所需的数字而失败,因为它不存在于我的自定义系统中。
例如,从我选择的桌面发行版(SMP Debian 4.17.17-1 (2018-08-18) x86_64 GNU/Linux):
/etc/protocols 声称是根据 IANA 列表创建的。
# Internet (IP) protocols
#
# Updated from http://www.iana.org/assignments/protocol-numbers and other
# sources.
# New protocols will be added on request if they have been officially
# assigned by IANA and are not historical.
# If you need a huge list of used numbers please install the nmap package.
/etc/services 也是如此。
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, officially ports have two entries
# even if the protocol doesn't support UDP operations.
#
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.
事实上,他们提供的数据看起来来自指定来源(但不是全部,这些数据库似乎是部分的)。这种特殊性让我完全困惑。
有 posix 函数调用来访问它们 - getprotoent(3),IEEE Std 1003.1-2008 对此进行了如下描述:
endprotoent、getprotobyname、getprotobynumber、getprotoent、setprotoent - 网络协议数据库函数
这些函数应检索有关协议的信息。该信息被认为存储在可以顺序或随机访问的数据库中。该数据库的实现未指定。
格式相对简单,提供这些文件会很好,但我不想在没有正确理解的情况下手动填充数据库或复制其他工作:是否有任何类型的中央源?谁负责填写数据库?
- 公开 getprotoent(3) 调用并因此定义格式(如 glibc)的库?
- 当前 POSIX 规范中是否有指定的标准内容图像?
- 它属于哪个发行版维护者?
- 或者完全是其他人/事?
答案1
由于您正在创建自己的发行版,因此您对安装的文件/etc/protocols
和文件的内容负责。/etc/services
控制协议和服务编号分配的机构是 IANA,如您引用的文件头中所述;相应的列表可在其网站上找到,协议号和服务名称和端口号。然而,分发维护者通常会添加已使用但尚未提交给 IANA 或尚未批准的条目,并删除他们认为已过时的条目。对于 Debian,这两个文件的源位于存储netbase
库。
POSIX 定义了可用于检索协议和服务信息的函数,但它没有指定如何存储或检索数据,如您的引用中所示:
该数据库的实现未指定。
数据库中包含的信息也未指定; POSIX 仅有效地对模式强加要求。