理解 linux 中的“转发”

sha*_*yan 0 linux routing kernel

linux的哪一部分负责在接口之间“转发”流量?

我知道“ /proc/sys/net/ipv4/ip_forward ”,但是操作系统、内核或模块的哪一部分实际上正在检查此设置并决定是否执行转发?

内核是否坐在那里并且根据路由表无意识地将任何接收到的未寻址到这台机器的数据包转发到另一个接口?

这是我一直想深入了解的一个非常基本的问题。

Dan*_*man 6

linux的哪一部分负责接口之间的“转发”流量?

IP 网络堆栈。所有 IP 协议——UDP、TCP 等——都运行相同的基本路由工具和行为。IPv6 也是如此,它的实现略有不同,但基本相同的架构。

内核是否坐在那里并且根据路由表无意识地将任何接收到的未寻址到这台机器的数据包转发到另一个接口?

是的。除了“无意识”部分,您的意思是“按设计”。

过程很简单:当一台确认IP规范的机器收到一个数据包时,它会做出一些非常简单的决定;基本流程是:

  1. 验证这是一个健全的数据包。
  2. 检查它是否以本地IP地址为目的地,如果是,则在本地交付。
  3. 从路由表中查找下一跳。
  4. 将数据包发送到下一跳,或发送“无法传递”错误。

ip_forward(...)方法作为整个算法的一部分被调用,并且与您想象的一样简单。从根本上说,IP 是一个非常非常简单的协议。