精华内容
下载资源
问答
  • 区域的含义和类型
    千次阅读
    2021-03-24 22:04:46

    OSPF定义了以下5种区域,不同类型的区域对由自治系统外部传入的路由信息的处理方式不同

    • 标准区域:标准区域可以接收任何链路更新信息和路由汇总信息。
    • 主干区域:主干区域是连接各个区域的传输网络,其他区域都通过主干区域交换路由信息。主干区域拥有标准区域的所有性质。
    • 存根区域:不接受本地自治系统以外的路由信息,对自治系统以外的目标采用默认路由 0.0.0.0。
    • 完全存根区域:不接受自治系统以外的路由信息,也不接受自治系统内其他区域的路由汇总信息,发送到本地区域外的报文使用默认路由0.0.0.0。完全存根区域是Cisco定义的,是非标准的。
    • 不完全存根区域(NSAA):类似于存根区域,但是允许接收以类型7的链路状态公告发送的外部路由信息。
    更多相关内容
  • 结构体变量结构体类型定义

    万次阅读 多人点赞 2019-08-02 16:43:19
    结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2: struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }; ...

     

    结构体类型定义
    定义方式1:
    
    Typedef struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    } *LinkList;
    定义方式2:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    };
    Typedef struct  LNode  *LinkList;
    以上两个定义方式是等价的,是将 *LinkList 定 义为 struct LNode 类型,即 LinkList 被定义为一个类型名。这样就可以用 LinkList 来定义说明新的变量了,如:
    
    LinkList  L;
    即将 L 定义为 struct LNode 类型的指针变量。
    
    2.结构体类型变量定义
    定义方式1:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    }LnodeA;
    定义方式2:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    };
    struct  LNode LnodeA;
    以上两个定义方式也是等价的,这样就将 LnodeA 定义为一个 struct LNode 类型的变量,即 LnodeA 为一个 struct LNode 类型的变量名。
    
    结构体内标的定义方式
    1.结构体,透明表区,DATA ELEMENT,DOMAIN
    透明表是对一个物理表的逻辑描述,透明表里有许多字段,并且定义某些字段为 PRIMARY KEY,字段里又包含 DATA ELEMENT,用来描述语言属性和技术属性。DATA ELEMENT 中又包含 DOMAIN,它是定义数据类型和字段长度。
    
    结构体一般是用来定义一个结构变量,有临时数据的储存,没有 PRIMARY KEY,结构体里包含 COMPONENT 而不是 FIELD
    
    2.Internal table 中的属性分为三种 LINE TYPE ,KEY,TABLE KIND。
    LINE TYPE 在 INTERNAL TABLE 里单独的一行叫 LINE TYPE,每一行的结构都一样。
    
    KEY:相当于数据库里的主键。在排序的时候有用,UNIQUE 或 NON-UNIQUE。
    
    TABLE KIND:分为 STANDARD,SORTED,HASHED。
    
    三种类型的内表的定义
    标准表:
    
    DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.
    排序表:
    
    DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.
    哈希表:
    
    DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.
    一般定义方法(标准表)
    根据数据库表定义标准表
    
    DATA itab4 TYPE TABLE OF scarr.
    根据自建的结构变量定义标准表(最常用)
    
    DATA: BEGIN OF wa,
        carrid TYPE scarr-carrid,
        carrnamen TYPE scarr-carrname,
        END OF wa.
    DATA itab5 LIKE TABLE OF wa.
    根据数据字典中的表类型定义标准表
    
    DATA itab6 TYPE ztabtype00_1.
    根据内表定义内表
    
    DATA itab7 LIKE itab6.
    根据内表定义结构
    
    DATA wa1 LIKE LINE OF itab7.
    3. 定义结构的方式
    
    根据数据字典中的表或者结构来定义程序的结构变量(或类型)
    
    types str1 type spfli.
    data str2 type  sflight.
    自定义程序中的结构变量(或类型)-最常见的
    
    data: begin of wa,
    carrid type spfli-carrid,
    com(10) type c,
    end of wa.
    根据内表定义结构
    
    data wa like line of itab.
    注:根据数据库表定义的一定是结构
    
    同名字段的赋值(重要)
    
    Move-corresponding A  to  B.
    read 是读取内表的一条数据
    
    read table itab like table of wa.
    读一内表的多条数据应用 loop
    
    loop at itab into wa.
    C/C++ 语言中的解释
    结构体定义
    
    结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
    
    结构体作用
    
    结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 
    
    在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。  
    
    结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
    
    结构体的大小与内存对齐
    
    结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是 32Bit 字长的 CPU,对这类型的 CPU 取 4 个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。
    
    每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数)。程序员可以通过预编译命令 #pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的"对齐系数"。  
    
    规则:
    
      
    1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。  
    2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照< span class="marked">#pragma pack 指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。  
    3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
    C++ 中的结构体
    在 C 语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在 C 语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C 语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在 C++ 中,考虑到 C 语言到 C++ 语言过渡的连续性,对结构体进行了扩展,C++ 的结构体可以包含函数,这样,C++ 的结构体也具有类的功能,与class 不同的是,结构体包含的函数默认为 public,而不是 private。  
    
    C++ 控制台输出例子:
    
     
    实例
    #include <cstdlib> 
    #include <iostream>  //定义结构体  
    using namespace std; 
     
    struct point 
    {  
        //包含两个变量成员 
        int x;  
        int y; 
    };  
     
     
    int main(int argc, char *argv[]) 
    {  
        struct point pt; 
        pt.x=1; 
        pt.y=2; 
        cout<<pt.x<<endl<<pt.y<<endl;
        return EXIT_SUCCESS;
    }
    C++中的结构体与类的区别
    
    类与结构体在 C++ 中只有两点区别,除此这外无任何区别。  
    
    (1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。  
    (2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。
    这两种定义有什么区别?
    
    typedef struct student
    {
        int num;
        struct student *next;
    }student;
    
    struct student
    {
        int num;
        struct student *next;
    };
    第二个 struct student 是定义了一个 student 结构体,这个明白吧。
    
    第一个是用 typedef 把 struct student 这个结构体类型名字重新定义为 student,也就是说 struct student 和 student 表示同一个事物,都是一个类型的标识符,比如 typedef int zhengshu; 就是你把整型 int 重命名为 zhengshu,下面定义:int i; 和 zhengshu i; 两句就是等价的了。
    
    结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。
    
    结构说明和结构变量定义
    在 Turbo C 中,结构也是一种数据类型,可以使用结构变量,因此,象其它类型的变量一样,在使用结构变量时要先对其定义。
    
    定义结构变量的一般格式为:
    
    struct 结构名
    { 
        类型 变量名;
        类型 变量名;
    ...
    } 结构变量;
    结构名是结构的标识符不是变量名。
    
    类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。
    
    构成结构的每一个类型变量称为结构成员,它象数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
    
    下面举一个例子来说明怎样定义结构变量。
    
    struct string 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    }person; 
    这个例子定义了一个结构名为 string 的结构变量 person,如果省略变量名 person,则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成:
    
    struct string 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    }; 
    struct string person;
    如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。
    
    例如:
    
    struct string Tianyr, Liuqi, ...;
    如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,用这种结构时前面的例子变成:
    
    struct 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    } Tianyr, Liuqi;
    结构变量的使用
    结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。
    
    结构成员的表示方式为:
    
    结构变量.成员名
    如果将结构变量.成员名看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可象前面所讲的变量那样使用。
    
    下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和,并显示运算结果。请注意这个例子中不同结构成员的访问。
    
    实例
    #include <stdio.h>
    #include <conio.h>  
     
    int main() 
    { 
        struct
        { 
            char name[8]; 
            int age; 
            char sex[4]; 
            char depart[20]; 
            float wage1,wage2,wage3; 
        }a; 
        float wage; 
        char c='Y'; 
        while(c=='Y'||c=='y') 
        { 
            printf(\nName:); 
            scanf(%s, a.name); 
            printf(Age:); 
            scanf(%d, &a.wage); 
            printf(Sex:); 
            scanf(%s, a.sex); 
            printf(Dept:); 
            scanf(%s, a.depart); 
            printf(Wage1:); 
            scanf(%f, &a.wage1); 
            printf(Wage2:); 
            scanf(%f, &a.wage2); 
            printf(Wage3:); 
            scanf(%f, &a.wage3); 
            wage=a.wage1+a.wage2+a.wage3; 
            printf(The sum of wage is %6.2f\n, wage);
            printf(Continue?); 
            c=getche(); 
        } 
    }
    结构数组和结构指针
    结构是一种新的数据类型, 同样可以有结构数组和结构指针。
    
    1.结构数组
    
    结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:
    
    struct
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }student[40];
    也可定义为:
    
    struct string
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }; 
    struct string student[40];
    需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:
    
    结构数组元素.成员名 
    例如:
    
    student[0].name 
    student[30].age 
    实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二维是结构成员。
    
    注意: 结构数组的成员也可以是数组变量。
    
    例如:
    
    struct a 
    { 
        int m[3][5]; 
        float f; 
        char s[20]; 
    }y[4];
    为了访问结构a中结构变量 y[2] 的这个变量, 可写成 y[2].m[1][4]
    
    2.结构指针
    
    结构指针是指向结构的指针。它由一个加在结构变量名前的* 操作符来定义, 例如用前面已说明的结构定义一个结构指针如下:
    
    struct string
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }*student;
    也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。
    
    struct string *student; 
    使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构指针对结构成员的访问表示为:
    
    结构指针名->结构成员 
    其中 -> 是两个符号 - 和 > 的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中 name 和 age 赋值,可以用下面语句:
    
    strcpy(student->name, Lu G.C); 
    student->age=18;
    实际上,student->name 就是 (*student).name 的缩写形式。
    
    需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成, 仍以上例来说明如下:
    
    student=(struct string*)malloc(size of (struct string));
    size of (struct string) 自动求取 string 结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域,然后将其诈地址作为结构指针返回。
    
    注意:
    
    1. 结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定。
    2. 结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员的首地址应该是 &[结构变量名]。
    3. 结构的复杂形式:嵌套结构
    嵌套结构是指在一个结构成员中可以包括其它一个结构,Turbo C 允许这种嵌套。
    
    例如: 下面是一个有嵌套的结构
    
    struct string
    { 
        char name[8]; 
        int age; 
        struct addr address; 
    } student; 
    其中: addr 为另一个结构的结构名, 必须要先进行, 说明, 即
    
    struct addr
    { 
        char city[20]; 
        unsigned lon zipcode; 
        char tel[14]; 
    }
    如果要给 student 结构中成员 address 结构中的 zipcode 赋值, 则可写成:
    
    student.address.zipcode=200001; 
    每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:
    
    结构变量名.嵌套结构变量名.结构成员名 

     

    结构体定义变量的三种方法
    1.先定义结构体,然后在定义结构体变量
    
    struct stu{ /*定义学生结构体类型*/
        char name[20]; //学生姓名
        char sex; //性别
        long num; //学号
        float score[3]; //三科考试成绩
    }
    struct stu student1,student2; //定义结构体类型变量
    struct stu student3,student4;
    //用此结构体类型,可以定义更多的该结构体类型变量。
    
     
    
    2.定义结构体类型同时定义结构体类型变量
    
    struct data{
        int day;
        int month;
        int year;
    } time1,time2;
    //也可以在定义如下变量:
    struct data time3,time4;
    //用此结构体类型,同样可以定义更多的该结构体类型变量。
    
     
    
    3.直接定义结构体类型变量
    
    
    struct{
        char name[20]; //学生姓名
        char sex; //性别
        long num; //学号
        float score[3]; //三科考试成绩
    } person1,person2; //定义该结构体类型变量
    //该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。
    
     
    
    4.在C中定义一个结构体类型要用typedef
    
    
    typedef struct Student{
        int a;
    }Stu;
    //于是在声明变量的时候就可: Stu stu1;
    /*
    如果没有typedef就必须用struct Student stu1;来声明
    这里的Stu, 实际上就是 struct Student的别名
    另外这里也可以不写Student(于是也不能struct Student stu1;了)
    
    typedef struct{
        int a;
    }Stu;
    */
    

     

     

    bq25895StructTypeDef  bq25895A; //再定义变量
    
    
    
    
      typedef struct {
        bool      powerGood;
        bool      chargeFault;
        uint16_t  battryVoltage;
        uint8_t   battryPercentage;
        
        uint16_t  chargeCurrent;
        
      } bq25895StructTypeDef;//定义类型
    
    
    
    lastPowerGood = bq25895A.powerGood;  //直接这样用
    
     //直接这样用
    bq25895ItHandler(&bq25895A);
     //直接这样用
    
    void bq25895ItHandler(bq25895StructTypeDef *p) {
      if (BQ25895_POWER_GOOD == (bq25895ReadReg(BQ25895_RA_PG_STAT) & BQ25895_REG0B_PG_STAT_MASK)) {
        p->powerGood = true;
        if (BQ25895_CHARGE_NORMAL == (bq25895ReadReg(BQ25895_RA_CHRG_FAULT) & BQ25895_REG0C_CHRG_FAULT_MASK)) {
          p->chargeFault = false;
        } else {
          p->chargeFault = true;
        }
      } else {
        p->powerGood   = false;
        p->chargeFault = false;
      }
    }
      typedef enum {
        STATUS_MOVING,    //枚举类型  如果不自定义第一个默认为0
        STATUS_COLORING,  //
        STATUS_COLORED,   //
      } statusTypeDef;
      
      typedef enum {
        TX_MOTION_START_TAB     = 0,
        TX_MOTION_END_TAB       = 12,
        TX_MAGNETIC_START_TAB   = 12,
        TX_MAGNETIC_END_TAB     = 18,
        TX_COLOR_START_TAB      = 18,
        TX_COLOR_END_TAB        = 24,
        TX_BATTERY_TAB          = 24,
        TX_FRAME_LENGTH         = 25,
      } txTabTypeDef;

     

        typedef enum {
        TX_MOTION_START_TAB     = 0,
        TX_MOTION_END_TAB       = 12,
        TX_MAGNETIC_START_TAB   = 12,
        TX_MAGNETIC_END_TAB     = 18,
        TX_COLOR_START_TAB      = 18,
        TX_COLOR_END_TAB        = 24,
        TX_BATTERY_TAB          = 24,
        TX_FRAME_LENGTH         = 25,
      } txTabTypeDef;
    
    //TX_FRAME_LENGTH  25
    typedef struct {
        struct {
          uint8_t _1[TX_FRAME_LENGTH];
          uint8_t _2[TX_FRAME_LENGTH];
        } buffer;
        bool buffer1Latched;
      } txStructTypeDef;
    
    
     extern txStructTypeDef txA;
    
    txRefleshBattery(&txA, bq25895A.battryPercentage);
    
    
    
    void txRefleshBattery(txStructTypeDef *pTx, uint8_t battery) {
      pTx->buffer1Latched = true;
      pTx->buffer._1[TX_BATTERY_TAB] = battery;
      pTx->buffer1Latched = false;
      pTx->buffer._2[TX_BATTERY_TAB] = battery;
    }
    
    
    txClearColorBuffer(&txA);
    
    void txClearColorBuffer(txStructTypeDef *pTx) {
      pTx->buffer1Latched = true;
      for (uint8_t i = TX_COLOR_START_TAB; i < TX_COLOR_END_TAB; ++i) {
        pTx->buffer._1[i] = 0;
      }
      pTx->buffer1Latched = false;
      for (uint8_t i = TX_COLOR_START_TAB; i < TX_COLOR_END_TAB; ++i) {
        pTx->buffer._2[i] = 0;
      }
    }

     

     

    \

      pTx->buffer1Latched = true;
      for (uint8_t i = TX_MAGNETIC_START_TAB, j = 0; i < TX_MAGNETIC_END_TAB; ++i, ++j) {
        pTx->buffer._1[i] = pAk8963->tx[j];
      }
      pTx->buffer1Latched = false;
      for (uint8_t i = TX_MAGNETIC_START_TAB, j = 0; i < TX_MAGNETIC_END_TAB; ++i, ++j) {
        pTx->buffer._2[i] = pAk8963->tx[j];
      }

     

    展开全文
  • OSPF 区域类型

    2020-08-18 11:53:38
    OSPF 根据网络的需求可以定义为下列几种类型: 普通区域 STUB区域 完全STUB区域 NSSA区域 完全NSSA区域 普通区域区域被缺省定义时,它被认为是普通区域。普通区域可以是标准区域或骨干区域。标准区域是最通用的...

    OSPF 根据网络的需求可以定义为下列几种类型:

    • 普通区域
    • STUB 区域
    • 完全 STUB 区域
    • NSSA 区域
    • 完全 NSSA 区域

    普通区域

    当区域被缺省定义时,它被认为是普通区域。普通区域可以是标准区域或骨干区域。标准区域是最通用的区域,它携带区域内路由,区域间路由和外部路由。骨干区域是连接所有其它 OSPF 区域的中央区域。

    STUB区域

    Stub 末梢区域 
    STUB 区域是一个不允许 AS 外部 LSA 在其内部泛洪的区域。STUB 区域只可以携带区域内路由和区域间路由。在这些区域中路由器的 OSPF 数据库和路由表规模以及路由信息传递的数量都会大大减少,为了保证到自治系统外的路由依旧可达,由该区域的 ABR 生成一条缺省路由 0.0.0.0 传播到区域内,所有到自治系统外部的路由都必须通过 ABR 才能到达。
    Stub 过滤 4、5 类 lsa ,ABR 会产生缺省的 3 类 lsa,区域内不能引入外部路由

    完全STUB区域

    Totally Stub 完全末梢区域
    完全 STUB 区域是区域中最受限的形式,它不仅不允许携带外部路由,甚至连区域间路由也不允许携带,只可以携带区域内路由。在这些区域中路由器的 OSPF 数据库和路由表规模以及路由信息传递的数量都会大大减少,为了保证到区域外的路由依旧可达,由该区域的 ABR 生成一条缺省路由 0.0.0.0 传播到区域内,所有到该区域外部的路由都必须通过ABR 才能到达。
    Totally Stub 过滤 3、4、5 类 lsa,ABR 会产生缺省的 3 类 lsa,区域内不能引入外部路由

    NSSA区域

    NSSA 非纯末梢区域
    NSSA 区域允许一些外部路由通告到 OSPF自治系统内部,而同时保留自治系统的区域部分的 STUB 区域的特征。假设一个 STUB区域中的路由器连了一个运行其他路由进程的自治系统,现在这台路由器就变成了ASBR,所以这个区域就不能再称为 STUB 区域了。然而如果把这个区域配置成一个NSSA 区域,ASBR 会产生 NSSA 外部 LSA(类型 7),可以泛洪到整个 NSSA 区域。这些 7 类 LSA 在 NSSA ABR 上会转换成 5 类 LSA 并且泛洪到整个 OSPF 域中。
    NSSA 过滤 4、5 类 lsa ,ABR 会产生缺省的 7 类 lsa ,该区域能引入外部路由

    完全NSSA区域

    Totally NSSA 完全非纯末梢区域
    和 NSSA 区域相似,完全 NSSA 区域允许一些外部路由通告到 OSPF 自治系统内部,而同时保留自治系统区域部分的完全 STUB 区域的特征。该区域的 ASBR 会产生 NSSA 外部 LSA(类型 7)在其区域内部泛洪并通过该区域的 ABR 转换成 5 类 LSA 在整个OSPF 域泛洪。同时,该区域的 ABR 也会产生一条缺省路由 0.0.0.0 传播到区域内,所有域间路由都必须通过 ABR 才能到达。
    Totally NSSA 过滤 3、4、5 类 lsa ,ABR 会产生缺省的 3 类 lsa ,该区域能引入外部路由

    展开全文
  • OSPF之重要LSA类型与特殊区域

    千次阅读 多人点赞 2018-11-28 01:41:17
    OSPF协议定义了多种不同的路由器,例如一台DR路由器必须通告多路访问链路中和所有与这条链路相连的路由器,其它类型的路由器将不需要通告这种类型的信息。可见,不同的路由器通告的信息是不同的,于是用LSA类型去...

    一、前奏
    LSA定义
    LSA即Link State Advertisement。每一台路由器都会在所有形成邻接关系的邻居之间发送LSA。LSA描述了路由器所有的链路、接口、路由器的邻居以及链路状态信息。
    这些链路状态信息可以是到一个stub network(末梢网络,没有和其它路由器相连的网络)的链路、到其它OSPF路由器的链路、到其它区域网络的链路、或是外部网络的链路。

    了解了它的定义后,问题来了,为什么要定义多种LSA类型?想必聪明的你可能已经想到了。
    因为这些链路状态信息的多样性,OSPF协议中就定义了多种LSA类型。这样也更好的描述OSPF的网络情况。
    从另一方面,OSPF协议定义了多种不同的路由器,例如一台DR路由器必须通告多路访问链路中和所有与这条链路相连的路由器,其它类型的路由器将不需要通告这种类型的信息。从侧面,也可见不同的路由器通告的信息是不同的,随着学习的深入,你会越来越感受到这些类型所带来的好处。

    二、LSA类型
    学习LSA需要了解LSA是由谁通告的,传播范围,描述的内容是什么,这样会对后面的特殊区域的学习会更有帮助。
    搭建一个拓扑
    基本部署好后,配置OSPF区域,从左往右分别是Area 0,Area 1,Area 2区域。
    因为Area 2是属于脱节区域,故在R3上做了单点双向重分发。接下来我们注意关注R1中的路由信息。
    在这里插入图片描述

    1类 路由器LSA
    通告:区域内每一台路由器
    范围:本区域内部
    通告内容:路由器所有的链路或接口,沿每条链路方向出站代价,以及它的邻居。

    2类 网络LSA
    通告:DR路由器
    范围:本区域内部
    通告内容:多路访问网络和与之相连的所有路由器(包含子网掩码)

    3类 网络汇总LSA
    通告:ABR路由器(每穿越一个ABR,ADV Router就会变成该ABR的Router-ID)
    范围:OSPF区域
    通告内容:该区域外部的目的地址
    下图中O IA标识即为3类LSA.
    在这里插入图片描述

    4类 ASBR汇总LSA
    通告:ABR路由器
    通告内容:通告的是一台ASBR路由器,而非一个网络。其它的和网络汇总LSA一样。
    区域:OSPF区域

    5类 自主系统外部LSA
    通告:ASBR路由器
    通告内容:OSPF自主系统外部的目的地或者外部的默认路由的LSA(域外路由,不属于某个具体区域)
    范围:整个OSPF自主系统
    下图中的OE2标识的即为5类LSA。
    在这里插入图片描述
    7类 NSSA外部LSA(非纯末梢区域外部LSA)
    通行:ASBR路由器
    通告内容:基本上和5类是相同的,不同的是,通告区域仅仅是在NSSA所在的非纯末梢区域
    区域:NSSA区域

    三、特殊区域
    Stub区域(末梢区域)是一个不允许AS外部LSA通告在其内部进行泛洪扩散的区域。所以它阻塞的是_4类_、_5类_LSA。

    • 完全末梢区域(Totally Stubby Area)
      -阻塞3类、4类、5类LSA
    • 非纯末梢区域(Not So Stubby Area,NSSA)
      -与stub区域一样会阻塞LSA5。NSSA内可以存在ASBR,但是是以7类LSA引入的,只有在NSSA中才会有7类LSA。
      -NSSA区域的边界的ABR可以将7类LSA转为5类LSA,传播到其它区域。这时ABR也成了ASBR,因为它也引入了5类LSA。其它区域的路由器看5类LSA的通告路由器是ABR。
      –注:在NSSA区域内的ASBR路由器将会始发NSSA外部LSA。如果 一条NSSA外部LSA的P-bit位置设置了,那么ABR路由器将会把这条NSSA外部LSA转换为一条AS外部LSA。

    特殊区域的作用:隔离LSA,节省网络资源。

    每一种区域内允许泛洪扩散的LSA类型

    区域类型1和23457
    骨干区域(区域0)允许允许允许允许不允许
    非骨干区域,非末梢区域允许允许允许允许不允许
    末梢区域允许允许不允许不允许不允许
    完全末梢区域允许不允许不允许不允许不允许
    NSSA(非纯末梢区域)允许允许允许不允许允许

    *只有一个例外,每一台ABR路由器利用3类的LSA来通告默认路由。

    四、特殊区域实验验证
    通过实验验证下。
    特殊区域的配置:
    基本部署完成后,从左往右,配置OSPF区域,分别是Area 1,Area 2,Area 3;
    R3,R4上配置RIP;
    在R3上做单点双向重分发;
    在这里插入图片描述
    在R1,R2上配置stub区域,部署命令如下:

    router ospf 1
    area 1 stub
    

    在R1上查看路由信息
    在这个描述图片
    发现:配置完后,没有了4类,5类的LSA了。却有一条ABR(R2)下发的3类默认路由LSA(O IA标识)。

    为了进一步减少泛洪扩散的LSA,阻塞LSA,出现了tottly stub(完全末梢区域)。
    在前面配置好stub的基础上,在ABR(R2)上配置tottly stub。
    在R2上,配置如下命令

    router ospf 1
    area 1 stub no so-summary
    

    在这里插入图片描述
    在这里插入图片描述
    此时,可以看到,R1路由表中,3类LSA(O IA标识)消失了,仍有一条3类LSA,是由ABR(R2)发出的默认路由。

    再搭建个拓扑验证下NSSA
    在这里插入图片描述
    R1,R2,R3配置OSPF,区域分别为area 0,area1,R3与R4配置RIP。
    配置好后,在R3上进行单点双向重分发。
    观察R2上LSA信息。
    在这里插入图片描述
    可以看,由R3重分布进OSPF区域的LSA是5类的,图中LSA标识为0 E2。

    我们看area 1区域配置成NSSA区域后,会有什么变化。
    在R2,R3上配置NSSA,命令如下

    router ospf 1
    area 1 nssa
    

    再观察R2上LSA的状态。
    在这里插入图片描述
    观察发现,5类LSA没有了,多了7类LSA,图中O N2标识。可见,NSSA区域阻止了5类LSA。外部路由是以7类LSA引入 的。

    同时观察R1上LSA的情况
    在这里插入图片描述
    发现R1上,由R3重分布进OSPF区域的路由,仍是5类,这是因为在OSPF区域中,ABR将7类LSA传播到其它区域时,将它转成了5类LSA了。在area 0区域的其它路由器看来,ABR扩散了AS(自主系统 )外部LSA,那么认为它是ASBR(自主系统边界路由器),认为它扩散了5类的LSA。

    附:
    路由表中LSA类型标识

    标识类型备注
    O1类LSA
    O IA3类LSA域间路由
    O E15类LSA
    O E25类LSAO E2是cisco默认的外部路由类型
    O N17类LSA
    O N27类LSA
    展开全文
  • 六、了解联合类型和交叉类型 有了这些知识,你现在就可以了解联合和交叉类型的含义了。 联合类型 A | B 表示一个集合,该集合是与类型A关联的一组值和与类型 B 关联的一组值的并集。交叉类型 A & B 表示一个集合,...
  • 一、free_area 空闲区域结构体源码分析、 二、分配标志位、 三、GFP_ZONE_TABLE 标志位区域类型映射表、 四、分配标志位对应的内存区域类型
  • OSPF区域划分和区域间路由(三类LSA)

    千次阅读 2020-11-20 00:50:48
    OSPF区域间路由 一、区域划分的好处 背景: 随着网络规模不断扩大,结构也日趋复杂,路由器完成路由计算所消耗的内存、CPU资源也越来越多 网络发生故障的可能性也随之增加,如果区域内某处发生故障,整个区域内的...
  • 方法内定义的基本数据类型放在栈桢中,栈里面的数据是线程私有的,不共享。 方法外定义的全局变量,存放在java的堆中 java虚拟机是线程私有的,生命周期跟线程是相同的,每个方法调用的时候都会创建一个栈桢用于存储...
  • OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64);存根区域(stub)的特点是(65)。 (64)A.不接受本地AS之外的路由信息,也不接受其他区域的路由汇总信息 B.不接受本地AS...
  • C++:基本内置类型和复合类型

    千次阅读 2019-01-20 15:54:46
    基于基本内置类型和自定义数据类型的机制,C++标准库定义了一些更加复杂的数据类型,如可变长字符串和向量等,同样,程序员本人也可以基于此定义一些自己需要的数据类型。 基本内置类型 C++定义的一组内置数据类型...
  • LSA(Link-State Advertisement,链路状态广播)是链接状态协议使用的一个分组,它包括有关邻居通道成本的信息。 LSAs 被路由器接收用于维护它们的 RIB(路由表)。 OSPF 路由协议是链路状态型路由协议,这里的...
  • 1.第一种是使用表示矩形的区域ROI,Rect指定矩形的左上角坐标,矩形的长宽,.cols,.rows定义的 Mat imageROI; imgROI=image(Rect(0,0,XX.cols,XX.rows)); 2.第二种是区域的选取: imageROI=ima...
  • 这篇文章主要是从内存的角度来区分基本类型和引用类型的区别: 1、先了解内存分区(大家需要知道,定义的变量都是在内存中存放的) 内存是存储数据的,不同类型的数据要存储在不同的区域,即分类存放,不同的区域...
  • unity中的值类型和引用类型

    千次阅读 2019-08-14 16:32:53
    一、值类型和引用类型概念 值(value)类型 :Unity中的vector3、quaternion是structs,它们是值。 引用(feference)类型 :Unity中的transform、gameobject是类类型,所以它们是引用。引用类型是对数据存储位置...
  • OSPF-7种类型LSA.doc

    2019-12-23 11:02:02
    由于OSPF协议定义了多种路由器的类型,因而定义多种LSA通告的类型也是必要的。 例如:一台DR路由器必须通告多路访问链路所有与这条链路相连的路由器,而其他类型的路由器将不需要通告这种类型的信息。
  • 类型和引用类型的区别

    千次阅读 2017-10-25 10:07:08
    一、定义引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变。值类型表示复制一个当前变量传给方法,当你在这...
  • 类型和引用类型深入理解

    万次阅读 2018-08-02 14:19:04
    类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量name=’C’,当...
  • C/C++程序内存的各种变量存储区域和各个区域详解

    万次阅读 多人点赞 2018-03-11 17:57:16
    C语言在内存中一共分为如下几个区域,分别是:1. 内存栈区: 存放局部变量名;2. 内存堆区: 存放new或者malloc出来的对象;3. 常数区: 存放局部变量或者全局变量的值;4. 静态区: 用于存放全局变量或者静态变量;...
  • Stub区域和NSSA区域比较

    千次阅读 2016-06-14 11:26:42
    STUB区域的设计思想在于:在划分了区域之后,非骨干区域中的路由器对于区域外的路由,一定要通过ABR(区域边界路由器)来转发,或者说对于区域内的路由器来说ABR是一个通往外部世界的必经之路。既然如此,对于区域内...
  • C#引用类型和值类型在堆、栈中的存储

    千次阅读 多人点赞 2020-10-12 16:14:10
    运行中的程序使用两个内存区域来存储数据:栈堆。 1、栈 栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境、传递给方法的...
  • OSPF的不规则区域问题 不规则区域产生的原因 1,远离骨干的非骨干区域--连接在非骨干区域上的区域 连接这个区域的ABR不合法,该区域除边界路由器外均学不到其他区域的路由 2,不连续骨干区域--骨干区域之间插入...
  • OSPF Stub区域与NSSA区域

    千次阅读 多人点赞 2019-09-03 17:44:32
    Stub:OSPFSTUB区域是一个末梢区域,当一个OSPF区域处于整个自治系统边界时,而又不含其他路由协议,这时就可以配置OSPF Stub区域。 NSS:OSPF路由协议是目前因特网中应用最为广泛一种IGP,而NSSA则是在该协议...
  • OSPF中的NSSA区域

    千次阅读 2019-05-15 11:54:25
    1.定义了特殊的LSA类型7; 2.具有末梢区域和完全末梢区域的优点; 3.可以包含ASBR。 我们大家接下来结合一个小拓补来了解NSSA区域 如图,连接在末梢网络的某台路由器必须通过Area 2中的某一台路由器骨干区域Area 0...
  • ospf四大区域

    千次阅读 2019-08-18 10:48:13
    一、四大特殊区域:stub area 、totally stub area ------T-stub、nssa area、nssa totally area ------T-nssa 二、stub area:末节区域区域0相连的区域。并且这个区域没有连接任何其它OSPF区域以及其路由协议。 ...
  • JAVA数据类型

    千次阅读 2021-03-13 17:26:06
    区域由自己的名称(变量名)和类型(数据类型) Java中每个变量必须先声明,后使用 该区域的数据可以在同一类型范围内不断变化 java中的变量定义格式:数据类型 变量名=初始化值。 例:int a=5; 定义在方法中的...
  • 1.一般的Mat定义方法:cv::Mat M(height,width,),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个(C3:3 Channel)8位无符号整形(U Unsigned U8 8位)构成。 2.将已有数...
  • Java入门 - 变量与数据类型

    千次阅读 2021-01-13 10:58:36
    本小节你只需要完成:定义变量,并输出它。 相关知识 什么是常量,什么是变量 你只需要记住两点: 常量:就是一种不会根据环境而改变的数据,例如:圆周率。 变量:是一种能够根据不同环境产生不同值的数据,例如:...
  • 1:Integer 整数,例如1,2,3。。。。 2:String 任何形式的文字。字符串内容要使用英文双引号包围起来。...这种类型的变量很特殊,因为它几乎可以...这意味着可以通过行字母列号识别条目,就像Excel单元格一样。这...
  • OSPF之NSSA区域

    千次阅读 2022-02-16 22:23:55
    OSPF协议定义了Stub区域和Totally Stub区域这两种特殊的非骨干区域,为的是精简LSDB中LSA的数量,同时也精简路由表中的路由条目数量,实现优化设备网络性能的目的。根据定义,stub区域或Totally Stub区域中是不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 577,314
精华内容 230,925
关键字:

区域的含义和类型