我的一位老师问了我一个问题。TCP 端口 0 保留用于什么?我做了一些搜索和研究,发现了两个原因:
对于基于 linux 的系统,从程序可以使用的操作系统获取下一个可用端口。就像要求动态分配的端口一样。
不需要端口号的数据包(如 ICMP)在其数据包中使用端口号 0。
但是这些似乎已经演变为可以使用的东西,只是因为端口 0 没有被用于其他任何东西。我在开始时没有发现任何由“IANA”分配的端口 0 的使用。是否有任何正式分配给端口 0 的内容?
我的一位老师问了我一个问题。TCP 端口 0 保留用于什么?我做了一些搜索和研究,发现了两个原因:
对于基于 linux 的系统,从程序可以使用的操作系统获取下一个可用端口。就像要求动态分配的端口一样。
不需要端口号的数据包(如 ICMP)在其数据包中使用端口号 0。
但是这些似乎已经演变为可以使用的东西,只是因为端口 0 没有被用于其他任何东西。我在开始时没有发现任何由“IANA”分配的端口 0 的使用。是否有任何正式分配给端口 0 的内容?
请记住,“保留”资源不是“已分配”资源。仅仅因为它被保留并不意味着它旨在用于任何事情,至少在当前时间。相反,它已被搁置一旁,不应使用,除非另有说明。
来自RFC6335:
Reserved port numbers are not available for regular
assignment; they are "assigned to IANA" for special purposes.
Reserved port numbers include values at the edges of each range,
e.g., 0, 1023, 1024, etc., which may be used to extend these
ranges or the overall port number space in the future.
免责声明:我的回答可以被认为与某些人存在利益冲突,因为我在回答中引用的材料实际上是我最初创建的。
IETF 和 IANA 目前(截至 2019 年)都没有任何实际使用 TCP 端口 0 的记录,但是 Richard Stevens 等人的“UNIX 网络编程”一书。教人们通过绑定到端口 0 来获取动态分配的端口。这种做法在其他几个地方都有记录,包括 Linux 和 FreeBSD 手册页。
目前,Austin Group(开发 POSIX 和 Single Unix Specification 的小组)有一个关于这个等待解决方案的公开错误。
TCP 端口 0在许多套接字 API(尤其是 POSIX 所衍生的公共 Berkeley 套接字 API)中具有特殊含义,用于从堆栈中请求一个临时/动态端口。可能出于这个原因,IANA 保留了该端口,因此一般不使用它。
在实际堆栈中,端口 0 没有特殊含义(其他任何编号也没有)。由于其 API 的使用,它可能(非常)难以投入实际使用。简单地说,没有任何尝试的意义。
请注意,端口仅用于某些传输层协议。ICMP(实际上属于网络层,尽管它像 L4 协议一样被封装)不使用端口。