互联网号码分配机构 (IANA) 建议动态或专用端口的范围为 49152 到 65535。许多 Linux 内核使用端口范围 32768 到 61000。
尽管似乎与 IANA 建议的范围存在一些历史偏差,但 Windows Vista、Windows 7、Windows Server 2008、FreeBSD 4.6+ 和许多其他操作系统都同意这个范围,而 Linux 仍然脱颖而出,这似乎很尴尬。
但仔细研究一下,你瞧:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
为什么Linux没有采用标准范围?
答案1
曾经有一段时间,IANA 只分配最多 1023 个端口。请参阅RFC1700。一度这是一个标准。大多数时候,我可以毫不费力地发现 RFC 流中的情况何时发生变化,但对于将端口从 1024 更改为 49152 从注册到分配的问题,我却遇到了困难。
就 Linux 历史而言,2007 年有人提出了关于默认 ip_local_port_range 的问题。当时决定使用您提到的 Linux 范围,因为担心高端口号可能会导致问题,并且从 49152 开始的范围可能会留下太少的端口号。池中的端口号。看这及其线程。当时表达的想法是,从 32768 开始,即使不完全符合 IANA 程序的精神,也是符合的。在阅读本文时,我推断开发人员假设大多数分配将从范围的底部开始并向上移动。在撰写本文时,我统计了 32768 到 49152 之间分配的端口号(不包括单独的不同协议)略多于 100 个,因此在过去五年中这一情况一直保持得很好。
我不知道为什么范围被认为太小,但我可以想象两个原因:
- 端口号是随机的以阻止某些攻击。池中的地址越多,这种防御的效果就越好。
- 高活动服务器可能会遇到端口号耗尽的问题。虽然端口可能是短暂的,但它们的使用不是即时的。特别是,套接字在 TCP 关闭后可以持续几分钟。
这博客文章谈到了第二点,并在您希望 Linux 系统使用不同范围的本地端口时提出了一个答案。 (使用 /etc/sysctl.d 定义您喜欢的范围。如果出现特定冲突,还有一个 ip_local_reserved_ports 条目可能有用。这些条目与您引用的 /proc/sys 条目相匹配。)
总之。 Linux默认值不符合当前的 IANA 规范,但任何特定的 Linux 系统都可以(如果其所有者愿意)。