百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

BGP的路由属性

zhezhongyun 2025-08-05 22:20 33 浏览

任何一条BGP路由都拥有多个路由属性,当路由器将BGP路由通告给它的对等体时,一并被通告的还有路由所携带的各个路由属性。对于BGP而言,BGP路由属性描述了该条路由的各项特征,同时,路由所携带的路由属性也将在某些场景下影响BGP路由优选的决策。

BGP路由属性类型

RFC 4271将BGP路径属性分为两大类:公认(Well-known)及可选(Optional),其中公认属性是所有BGP路由器必须都能够识别的路径属性,而可选属性则不要求所有的BGP路由器都必须能够识别。

公认属性里分了两个子类:必遵(Mandatory)及任意(Discretionary),其中必遵属性指的是当BGP路由器使用Update报文通告路由更新时必须携带的路径属性,而任意属性则不要求Update报文中必须携带。

可选属性里也分了两个子类:过渡(Transitive)及非过渡(Non-transitive),其中对于过渡属性,如果BGP路由器不能够识别该路径属性,那么也应该接受携带该路径属性的BGP路由更新,并且当路由器将该路由通告给其他对等体时必须携带该路由属性,而对于非可过渡属性,如果BGP路由器不能够识别该属性,那么该路由器将会忽略携带该路径属性的BGP路由更新且不将该路由通告给其他BGP对等体。

常见的BGP属性类型如下表所示:

属性名

类型

Origin属性

公认必须遵循

AS_Path属性

公认必须遵循

Next_Hop属性

公认必须遵循

Local_Pref属性

公认任意

MED属性

可选非过渡

团体属性

可选过渡

Originator_ID属性

可选非过渡

Cluster_List属性

可选非过渡

Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题,将在BGP路由反射器部分介绍,下面对其他几种常见的BGP属性进行介绍。

Origin属性

Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的,该属性为公认必遵属性。它有以下3种类型:

  • IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
  • EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。

说明:

此处EGP指的是一个具体的路由协议,其名称为EGP。这个路由协议现在已经不再被使用。

  • Incomplete:优先级最低。如果路由是通过其他方式学习到的,则Origin属性为Incomplete(不完整的)。例如通过import-route命令引入到BGP的路由。

AS_Path属性

AS_Path是公认必遵属性,它描述了一条BGP路由在传递过程中所经过的AS的号码。一台路由器在将BGP路由通告给自己的EBGP对等体时,会将本地的AS号插入到该路由原有AS_Path之前。AS_Path实际上是一个有长度的AS号码列表。从上面的描述也可以看出,BGP路由的AS_Path只在EBGP对等体之间发生改变,当BGP路由在一个AS内传递时(路由被通告给自己的IBGP对等体),该路由所携带的AS_Path是不会发生改变的。

AS_Path有两个非常重要的作用:

  • 避免EBGP路由的环路,如果路由器收到一条BGP路由并且发现该路由携带的AS_Path中出现了自己所在AS的AS号,它意识到从本地AS通告出去的BGP路由又被通告回了该AS,BGP将忽略关于该条路由的更新。
  • 用于BGP路由优选的决策。AS_PATH属性是记录达到目标网络的AS路径列表,类似距离矢量协议中的hop概念。AS_Path越短则该则该路由被视为越优,因为这条路径距离目的地所要经过的AS个数更少。

Next_Hop属性

Next_Hop属性是公认必遵属性,该属性描述了到达目的网段的下一跳地址。BGP路由所携带的Next_Hop属性值将在路由器计算路由时用于确认到达该路由的目的网段的实际下一跳IP地址和出接口。

通常情况下,Next_Hop属性遵循下面的规则:

  • 当路由器将本地路由表中的直连路由、静态路由或通过IGP协议学习到的动态路由使用network或import-route命令发布到BGP时,在该路由器的BGP路由表中,这些路由的Next_Hop属性显示0.0.0.0(该路由器是这些路由的始发者)。
  • 当BGP路由器使用aggregate命令通告一条BGP汇总路由时,在该路由器的BGP路由表中,该汇总路由的Next_Hop属性显示127.0.0.1。
  • 当路由器将本地始发的BGP路由通告给自己的IBGP对等体时,路由的Next_Hop属性值将被设置为本地与对端建立BGP邻居关系的接口地址。
  • 当路由器将非本地始发的IBGP路由通告给自己的IBGP对等体时(路由反射器的场景),缺省情况下,该路由不会改变该路由原有的Next_Hop属性值。
  • 当路由器将一条EBGP路由通告给自己的IBGP对等体时,缺省情况下,该路由器不会改变该路由原有的Next_Hop属性值。
  • 当路由器将一条BGP路由通告给自己的EBGP对等体时,无论这条路由是否为该路由器始发,路由的Next_Hop属性值都被设置为本地与对端建立BGP邻居关系的接口地址。

Local_Pref属性

Local_Pref属性是公认任意属性,该路径属性只能在IBGP对等体之间传递,当路由被通告给EBGP对等体时,是禁止携带该属性的。因此Local_Preference属性只能够在一个AS内部传递,这就是“本地”的含义。

如果一个AS拥有多个BGP出口,而且同一个AS内的BGP路由器通过这些出口均可到达同一个目的地,那么Local_Pref属性可被该AS用于告知本AS内的BGP路由器哪一个出口更优。Local_Pref属性的取值范围是0~4294967295(缺省值为100),值越大则路由越有可能被优选。

MED属性

MED(Multi-Exit Discriminator)属性是可选非过渡属性,用于判断流量进入AS时的最佳路由

当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。

MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。

团体属性

Community属性是一个可选过渡属性,它类似于路由的“标记”,我们可以针对特定的路由设置特定的Community属性值,而下游路由器在执行路由策略时,可以通过Community属性值来匹配目标路由。

团体属性用一组以4字节为单位的列表来表示,设备中团体属性的格式是aa:nn或团体号。

  • aa:nn:aa和nn的取值范围都是0~65535,管理员可根据实际情况设置具体数值。通常aa表示自治系统AS编号,nn是管理员定义的团体属性标识。例如,来自AS100的一条路由,管理员定义的团体属性标识是1,则该路由的团体属性格式是100:1。
  • 团体号:团体号是0~4294967295的整数。RFC1997中定义,0(0x00000000)~65535(0x0000FFFF)和4294901760(0xFFFF0000)~4294967295(0xFFFFFFFF)是预留的。

团体属性分为自定义团体属性和公认团体属性。其中公认团体属性如下:

  • Internet:缺省情况下,所有的路由都属于Internet团体。具有此属性的路由可以被通告给所有的BGP对等体。
  • No_Advertise:具有此属性的路由在收到后,不能被通告给任何其他的BGP对等体。
  • No_Export:具有此属性的路由在收到后,不能被发布到本地AS之外。如果使用了联盟,则不能被发布到联盟之外,但可以发布给联盟中的其他子AS。
  • No_Export_Subconfed:具有此属性的路由在收到后,不能被发布到本地AS之外,也不能发布到联盟中的其他子AS。

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...