• 重度粉毛厨

    问题

    请快速思考三个问题:

    问题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 在同端口监听时发生冲突。

    主楼
  • 9527-oo

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

    #1
  • marre

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

    和 IPV6_ONLY 是否开启有关系吗?

    #2
  • 重度粉毛厨

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

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

    #3
  • DisplayKing

    0 已经包含所有了 包括 127

    #4
  • listening

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

    #5
  • PJ568

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

    #6
  • 文月

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

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

    #7

发表回复

登录后回复