Linux TCP/IP协议栈路由部分详解

本文深入探讨了在路由查找过程中如何通过结构体fib_table、fn_hash、fib_node等实现路由信息的查找与匹配,进而生成路由查询结果及目的入口dst_entry,最后详细解释了rtable结构体中关键字段的用途及其与路由类型、多路径算法的关系,旨在提供全面的技术指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 通过在一张路由表(struct fib_table)中,根据查询路由的目的IP地址(key)在其路由哈希表(struct fn_hash)中找到一个路由域(struct fn_zone),并在路由域中匹配到一个key相等的路由节点(struct fib_node),取其路由别名(struct fib_alias)和路由信息(struct fib_info),生成一个路由查询结果(struct fib_result)。

    路由查询结果还不能直接供发送IP数据报使用,接下来,还必须根据这个查询结果生成一个路由目的入口(dst_entry),根据目的入口才可以发送IP 数据报,目的入口用结构体struct dst_entry表示,在实际使用时,还在它的外面包装了一层,形成一个结构体struct rtable。


struct rtable

{
    union
    {
        struct dst_entry dst;
        struct rtable     *rt_next;
    } u;
    struct in_device      *idev;
    unsigned              rt_flags;
    __u16                 rt_type;
    __u16                 rt_multipath_alg;
    __be32                rt_dst;
    __be32                rt_src;
    int                   rt_iif;
    __be32                rt_gateway;
    struct flowi          fl;
    __be32                rt_spec_dst;
    struct inet_peer      *peer;
};


rtable->rt_flags
    一组标志位,按目的入口查询的执行顺序:
    如果路由使用本地环回接口,则rt_flags上加标志RTCF_LOCAL
    如果路由结果类型是广播,则加标志RTCF_BROADCAST和RTCF_LOCAL
    如果结果是组播,则加标志RTCF_MULTICAST和 RTCF_LOCAL,该标志最终决定了目的入口使用哪一个IP数据报输入函数和输出函数
    如果是RTCF_LOCAL,则使用输入函数ip_local_deliver()
    如果是RTCF_BROADCAST或RTCF_MULTICAST,并且带有RTCF_LOCAL标志,并且输出设备不是环回接口设备,则使用输出函数ip_mc_output(),否则使用输出函数ip_output()

rtable->rt_type
    路由类型,如果路由是LOOPBACK,则置类型为RTN_LOCAL,单播路由类型为RTN_UNICAST,如果目的地址为 0xFFFFFFFF,则路由类型为RTN_BROADCAST,如果目的地址是组播地址,则路由类型为RTN_MULTICAST。rt_type跟 rt_flags关系比较密切。

rtable->rt_multipath_alg
    跟路由多路径相关,暂时略过

rtable->rt_dst
    路由的目的地址

rtable->rt_src
    路由的源地址

rtable->rt_iif
    路由的输入设备接口的索引号

rtable->rt_gateway
    路由网关的IP地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值