看来很多人其实不知道Linux上的一个小常识

重度粉毛厨 2026-08-22 15:19 1

问题


请快速思考三个问题:


问题1


一个进程监听了 127.0.0.1:80/tcp

再启动一个进程,监听 0.0.0.0:80/tcp

能成功吗?


问题2


一个进程监听了 0.0.0.0:80/tcp

再启动一个进程,监听 127.0.0.1:80/tcp

能成功吗?


问题3


先将 [fd00::ffff:ff00] 绑定给 lo

启动一个进程监听 [::]:80/tcp

再启动一个进程监听 [fd00::ffff:ff00]:80/tcp

能成功吗?


结论


事实上,以上三个实验都会收到 EADDRINUSE,即 errno 98: Address already in use


因此,对于这个问题而言:



我有个业务需要常驻后台,监听80/443端口。
这个业务仅供本机访问,但是进程本身需要可以访问外网。
鉴于 80/443 是相当常用的端口,直接 bind 0.0.0.0 [::] 显然不合适。
ULA 的 fd00::/8是一个很好的选择,符合 RFC4193 的定义,而且随机一个 /64 子网就基本上不会和其他服务发生冲突。

但是:
如果绑定到 lo,那本质上还会出现与 [::] …


在Linux发行版的默认配置下(即不开启地址或端口重用),只要监听的IP落在当前网络命名空间的网卡下,其他进程就无法避免 Wildcard Address 在同端口监听时发生冲突。

最新回复 (7)
  • 9527-oo 08-22 15:20
    1

    你是种子用户,为啥你的id不会变颜色啊

  • marre 08-22 15:21
    2

    问题三居然也不可以成功吗?


    和 IPV6_ONLY 是否开启有关系吗?

  • 重度粉毛厨 楼主 08-22 15:23
    3

    问题3只是从ULA里面抽了一个地址分配给lo,而监听 wildcard 就会默认涵盖所有在网卡上的地址,其中就包括我们刚刚绑定的这个地址。


    所以绑定到lo是个具有迷惑性的操作,但不改变问题的本质。

  • DisplayKing 08-22 19:32
    4

    0 已经包含所有了 包括 127

  • listening 08-22 19:33
    5

    本质还是不了解计算机网络,理论功底不过关。

  • PJ568 08-22 19:34
    6

    解决了困扰我多个世纪的问题,谢谢佬。

  • 文月 08-22 19:39
    7

    这是linux的知识吗,windows也不能吧


    不能的原因大概是这两个地址存在包含关系?那绑定不同网卡的:80是否可行?

* 帖子来源Linux.do
返回