路由表项中的proto字段

如下的ip命令显示的两条路由,proto的值分别为21和kernel。

/ # ip -d route
unicast default via 192.168.1.1 dev ens33 proto 21 scope global 
unicast 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.118 
/ # 

proto字段的定义如下(部分):

#define RTPROT_UNSPEC   0
#define RTPROT_REDIRECT 1   /* Route installed by ICMP redirects; not used by current IPv4 */
#define RTPROT_KERNEL   2   /* Route installed by kernel        */
#define RTPROT_BOOT     3   /* Route installed during boot      */
#define RTPROT_STATIC   4   /* Route installed by administrator */

proto字段的定义在内核中并没有实质的意义,只是一个显示字段。RTPROT_UNSPEC表示未指定;RTPROT_REDIRECT已经不再使用;内核自身添加的路由使用RTPROT_KERNEL;RTPROT_BOOT为在启动过程中安装的路由;

例如对于RTPROT_KERNEL类型,内核函数fib_magic添加的路由的protocol固定为RTPROT_KERNEL。在为内核接口添加IP地址时,触发此函数,用于添加相关的直连路由。

static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa, u32 rt_priority)
{   
    struct fib_config cfg = {
        .fc_protocol = RTPROT_KERNEL,
        .fc_type = type,
        .fc_dst = dst,
        .fc_dst_len = dst_len,
        .fc_priority = rt_priority,
        .fc_prefsrc = ifa->ifa_local,
        .fc_oif = ifa->ifa_dev->dev->ifindex,

    if (cmd == RTM_NEWROUTE)
        fib_table_insert(net, tb, &cfg, NULL);
}

对于RTPROT_BOOT类型,一方面通过ioctl接口(如route命令)添加的路由proto字段会设置为RTPROT_BOOT;此外,如果使能了IP地址自动配置功能,内核可在启动过程中通过DHCP或者RARP等获取IP地址信息,此时,在添加与之相关的路由时,路由项也会使用RTPROT_BOOT类型。

数值大于RTPROT_STATIC(4)的proto值,不由内核解释。内核只是在路由下发时保存此值,显示时回显此值。目前定义的值如下:

#define RTPROT_GATED    8   /* Apparently, GateD */
#define RTPROT_RA       9   /* RDISC/ND router advertisements */
#define RTPROT_MRT      10  /* Merit MRT */
#define RTPROT_ZEBRA    11  /* Zebra */
#define RTPROT_BIRD     12  /* BIRD */
#define RTPROT_DNROUTED 13  /* DECnet routing daemon */
#define RTPROT_XORP     14  /* XORP */
#define RTPROT_NTK      15  /* Netsukuku */
#define RTPROT_DHCP     16     /* DHCP client */
#define RTPROT_MROUTED  17     /* Multicast daemon */
#define RTPROT_BABEL    42     /* Babel daemon */
#define RTPROT_BGP      186    /* BGP Routes */
#define RTPROT_ISIS     187    /* ISIS Routes */
#define RTPROT_OSPF     188    /* OSPF Routes */
#define RTPROT_RIP      189    /* RIP Routes */
#define RTPROT_EIGRP    192    /* EIGRP Routes */

比如quagga路由程序下发的动态路由(RIP/OSPF/BGP/ISIS)同一使用RTPROT_ZEBRA类型proto值。这也说明这个字段的使用比较混乱。

内核版本 5.0

### 路由表中的字段及其作用 路由表是网络设备用于指导数据包转发的核心结构之一。它包含了多个字段,这些字段共同决定了数据包的目标地址、传输路径以及其他相关信息。 #### 1. **目标网段 (Destination)** 此字段指定了该路由条目所覆盖的目的网络范围。它可以是一个具体的 IP 地址或者一个子网的表示形式(如 CIDR 表示法)。例如,“192.168.1.0/24”代表了一个 C 类子网[^1]。 #### 2. **下一跳 (Next Hop)** 当路由器接收到的数据包不属于直连网络时,需要将其发送到另一个路由器继续处理。“下一跳”定义了这个中间节点的 IP 地址或接口名称。 #### 3. **出接口 (Interface/OIF - Outgoing Interface)** 指出当前路由器应该通过哪个物理或逻辑端口来发送匹配该路由条目的流量。如果目的地属于直连网络,则直接从指定接口发出;否则先传递给“下一跳”的设备再进一步分发。 #### 4. **度量值 (Metric/Cost)** 用来衡量到达特定网络的成本高低的一种数值标准。不同的路由协议可能采用不同算法计算成本,比如 RIP 使用跳数作为唯一依据而 OSPF 则综合考虑带宽等多种因素形成复杂权重体系[^2]。 #### 5. **标志位 (Flags)** 某些实现会提供额外的状态标记帮助区分特殊类型的路由项。例如 Linux 中存在 H 标志表明这是针对单一主机而非整个子网的有效路径[^3]。 #### 6. **优先级/Prefrence Value** 在多条通往同一目标但来源各异(静态配置 vs 动态学习) 的候选方案间做选择时起决定性作用的一项参数。较低数字一般意味着更优选项被采纳执行。 #### 7. **协议源 (Proto)** 指示本条目是由何种方式产生的——可以手动设定好的固定规则即所谓 “Static Route”,也可以自动协商获取自诸如 BGP,EIGRP 这样的高级动态机制。 #### 8. **老化时间 / Age of Entry** 对于那些依赖实时更新维持准确性的项目来说尤其重要。一旦超过预设时限未见任何刷新动作就会被认为失效并予以清除退出工作流程之外。 ```bash # 示例命令查看Linux系统的路由表 route -n ``` 上述内容总结了典型情况下路由表里常见的几个主要组成部分及相关解释说明。需要注意的是具体产品线之间可能存在差异扩展情况,请参照对应厂商文档获得最权威详尽描述版本信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值