路由规则

前面我们提到过路由策略的问题,策略性是指对于IP包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网A的包,选择X路径;其他选择Y路径”,或者是“所有TOS为A的包选择路径F;其他选者路径K”。
    策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。关于多路由表,我们前面已经讲过,当内核配置了“路由策略”后,就可以使用多达 255张路由表(数组的第0项不能使用)。有三张路由表是系统内置的,即本地路由表,主路由表,和默认路由表。
    在配置多路由表的情况下,查找路由时就存在了一个问题,即应该从哪个路由表中查找,如果找不到,接下来应该在哪个路由表中查找。对某个路由表应不应该进行查找等等。这一系例问题就引出了路由规则与规则之间的优先级的问题。
    结构体struct fib_rule定义一条路由规则,而多个struct fib_rule构成一条链表,链表上的先后顺序表明了它们之间的优先级:
      struct fib_rule
        {
            struct fib_rule *r_next;
            atomic_t    r_clntref;
            u32     r_preference;
            unsigned char   r_table;
            unsigned char   r_action;
            unsigned char   r_dst_len;
            unsigned char   r_src_len;
            u32     r_src;
            u32     r_srcmask;
            u32     r_dst;
            u32     r_dstmask;
            u32     r_srcmap;
            u8      r_flags;
            u8      r_tos;
#ifdef CONFIG_IP_ROUTE_FWMARK
            u32     r_fwmark;
#endif
            int     r_ifindex;
#ifdef CONFIG_NET_CLS_ROUTE
            __u32       r_tclassid;
#endif
            char        r_ifname[IFNAMSIZ];
            int     r_dead;
        };
    r_next指向下一条比本条优先级低的规则;r_table表明本条规则对应的路由表;r_action是本条规则的行为,比如为 RTN_UNREACHABLE,则表示符合本条规则的数据包都是目的地不可达的;r_src, s_srcmask, r_dst, r_dstmask定义了数据包的源和目地地址或网络,r_tos定义服务类型,r_ifindex定义输入网络设备接口的编号,再加上 r_fwmard,只有这些值都符合的数据包,才符合本条规则,可以进入本条规则指定的路由表进行路由查找,否则,不适用本规则,接着往下找低优先级的规 则。
    系统内置了三张路由表,所以,相应的,系统也内置了三条路由规则:
    static struct fib_rule mydefault_rule = {
        .r_clntref =    ATOMIC_INIT(2),
        .r_preference = 0x7FFF,
        .r_table =  RT_TABLE_DEFAULT,
        .r_action = RTN_UNICAST,
    };

    static struct fib_rule mymain_rule = {
        .r_next =   &mydefault_rule,
        .r_clntref =    ATOMIC_INIT(2),
        .r_preference = 0x7FFE,
        .r_table =  RT_TABLE_MAIN,
        .r_action = RTN_UNICAST,
    };

    static struct fib_rule mylocal_rule = {
        .r_next =   &mymain_rule,
        .r_clntref =    ATOMIC_INIT(2),
        .r_table =  RT_TABLE_LOCAL,
        .r_action = RTN_UNICAST,
    };
    r_preference是优先级,RT_TABLE_LOCAL优先级最高,为0,RT_TABLE_MAIN为0x7FFE, RT_TABLE_DEFAULT为0x7FFF。它们以链表的形式组织在一起,系统管理员可以通过系统命令操作向这个链表中再添加其它优先级的路由规 则。三条内置规则对数据包的源和目的地址,以及服务类型都没有作任何特殊限制,所以任何一个数据包都可以按顺序查找这三个路由表,直到找到相应的路由为 止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask路由规则定义了浏览器请求何时应该与哪个视图函数进行匹配。以下是一些常见的路由规则: 1. 常规路由规则 ```python @app.route('/hello') def hello(): return 'Hello, World!' ``` 在上面的代码,`/hello`是路由规则,它将匹配网站的根目录后面跟着`/hello`的任何请求,并调用`hello`函数来处理它。 2. 动态路由规则 ```python @app.route('/user/<username>') def show_user_profile(username): return 'User %s' % username ``` 这个路由规则将匹配网站根目录后面跟着`/user/`的任何请求,并将`<username>`作为变量传递给`show_user_profile`函数。例如,如果请求的URL是`/user/john`,`username`变量将被设置为`"john"`。 3. 指定HTTP方法 ```python @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form() ``` 这个路由规则将匹配网站根目录后面跟着`/login`的任何请求,但只有当请求方法是`GET`或`POST`时才会匹配。如果请求方法是`POST`,则调用`do_the_login`函数来处理它,否则调用`show_the_login_form`函数。 4. 指定URL参数类型 ```python @app.route('/user/<int:user_id>') def show_user(user_id): return 'User %d' % user_id ``` 这个路由规则将匹配网站根目录后面跟着`/user/`的任何请求,并将`<user_id>`作为整数变量传递给`show_user`函数。如果请求的URL是`/user/42`,`user_id`变量将被设置为`42`。 5. 指定多个路由规则 ```python @app.route('/') @app.route('/index') def index(): return 'Index Page' ``` 这个路由规则将匹配网站根目录或者跟着`/index`的任何请求,并调用`index`函数来处理它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值