这是我运行时的前几行netstat -nr
:
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 126 0 en0
10.8.0.1/32 10.8.0.17 UGSc 0 0 utun3
当我向外部的任何内容发出请求时,10.8.0.1/32
它都会直接转到物理网关192.168.1.1
。
发往 的请求会怎样10.8.0.17
?这是虚拟的,所以我猜想它是由某种软件处理的。这个问题实际上是两个非常密切相关的问题:
- 我的机器究竟如何知道这
10.8.0.17
意味着什么?换句话说,当它将其视为网关时,下一步是什么?(我希望这是有道理的) - 有没有办法让我检查哪个处理程序可能正在监听对此接口的请求?
答案1
您说网关10.8.0.17
是虚拟的,所以我理解您在计算机上安装了一些创建了虚拟适配器的产品。
此虚拟适配器由驱动程序支持,该驱动程序可以模拟物理适配器。对于操作系统来说,它基本上看起来像一个 网络接口控制器。
这种虚拟控制器没有物理组件,因此无法支持 程序化输入/输出 用于在 CPU 和外设之间传输数据。它更倾向于使用 直接内存访问 (DMA) 与操作系统网络驱动程序通信,通过操作系统分配的共享内存区域传递命令和数据,用于输入和输出。
要找出哪个程序正在监听,这个程序实际上是虚拟适配器的驱动程序。大多数操作系统都有显示已安装适配器详细信息的工具,其中还包括驱动程序以及驱动程序选择公开的信息。一旦识别出驱动程序,就可以知道它属于哪个软件产品。
答案2
这是虚拟的,所以我想象它是由某些软件处理的。
是的,因为它是一个utun*
接口。但请注意,这与它是点对点接口无关(理论上也可以有虚拟以太网类“tap*”接口)。
我的机器如何知道 10.8.0.17 是什么意思?换句话说,当它将其视为网关时,下一步该怎么做?(我希望这说得通)
第一步是完全通用的:
对于“广播”接口(例如以太网或 Wi-Fi),如果指定了网关,操作系统将发送 ARP 或 IPv6 NDP 查询以确定第 2 层地址(MAC 地址),然后发送标头中带有该目标地址的数据帧。
对于“点对点”接口,没有第 2 层,也没有设备可供选择,IP 数据包将按原样发送。如果路由指定网关 IP 地址和PtP 接口,则网关地址只是“展示”而已。
后检查路由表并确定输出接口(和 MAC 地址)后,数据包将进一步传递到该接口的 1 层驱动程序。例如,如果它经过 en0,它将被传递给以太网卡的驱动程序。如果它经过 utun3,它将被传递给实际创建该接口的任何程序。
(通常虚拟接口的使用方式与 Unix 中的管道非常相似。程序只是尝试从设备端读取数据,并且通过 utun3“发送”的任何数据包都将被程序读取。每当程序希望操作系统“接收”数据包时,它都会将数据包写入管道。不过,确切的功能因操作系统而异。)
VPN 程序读取数据包后,会将整个数据包(加密后)放入新的以 VPN 服务器为目的地的数据包(通常是普通 UDP,有时是 TCP)。该数据包将再次经历整个过程。
有没有办法让我检查哪个处理程序可能正在监听对此接口的请求?
我不知道这部分,因为它与操作系统密切相关。其他人可能知道。似乎可以确定这一点使用 ifconfig 的一些神秘选项。(该页面还显示 macOS 上的网络机制似乎比我预期的要复杂得多。)