问题在于在运行多个路由协议守护进程的任何 Linux/Unix 设备中重新设置路由协议数据包流。
任何路由协议数据包如何从 NIC 卡(物理层)到达任何路由(OSPF/RIP/BGP)守护进程(操作流)?
答案1
你没有指定你谈论的是什么内核。
从 BSD 的角度来看,这一切都在TCP/IP 图解,第 2 卷:实施,作者:Gary R. Wright、W. Richard Stevens
简短版本如下:
- 帧到达 NIC 的 rx 描述符环。通过 DMA,它被传输到 RAM 中的 RX 环。
- 驱动程序将 RX 环中的设备特定描述符转换为某种通用网络内核结构(例如
mbuf
/mbuf_cluster
或sk_buff
)。此外,此处数据包被复制到bpf设备。 - 根据
ether_input
帧的协议和地址系列,它由相应的protosw
(协议交换机)数组条目进行处理。 ip_input
然后,或tcp_input
/udp_input
数据报到达套接字层后,到达相应的路由守护进程so_rcvbuf
(套接字接收缓冲区)。- 从此时起,路由守护进程通常会通过某种 I/O 通知工具获得有关套接字上待处理数据的通知(选择(2)/民意调查(2)/epoll(7)/kqueue(2)) 及其用途接收(3)在该套接字上提取数据包的有效负载。这里
(e)glibc
/libc
/libSystem
代替了它。 - 路由守护进程发挥它的魔力,通过路由套接字改变内核的路由表(PF_路线在 BSD 衍生品中或PF_NETLINK的NETLINK_ROUTE在 Linux 中)
答案2
路由守护进程和套件操纵内核中的路由表。因此数据包不会流经路由守护进程,而是根据路由表进行路由。
当路由表中有两个同等特定性(最特定的路由总是获胜)的选择时,哪条路由具有优先级,则选择最佳(最低)的路由metric
(请参阅route
)。在 Cisco 领域中,这称为“管理距离。不同的协议(例如 RIP 和 BGP)都有默认指标。我不确定是否有 Linux 特定的参考资料,但如果您查看管理距离链接,我会猜测路由守护进程使用相同的优先级。
至于路由协议数据包本身,这取决于路由协议,但它们通常使用标准传输协议。例如,BGP 在端口 179 上使用 TCP/IP 会话。因此守护进程只需相应地绑定套接字即可。