最终生成的IP数据报的路由称为目的入口(dst_entry),目的入口反映了相邻的外部主机在主机内部的一种“映象”,目的入口在内核中的定义如下:
    struct dst_entry
    {
        struct dst_entry        *next;
        atomic_t    __refcnt;
        int         __use;
        struct dst_entry    *child;
        struct net_device   *dev;
        short   error;
        short   obsolete;
        int     flags;
#define DST_HOST        1
#define DST_NOXFRM      2
#define DST_NOPOLICY    4
#define DST_NOHASH      8
#define DST_BALANCED    0x10
        unsigned long   lastuse;
        unsigned long   expires;
        unsigned short  header_len;
        unsigned short  trailer_len;
        u32         metrics[RTAX_MAX];
        struct dst_entry    *path;
        unsigned long       rate_last;
        unsigned long       rate_tokens;
        struct neighbour    *neighbour;
        struct hh_cache     *hh;
        struct xfrm_state   *xfrm;
        int         (*input)(struct sk_buff*);
        int         (*output)(struct sk_buff*);
#ifdef CONFIG_NET_CLS_ROUTE
        __u32           tclassid;
#endif
        struct  dst_ops         *ops;
        struct rcu_head     rcu_head;
        char            info[0];
    };
    __refcnt是目的入口的引用计数,创建成功后即设为1。__use是一个统计数值,该目的入口被使用一次(发送一个IP数据报),__use就加1。
    dev是该路由的输出网络设备接口,flags是标志位,其取值可以是DST_HOST,DST_NOXFRM,DST_NOPOLICY,DST_NOHASH,DST_BALANCED(用在路由有多路径的情况下)。
    lastuse是一个时间值,每次目的入口被用于发送IP数据报,就将该值设置为当前系统时间值。该值被用于几个地方,路由缓存表 myrt_hash_table是一个很大的数组(依据系统的内存大小而定),每一项都是一个struct rtable的链表,当要往缓存表的某一个链表中插入一个新的struct rtable时,如果这个链表的长度已经超出ip_rt_gc_elasticity(值为8),则需要删掉一个当前使用价值最低的,已保持链表长度的平 衡。函数rt_score就是用于为每个struct rtable计算价值分数,分数是一个32位值,最高位表示非常有价值,当struct rtable的成员rt_flags上有标志RTCF_REDIRECTED或RTCF_NOTIFY,或者目的入口的超时时间未到时,置该位,次高位价 值次之,余下的30位由lastuse决定,该目的入口距上次使用时间越长,价值越低。另外,用于在rt_may_expire函数中判断一个 struct rtable是否超时。
    expires是一个超时时间值,定时器rt_periodic_timer定期扫描路由缓存表rt_hash_table,如果发现expires值为0,或者小于当前系统时间值,并符合其它超时条件,则把该路由从缓存表中删除。
    neighbour是为该路由绑定的邻居节点,详细分析见arp部分。
    hh是硬件头缓存,ARP解析得到的邻居的mac地址缓存在这里,再次发送IP数据报的时候,就不需要再到ARP缓存中去取硬件头。
    input和output分别是该目的入口的输入和输出函数。

前面讲到通过在一张路由表(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的定义如下:
    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;
        __u32       rt_dst;
        __u32       rt_src;
        int         rt_iif;
        __u32           rt_gateway;
        struct flowi    fl;
        __u32           rt_spec_dst;
        struct inet_peer    *peer;
    };
    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。
    rt_type是路由类型,如果路由是LOOPBACK,则置类型为RTN_LOCAL,单播路由类型为RTN_UNICAST,如果目的地址为 0xFFFFFFFF,则路由类型为RTN_BROADCAST,如果目的地址是组播地址,则路由类型为RTN_MULTICAST。rt_type跟 rt_flags关系比较密切。
    rt_multipath_alg跟路由多路径相关,暂时略过。rt_dst是路由的目的地址,rt_src是路由的源地址,rt_iif是路由的输入设备接口的索引号。rt_gateway是路由网关的IP地址。
    在试验环境中,网络设备接口mylo的IP地址是127.10.0.1,它在内核中的表示是struct net_device myloopback_dev,测试程序往IP地址127.10.0.1发送DUMMY协议的数据报,协议栈为其生成的路由目的入口如下:
    the dst_entry:
        the dev name: mylo
        the error: 0
        the obsolete: 0
        the flag: DST_HOST
        expires: 0, now: 110343
        header len: 0
    rt_flag: RTCF_LOCAL
    rt_type: RTN_LOCAL
    rt_dst: 127.10.0.1
    rt_src: 127.10.0.1
    rt_iif: 4
    rt_gateway: 127.10.0.1
    rt_spec_dst: 127.10.0.1
    试验环境中的网络设备接口eth0的IP地址是172.16.48.2,测试程序往该IP地址所在子网内的IP地址172.16.48.1发送DUMMY协议的数据报,协议栈为其生成的路由目的入口如下:
    the dst_entry:
        the dev name: eth0
        the error: 0
        the obsolete: 0
        the flag: DST_HOST
        expires: 0, now: 850858
        header len: 0
    rt_flag: 0
    rt_type: RTN_UNICAST
    rt_dst: 172.16.48.1
    rt_src: 172.16.48.2
    rt_iif: 2
    rt_gateway: 172.16.48.1
    rt_spec_dst: 172.16.48.2

目的入口(dst_entry)相关推荐

  1. struct dst_entry *dst

    /usr/src/linux-2.6.19/include/net/dst.h 最终生成的IP数据报的 路由称为目的入口(dst_entry),目的入口反映了相邻的外部主机在本地主机内部的一种&quo ...

  2. dsr testbed源代码学习笔记

    一. Linux系统内核接收以太帧的处理程序 1. 前言: 以太头中除了6字节目的MAC地址.6字节源MAC地址外,还有两字节的以太帧类型值 ,如IPv4为0x0800,ARP为0x0806等,网卡驱 ...

  3. java如何找到程序入口_系统分析---入门(如何确定java应用的入口)

    一.场景 小A拿到一个java的开源项目(如eclipse项目),此开源项目可以启动,并且已经拿到了该项目的源码,小A想对这个开源项目进行一次系统的学习. 二.问题: 这时候,小A遇到了一个问题,如何 ...

  4. linux定时器tinner,第三章 套接字相关数据结构--基于Linux3.10

    本章是对socket通信过程中使用到的比较重要的据结构罗列和意义的阐述,在阅读其它层的代码前,先来看几个重要的数据结构,这几个数据结构贯串四层模型. 3.1 socket对应的内核结构体 在用户空间使 ...

  5. 以太网数据包、IP包、TCP/UDP 包的结构(转)

    源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...

  6. 【案例】爆老师拆解同步网络seo分析思路

    小伙伴们好,这个提案是2年前做的,但诊断内容和策略并不过时.趁这次机会和大家聊聊[SEO项目管理]理念下的SEO吧. 首先,这份提案为简版,是我参加一个演讲会时帮赞助商快速的诊断报告,平时在实际项目操 ...

  7. Maven 配置文件 POM 的常用插件配置代码

    Maven 配置文件 POM 的常用插件配置代码 普通 将 Maven 多模块依赖集成打进一个 JAR 包(方法 1) 将 Maven 多模块依赖集成打进一个 JAR 包(方法 2) 生成单入口类 J ...

  8. 微信公众号消息模板开发

    为什么80%的码农都做不了架构师?>>>    ##背景 新需求,需要在订单的时候给用户,商家,配送员发送想对于的微信消息模板,之前没有做过微信公众号相关的开发,这次就一并熟悉吧 # ...

  9. Spring Cloud综合实战 - 基于TCC补偿模式的分布式事务

    2019独角兽企业重金招聘Python工程师标准>>> 本文通过使用Spring Cloud和Docker构建了一个常见的Microservice体系. Spring Cloud为开 ...

最新文章

  1. LINUX自旋锁详解2
  2. 数据与程序分离——程序中那些表的事儿
  3. 99%的人都会用错或者不会看的N折验证
  4. 26 行 ABAP 代码使用 HTTP_GET 函数下载百度网站的首页数据
  5. junit4进行单元测试
  6. docker web程序本地化_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...
  7. 炒了8年的概念,到底该如何理解DevOps这个词?
  8. ***性测试是一种特殊的信息安全服务
  9. [福大软工] Z班 团队第一次作业—团队展示成绩公布
  10. copy linux file to mac,Mac Linux互相传递文件
  11. HTML将广告关闭的JS代码,js实现可关闭的对联对联广告代码广告效果代码
  12. LBS计算两坐标的距离
  13. Fortigate(飞塔)防火墙密码恢复
  14. 将静态html网页部署至华为云
  15. 金彩教育:提升产品标签的方法
  16. ACM-ICPC 2016 沈阳赛区现场赛 I. The Elder HDU 5956(斜率DP)
  17. 解密七种html网页加密解密法
  18. 绘真妙笔千山怎么在电脑上玩 绘真妙笔千山安卓模拟器教程
  19. amc 美国数学竞赛能用计算机吗,美国数学竞赛AMC的三种级别
  20. H3C HCL模拟器 MPLS ipv4/ipv6双栈实验

热门文章

  1. matlab 倾斜矫正,matlab图像倾斜校正
  2. 解决python-kafka连接kafka时报错kafka.errors.NoBrokersAvailable: NoBrokersAvailable
  3. python pandas检验一列中是否只有一个值
  4. 贝叶斯优化优化参数,以Kmeans为例
  5. h3c 虚拟服务器 下一跳,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100
  6. w ndows太卡,用Windows 10太卡?教你快速干掉Windows Defender
  7. enum中使用中文 unity_自定义Unity材质Inspector之枚举类型(Enum)
  8. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合
  9. 打印服务器打印文件,通过打印服务器远程打印文件
  10. filebeat 笔记