l路由子系统——Scope

Scope

Scope类似作用域的概念。路由和IP地址可以指定Scope,用来告诉内核它们在那些情况下是有意义的,是可以被使用的。

Scope分为两种:路由的Scope 和 IP地址的Scope

路由的Scope:表示到目的网络的距离。

IP地址的Scope: 表示该IP地址到达本地主机有多远。

常用的Scope

IP地址常用的Scope

主机:表示该地址只用于主机的内部通信。例如:127.0.0.1

链路:表示地址尽在局域网内部有意义(链路层互联),如子网广播地址

全域:表示地址可以在任何地方使用。(这是大多数地址的默认Scope)

*注意点:***Scope并不能反映可路由(公开)地址和不可路由(私有)地址之间的区别。10.0.0.1和165.2.2.2的Scope都可能是链路或全域。广播地址和会换地址由内核来制定合适的Scope。

路由常用的Scope

主机: 路由表示的目的地址为本地主机。

链路:路由表示的目的地址为本地网络。

全域:路由表示的目的地址超过一个下一跳

Scope的应用

路由Scope和IP地址Scope在路由代码和内核其他部分都有广泛的应用。

关于IP地址的Scope

首先,我们要知道,对于Linux而言,IP地址属于主机而不是接口。这样当主机有两个接口,如eth0,eth1(例如我们路由期Wan口为eth0:202.202.202.202,lan口为eth1:192.168.1.1),两个IP地址(202.202.202.202和192.168.1.1)都是属于主机的,尽管他们配置在不同的接口上。这样,如果没有进行进一步的配置,我们来考虑下ARP应答:假设路由器从eth0(即wan口)接收到ip地址为192.168.1.1的地址请求(即wan端有主机ping 192.168.1.1)路由器是会给予应答的。(当然我们可以通过ARP_IGNORE特性进行配置)。

IP地址属于主机,那么,往我们的主机有多个IP地址时,当主机需要往外传送数据是,选择哪一个IP地址作为源IP,就需要进行判断了。对IP地址配置不同的Scope在这里就会得到一定的应用了。

关于路由的Scope

我们来看下图有关于路由的Scope的应用:

图中,主机A需要往主机B发送消息。第一条路由的Scope为链路,目的地址为子网10.0.1.0/24,主机A无法通过该路由到达主机B。第二条路由的Scope为全域,主机A通过eth0到达网关10.0.1.1,在经网关传送到主机B。

路由有更大的Scope能够保证封包能够到达更远的地方


Scope在Linux中的实现

Scope在linux内核中描述

Linux内核中用枚举常量来表示Scope:

enum rt_scope_t
{
    RT_SCOPE_UNIVERSE=0,    //scope 为全域  所有远程非直连目的地
/* User defined values  */
    RT_SCOPE_SITE=200,      //scope
    RT_SCOPE_LINK=253,      //scope 为链路
    RT_SCOPE_HOST=254,      //scope 为本机
    RT_SCOPE_NOWHERE=255    //被代码视为非法scopte
};

路由Scope

路由Scope被保存在结构体struct fib_alias的fa_scope字段

struct fib_alias {
    struct list_head    fa_list;
    struct fib_info     *fa_info;
    u8          fa_tos;
    u8          fa_type;
    u8          fa_scope; //路由Scope
    u8          fa_state;
#ifdef CONFIG_IP_FIB_TRIE
    struct rcu_head     rcu;
#endif
};

IP地址Scope

IP地址的Scope保存在结构体struct in_ifaddr中。

struct in_ifaddr
{
    struct in_ifaddr    *ifa_next;
    struct in_device    *ifa_dev;
    struct rcu_head     rcu_head;
    __be32          ifa_local;
    __be32          ifa_address;
    __be32          ifa_mask;
    __be32          ifa_broadcast;
    unsigned char       ifa_scope; //IP地址的Scope
    unsigned char       ifa_flags;
    unsigned char       ifa_prefixlen;
    char            ifa_label[IFNAMSIZ];
};

路由Scope与吓一跳Scope之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 13:52:41

l路由子系统——Scope的相关文章

深入理解Linux网络技术内幕——路由子系统的概念与高级路由

本文讨论IPv4的路由子系统.(IPv6对路由的处理不同). 基本概念 路由子系统工作在三层,用来转发入口流量. 路由子系统主要设计 路由器.路由.路由表等概念. 路由器: 配备多个网络接口卡(NIC),并且能利用自身网络信息进行入口流量转发的设备. 路由: 流量转发,决定目的地的过程 路由表:转发信息库,该库中储存路由需要本地接收还是转发的信息, 以及转发流量时所需要的信息.(即,信息库用来判断,要不要转发,如果要转发,向哪里转发). 我们了解,路由器有多个网卡,但是多个NIC的设备不一定就是

Linux3.5内核对路由子系统的重构对Redirect路由以及neighbour子系统的影响

几年前,我记得写过好几篇关于Linux去除对路由cache支持的文章,路由cache的下课来源于一次对路由子系统的重构,具体原因就不再重复说了,本文将介绍这次重构对Redirect路由以及neighbour子系统的影响. 事实上,直到最近3个月我才发现这些影响是如此之大,工作细节不便详述,这里只是对关于开放源代码Linux内核协议栈的一些实现上的知识进行一个汇总,以便今后查阅,如果有谁也因此获益,则不胜荣幸. 路由项rtable,dst_entry与neighbour IP协议栈中,IP发送由两

l 交换机的密码恢复

l 交换机的密码恢复 具体步骤: 1. 拔掉交换机的插头 因为交换机没有电源开关,所以只能切断电源来重启交换机. 2. 重新插好电源后,立刻按住交换机上的"mode" 键,当看到配置界面显示"switch:"命令提示,便可松开"mode"键.这表示已经进入到一个专门用来做故障恢复的简单IOS,由于没有密码,正常的IOS无法进入,所以只能先在这里做一些参数设定.如图所示: 3. 使用上面提示的命令"flash_init"初始化F

路由机制

9.1 理解URL URL满足的要求: l 域名易于记忆和拼写 l 简短.易输入 l 可以反应出站点的结构 l 可破解,用户可以通过移除URL的末尾,进而达到更高层次的信息体系结构 l 持久.不能变化 9.2路由机制的概述 ASP.NET MVC中路由机制的两种用途: l 匹配传入的请求,并映射到控制器的操作 l 构造传出的URL,用来相应控制器的操作 9.2.1 对比路由和URL重写 URL重写是将URL映射到另一个URL 路由是将URL映射到资源 两者的区别:路由机制也使用它在匹配传入URL

ASP.NET MVC3 学习心得------路由机制

9.1 理解URL URL满足的要求: l 域名易于记忆和拼写 l 简短.易输入 l 可以反应出站点的结构 l 可破解,用户可以通过移除URL的末尾,进而达到更高层次的信息体系结构 l 持久.不能变化 9.2路由机制的概述 ASP.NET MVC中路由机制的两种用途: l 匹配传入的请求,并映射到控制器的操作 l 构造传出的URL,用来相应控制器的操作 9.2.1 对比路由和URL重写 URL重写是将URL映射到另一个URL 路由是将URL映射到资源 两者的区别:路由机制也使用它在匹配传入URL

Linux邻居子系统的细节之confirm-OpenVPN server模式的MAC地址学习

在<Linux实现的ARP缓存老化时间原理解析>一文中,我剖析了Linux协议栈IPv4的邻居子系统的转化,再次贴出那个状态机转化图,可是这个图更详细了些,因为它有一个外部输入,那就是confirm: 请注意,如果socket或者路由子系统在上层confirm了一个neighbour,那么该arp将持续留在reachable状态而可以不用转换到stale状态.这个特性是有意义的.请观察一个现象:1.本机IP地址为192.168.1.10/24,直连的机器IP地址为192.168.1.20/24

《网络编程》路由套接字

概述 Unix 系统集成了路由功能,它包含相应的路由数据库可提供的路由信息,用户可以通过命令方式来增加.修改以及删除路由表中的项目,也可以只查看路由表的信息.在创建套接字时,可以通过指定参数 AF_ROUTE 域创建路由套接字,路由套接字可以访问内核中路由子系统的接口信息.路由套接字上支持 3 种类型的操作: 进程通过写到路由套接字向内核发送消息: 进程通过读入路由套接字接收来自内核的消息: 进程调用 sysctl 函数获取路由表或列出所有已配置的接口: 数据链路地址结构 struct sock

Docker的监控(简单部署Sysdig和Weave Scope)

一.Docker的监控 Docker自带的监控命令 简单命令介绍psdocker container ps 是我们早已熟悉的命令了,方便我们查看当前运行的容器.新版的 Docker 提供了一个新命令 docker container ls,其作用和用法与 docker container ps 完全一样.不过 ls 含义可能比 ps 更准确,所以更推荐使用. top如果想知道某个容器中运行了哪些进程,可以执行 docker container top [container] 命令.命令后面还可以

docker监控weavworks/scope,单台和多台部署

单台:需要用到sysdig.tar 包,可从网上下载我用的本地包:将它做成镜像:[[email protected] ~]# docker load < sysdig.tar 运行这个镜像:[[email protected] ~]# docker run -it --rm --name sysdig --privileged=true --volume=/var/run/docker.sock:/host/var/run/docker.sock --volume=/dev:/host/dev