从NIC卡(物理层)到任何路由(OSPF / RIP / BGP)守护进程,路由协议数据包如何到达(操作stream)?

问题是在多路由协议守护进程正在运行的任何linux / unix设备中丢弃路由协议数据包stream。

从NIC卡(物理层)到任何路由(OSPF / RIP / BGP)守护进程,路由协议数据包如何到达(操作stream)?

你没有指定你在说什么内核。
从BSD的angular度来看,这一切都在“ TCP / IP图解”第2卷:“实施”中加以解释, 由Gary R. Wright,W. Richard Stevens

简短版本如下:

  1. 帧到达NIC的rx描述符环。 通过DMA将其传送到RAM中的RX环。
  2. 驱动程序将RX环中的设备特定描述符转换为某种通用的networking内核结构(例如mbuf / mbuf_clustersk_buff )。 这里数据包也被复制到bpf设备。
  3. ether_input取决于帧的协议和地址族,它被相应的protosw (协议交换)数组条目处理。
  4. 然后在ip_input或者tcp_input / udp_input数据报到达socket层到对应的路由守护进程的so_rcvbuf (套接字接收缓冲区)。
  5. 从这一点开始,路由守护进程通常会通过某种I / O通知工具( select(2) / poll(2) / epoll(7) / kqueue(2) )通知套接字上的待处理数据,并使用recv(3)该套接字提取数据包的有效载荷。 这里(e)glibc / libc / libSystem就是这个地方。
  6. 路由守护进程是神奇的,通过路由套接字(BSD派生中的PF_ROUTE或Linux中的PF_NETLINK的NETLINK_ROUTE )来改变内核的路由表。

路由守护进程和套件操纵内核中的路由表。 因此,数据包不会stream经路由守护进程,而是根据路由表进行路由。

当在路由表中存在两个具有相同特性的选项(最具体的路由总是胜出)时,哪个路由获得优先级,哪个是最好的(最低的) metric (见route )。 在思科土地被称为“ 行政距离” 。 不同的协议,如RIP和BGP,都有默认的度量标准。 我不确定是否有Linux特定的参考,但是如果您查看pipe理距离链接,我会冒险猜测路由守护程序使用相同的优先级。

就路由协议数据包本身而言,它依赖于路由协议,但它们通常使用标准的传输协议。 例如,BGP在端口179上使用TCP / IP会话。因此守护进程将相应地绑定一个套接字。