![同一台机器上的两个不同服务可以在 IPv4 和 IPv6 上使用相同的端口吗?](https://linux22.com/image/1431384/%E5%90%8C%E4%B8%80%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E6%9C%8D%E5%8A%A1%E5%8F%AF%E4%BB%A5%E5%9C%A8%20IPv4%20%E5%92%8C%20IPv6%20%E4%B8%8A%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E7%AB%AF%E5%8F%A3%E5%90%97%EF%BC%9F.png)
假设我有两个 TCP 服务 A 和 B。A 是仅支持 IPv4 的服务,正在监听127.0.0.1:10000
。B 是仅支持 IPv6 的服务,正在监听::1:10000
。我可以在同一台机器上启动这些服务吗?也就是说,IP 端口是如何分配的?按机器分配?按接口分配?按协议分配?等等……
答案1
我假设您正在谈论 TCP 和 UDP 端口。
假设我有两个 TCP 服务 A 和 B。A 是一个仅支持 IPv4 的服务,正在监听
127.0.0.1:10000
。B 是一个仅支持 IPv6 的服务,正在监听::1:10000
。我可以在同一台机器上启动这些服务吗?
是的。
也就是说,IP 端口是如何分配的?每台机器?每个接口?每个协议?等等……
首先,没有“IP 端口”这样的东西。端口是某些传输层协议的功能。特别是 TCP 和 UDP 使用端口号。我相信其他一些协议也使用它们,但我自己只使用过 TCP 和 UDP。
TCP 端口和 UDP 端口完全独立。TCP 服务器和 UDP 服务器可以使用相同的 IP/端口组合。
服务器可以侦听特定的 IP 地址/端口组合,也可以侦听所有地址的端口。后者通过为 IPv4 指定侦听地址 0.0.0.0 或为 IPv6 指定 :: 来指定。如果服务器正在侦听所有地址的端口,则其他服务器无法侦听该端口上的特定地址。
最后,在大多数操作系统上,监听 :: 的服务器可以同时接受 IPv4 和 IPv6 上的连接。有一个名为“IPV6_V6ONLY”的套接字选项可以启用/禁用此行为。此选项的默认设置各不相同。在 Linux 上,默认情况下禁用此选项,但可以通过 sysctl“net.ipv6.bindv6only”进行更改。在 Windows Vista 及更高版本上,默认情况下启用 IPV6_V6ONLY。在旧版本的 Windows 上,单个套接字不可能同时接受 v4 和 v6 连接,想要监听两者的应用程序需要打开两个单独的套接字。
答案2
当您说端口时,我假设您指的是 TCP 和 UDP 中使用的端口。在这种情况下,每个 IP 地址TCP 端口范围为 1-65,535,UDP 端口范围为 1-65,535。
就 IPv6 而言,它使用相同的端口,您只需要[]
在地址周围加上方括号 ( ) 来区分地址部分和端口部分,因为 IPv6 地址以冒号而不是句点分隔。