我对以下 netstat 输出感到困惑。有两种本地端口。第一个是:
[::]8100
第二个是:
[::1]8100
我知道 [::1] 是 IPv6 的环回地址。我的问题是:
这是什么意思?
预先感谢您的帮助。
我对以下 netstat 输出感到困惑。有两种本地端口。第一个是:
[::]8100
第二个是:
[::1]8100
我知道 [::1] 是 IPv6 的环回地址。我的问题是:
这是什么意思?
预先感谢您的帮助。
::
是未指定地址 ( 0:0:0:0:0:0:0:0
),它仅在数据包中用作还没有地址并试图获得分配地址的主机的源地址。您在输出中看到的内容意味着进程绑定到8100
主机中所有目标地址的端口。
::1
是回送地址 ( 0:0:0:0:0:0:0:1
),发送到该地址的任何内容都将在主机内部回送。您所看到的意味着进程绑定到8100
环回地址上的端口,这意味着发送到该端口上的环回地址的任何内容都将进入该进程。
这两个地址都不能看作是主机外部网络上的目的地址,未指定地址只能用作尚未分配地址但正在寻找地址的主机的源地址。环回地址不应用作主机外部网络上的源地址。
RFC 4219,IP 版本 6 寻址架构在第2.2节中解释了如何压缩这两个地址。地址的文本表示:
由于分配某些类型的 IPv6 地址的某些方法,地址包含零位的长字符串是很常见的。为了更容易地写入包含零位的地址,可以使用特殊语法来压缩零。“::”的使用表示一组或多组 16 位零。“::”在一个地址中只能出现一次。"::" 也可用于压缩地址中的前导或尾随零。
例如以下地址
2001:DB8:0:0:8:800:200C:417A a unicast address FF01:0:0:0:0:0:0:101 a multicast address 0:0:0:0:0:0:0:1 the loopback address 0:0:0:0:0:0:0:0 the unspecified address
可以表示为
2001:DB8::8:800:200C:417A a unicast address FF01::101 a multicast address ::1 the loopback address :: the unspecified address
它进一步解释了未指定地址和环回地址:
2.5.2 . 未指定地址
地址 0:0:0:0:0:0:0:0 称为未指定地址。它绝不能分配给任何节点。它表示没有地址。它的一个使用示例是初始化主机在获知自己的地址之前发送的任何 IPv6 数据包的源地址字段。
未指定的地址不得用作 IPv6 数据包的目标地址或 IPv6 路由标头。IPv6 路由器绝不能转发源地址为未指定的 IPv6 数据包。
2.5.3 . 环回地址
单播地址 0:0:0:0:0:0:0:1 称为环回地址。节点可以使用它向自己发送 IPv6 数据包。它不得分配给任何物理接口。它被视为具有链路本地范围,并且可以被认为是虚拟接口(通常称为“环回接口”)的链路本地单播地址,指向无处可去的假想链路。
环回地址不得用作发送到单个节点之外的 IPv6 数据包中的源地址。目标地址为环回的 IPv6 数据包绝不能发送到单个节点之外,绝不能由 IPv6 路由器转发。必须丢弃在目的地址为环回的接口上接收的数据包。
“::”是 ipv6“未指定地址”(等效的 IPv4 地址是“0.0.0.0”)。绑定套接字*时,它用于指示套接字将侦听所有本地 IPv6 地址。根据操作系统和套接字选项,套接字还可以侦听本地 IPv4 地址。
“::1”是 ipv6“环回地址”(等效的 IPv4 地址是“127.0.0.1”)。仅用于主机内的本地通信。
因此,当您在 netstat 输出的“本地地址”列中看到“::”时,这意味着套接字*正在侦听系统拥有的所有 IPv6 接口,也可能侦听系统拥有的所有本地 IPv4 接口。当您看到 "::1" 时,表示它仅侦听本地环回,因此只能从本地系统访问。
这些地址都不应作为正常流量的源地址或目标地址出现。"::1" 被明确禁止作为源或目标出现。禁止“::”作为目的地出现。它可以作为地址分配协议的一部分作为源出现。具体来说,它用于“重复地址检测”过程。
* 在伯克利套接字意义上的术语。
使用 IPv6,::
扩展到所需的:0:
字数(简称:0000:
)以填充 128 位地址。::
只能在一个地址中使用一次,并且需要明确。
对于 netstat,尾随:abcd
指的是传输层端口号,因此tcp6 ::1:80
表示::1
环回上的 TCP 端口 80 。tcp6 :::80
是对所有本地 IP 地址的通用绑定,即未指定地址。
[::] 是未指定地址。如果程序不想绑定到特定地址而是任何地址,则可以绑定到此地址。
这是netinet/in.h 中的声明
extern const struct in6_addr in6addr_any; /* :: */
如果您有兴趣,可以使用 C 套接字 API 创建小型测试程序。在绑定到 in6addr_any 和 [::1] 或任何其他指定地址之间交替。您将能够复制您观察到的内容。