本备忘录的状态:
该RFC概述了在自治系统之间交换网络可达性信息的特定方法。
在撰写本文时,对于cisco路由器以及NSFNET节点交换系统,存在边界网关协议的实现。目前正在实施“gated”的公共域版本。
本备忘录的分发无限制
1. 介绍
边界网关协议(BGP)是一种自治系统间路由协议。它建立在RFC 904 中定义的EGP和NSFNET Backbone中EGP使用的经验之上,如RFC 1092 和RFC 1093 中所述。
BGP的主要功能是与其他BGP系统交换网络可达性信息。该网络可达性信息包括有关流量必须通过以到达这些网络的自治系统(AS)的信息。该信息足以构建AS连接的图,从该图可以修剪路由环路并且可以实施AS级别的策略决策。
BGP运行在可靠的传输级协议上。这消除了实现显式更新分段,重传,确认和排序的需要。除了BGP自己的认证机制之外,还可以使用传输协议使用的任何认证方案。
最初的BGP实现基于TCP ,但是可以使用任何可靠的传输。诸如VMTP 之类的消息传递协议对于BGP来说可能更自然。推荐使用TCP,因为它几乎存在于所有商用路由器和主机中。在以下描述中,短语“传输协议连接”可以被理解为指代TCP连接。 BGP使用TCP端口179建立连接。
2. 运作概要
两台主机之间形成传输协议连接。它们交换消息以打开并确认连接参数。初始数据流是整个BGP路由表。路由表更改时会发送增量更新。定期发送Keepalive消息以确保连接的活跃性。发送通知消息以响应错误或特殊情况。如果连接遇到错误情况,则会发送通知消息,并且可选择关闭连接。
执行边界网关协议的主机不必是路由器。非路由主机可以通过EGP甚至内部路由协议与路由器交换路由信息。然后,非路由主机可以使用BGP与另一个自治系统中的边界网关交换路由信息。该架构的含义和应用有待进一步研究。
如果特定AS具有多个BGP网关,则所有这些网关应具有一致的路由视图。 AS内部路由协议提供了自治系统内部路由的一致视图。可以以各种方式提供AS外部路线的一致视图。一种方法是使用BGP协议在单个AS内的BGP网关之间交换路由信息。在这种情况下,为了维护编组路由信息,这些网关必须具有相互直接的BGP会话(BGP会话应形成完整的图形)。请注意,此要求并不意味着单个AS内的所有BGP网关必须具有相互直接链接; 可以使用其他方法来确保一致的路由信息。
3. 消息格式
本节介绍在处理这些消息时检测到错误时要采取的消息格式和操作。消息通过可靠的传输协议连接发送。完全接收消息后处理消息。最大负载大小为1024字节。需要所有实现来支持此最大负载大小。可以发送的最小消息包括没有数据部分的BGP报头或8个字节。短语“BGP连接已关闭”表示已关闭传输协议连接,并且已取消分配该BGP连接的所有资源。与远程对等方关联的路由表条目被标记为无效。在从系统中删除之前,此信息将传递给其他BGP对等方。
3.1 消息头格式
每条消息都有一个固定大小的标题。标题后面可能有也可能没有数据部分,具体取决于消息类型。这些字段的布局如下所示
标记:16位
标记字段是全部的16位。该字段用于标记消息的开头。如果消息的前两个字节不是全1,那么我们有一个同步错误,并且在发送带有操作码5的通知消息(连接未同步)之后应该关闭BGP连接。没有发送通知数据。
长度:16位
长度字段是16位。它是消息的总长度,包括标题,以字节为单位。如果遇到非法长度(超过1024个字节或小于8个字节),则应发送带有操作码6(错误消息长度)和两个错误长度数据字节的通知消息,并关闭BGP连接。
版本:8位
版本字段是8位协议版本号。当前BGP版本号为1.如果找到错误的版本号,则应发送带有操作码8(错误版本号)的通知消息,并关闭BGP连接。坏版本号应包含在通知数据的一个字节中。
类型:8位
类型字段是8位消息类型代码。定义了以下类型代码:
如果找到无法识别的类型值,则应发送带有操作码7(错误类型代码)的通知消息和由相关类型字段的字节组成的数据,并关闭BGP连接。
保持定时器:16字节
此字段包含在我们声明错误并关闭BGP连接之前从BGP对等方接收BGP KEEPALIVE或BGP UPDATE消息后可能经过的秒数。
3.2 打开消息格式
建立传输协议连接后,任一方发送的第一条消息都是OPEN消息。如果OPEN消息可接受,则发回确认OPEN的OPEN CONFIRM消息。确认OPEN后,可以交换UPDATE,KEEPALIVE和NOTIFICATION消息。
除了固定大小的BGP头之外,OPEN消息还包含以下字段。
我的自治系统:16位
该字段是我们的16位自治系统编号。如果此字段存在问题,则应发送带有操作码9(无效AS字段)的通知消息,并关闭BGP连接。没有发送通知数据。
链接类型:8位
链接类型字段是一个单个八位字节,包含以下代码之一,用于定义我们在AS图中相对于对等体的位置。
UP表示对等体在AS层次结构中较高,DOWN表示较低,H-LINK表示在同一级别。 INTERNAL表示对等体是我们自治系统中的另一个BGP发言主机。 INTERNAL链路用于使AS路由信息与具有多个边界网关的AS保持一致。如果链接类型字段不可接受,则应发送带有操作码1(打开时链接类型错误)和包含预期链接类型的数据的通知消息,并关闭BGP连接。下面讨论两个BGP对等体的链路类型字段的可接受值。
验证码:8位
验证码字段是一个八位字节,其值描述了正在使用的认证机制。值为零表示没有BGP身份验证。注意,可以使用单独的认证机制来建立传输级连接。如果无法识别验证码,则会发送带有操作码2(未知验证码)且没有数据的通知消息,并且BGP连接已关闭。
验证数据:可变长度
验证数据字段是包含认证数据的可变长度字段。如果“验证代码”字段的值为零,则“验证数据”字段的长度为零。如果验证失败,则会发送带有操作码3(验证失败)且没有数据的通知消息,并且BGP连接已关闭。
3.3 OPEN CONFIRM消息格式
收到OPEN消息后发送OPEN CONFIRM消息。这样就完成了BGP连接设置。现在可以交换更新,通知和KEEPALIVE消息。
OPEN CONFIRM消息由带有OPEN CONFIRM类型代码的BGP头组成。 OPEN CONFIRM消息中没有数据。
3.4 更新消息格式
UPDATE消息用于在BGP对等体之间传递路由信息。 UPDATE分组中的信息可用于构造描述各种自治系统的关系的图。通过应用要讨论的规则,可以检测路由信息循环和一些其他异常,并从AS间路由中移除。
每当检测到UPDATE消息中的错误时,就会发送通知消息,其中包含操作码4(错误更新),描述问题性质的双字节子码,以及尽可能多的UPDATE消息数据部分组成的数据字段。。 UPDATE消息具有以下格式:
网关:32位
Gateway字段是网关的地址,该网关具有到UPDATE消息的其余部分中列出的Internet网络的路由。该网关必须与宣传它的BGP对等体属于同一个AS。如果网关字段存在问题,则发送包含子代码6(无效网关字段)的通知消息。
AS计数:8位
此字段是此UPDATE消息中的Direction和AS Number对的计数。如果检测到错误的AS计数字段,则在通知消息中指定子代码1(无效的AS计数)。
方向:8位
Direction字段是一个八位字节,包含退出由后续AS Number字段定义的AS时路由信息所采用的方向。
有一种特殊规定可以通过BGP传递外部学习(非BGP)路由。如果通过BGP传递EGP学习路由,则Direction字段设置为EGP-LINK,AS Number字段设置为通告该路由的EGP对等体的AS号。通过将AS Number字段设置为零并将Direction字段设置为INCOMPLETE,可以传递所有其他外部学习路由(非BGP和非EGP)。如果未识别出方向代码,则发送具有子代码2(无效方向代码)的通知消息。
AS编号:16位
该字段是传输路由信息的AS号。如果此AS编号存在问题,则会发送包含子代码3(无效自治系统)的通知消息。
净数:16位
“净计数”字段是此字段后面的“度量标准”和“网络”字段对的数量。如果此字段存在问题,则会发送包含子代码7(无效净计数字段)的通知。
网络:32位
网络字段是四个字节的Internet网络号。如果网络字段存在问题,则发送具有子代码8(无效网络字段)的通知消息。
指标:16位
度量字段是未指定度量的16位。仅当路由具有完全相同的AS路径时,BGP度量标准才具有可比性。全部指标表示网络无法访问。在所有其他情况下,度量标准字段无意义且必须忽略。没有非法指标值。
3.5 通知消息格式
检测到错误情况时会发送NOTIFICATION消息。发送通知消息后不久将关闭BGP连接。
操作码:16位
操作码字段描述了通知的类型。已定义以下操作码:
1(*)—打开链接类型错误。 数据是正确链接类型的一个字节。
2(*)—未知的验证码。 没有数据
3(*)—验证失败。 没有数据
4 —更新错误。 请参阅下面的数据描述
5(*)—连接不同步。 没有数据。
6(*)—消息长度无效。 数据是坏长度的两个字节。
7(*)—消息类型无效。 数据是坏消息类型的一个字节
8(*)—版本号无效。 数据是坏版本的一个字节
9(*)—OPEN中的AS字段无效。 没有数据。
10(*)—BGP停止。 没有数据。
上面列表中的已加星标的操作码被视为致命错误并导致传输连接终止。
更新错误(操作码4)具有16位子代码数据,后跟最后一个UPDATE消息。在子代码尽可能多地提出UPDATE的数据部分之后。定义了以下子代码:
1—AS计数无效
2—无效的方向代码
3—无效自治系统
4—EGP_LINK或INCOMPLETE_LINK链接类型不在AS路径列表的末尾
5—路由循环
6—无效的网关字段
7—无效的净计数字段
8—网络字段无效
数据:变量
数据字段包含零个或多个字节的数据,用于诊断通知的原因。数据字段的内容取决于操作码。有关详细信息,请参阅上面的操作码说明。
3.6 KEEPALIVE消息格式
BGP不使用任何基于传输协议的keepalive机制来确定对等体是否可达。相反,KEEPALIVE消息在对等体之间经常交换,以免导致保持时间(如BGP报头中所公布的)到期。 KEEPALIVE交换的合理最小频率将是保持时间间隔的三分之一。
一旦与BGP对等体关联的保持时间到期,则 BGP连接已关闭,BGP将释放所有关联的资源与这个同行。
KEEPALIVE消息是没有任何数据的BGP头。
4. BGP有限状态机
本节根据有限状态机(FSM)指定BGP操作。以下是本FSM确定的各州BGP操作的简要概述和概述。 附录1中提供了BGP FSM的精简版本。
最初BGP处于BGP空闲状态。
BGP_Idle状态:
在此状态下,BGP拒绝所有传入的BGP连接。没有资源分配给BGP邻居。响应Start事件(由系统或操作员启动),本地系统初始化所有BGP资源并将其状态更改为BGP_Active。
BGP_Active状态:
在这种状态下,BGP试图通过打开传输协议连接来获取BGP邻居。如果传输协议打开失败(例如,重传超时),则BGP保持在BGP_Active状态。
否则,本地系统向其对等体发送OPEN消息,并将其状态更改为BGP_OpenSent。由于对等体的保持时间仍未确定,因此将保持时间初始化为某个较大的值。
响应Stop事件(由系统或运营商发起),本地系统释放所有BGP资源并将其状态更改为BGP_Idle。
BGP_OpenSent状态:
在此状态下,BGP等待来自其对等方的OPEN消息。收到OPEN消息时,将检查所有字段的正确性。如果初始BGP头检查检测到错误,则BGP释放与该对等体关联的所有资源并返回到BGP_Active状态。否则,将检查链接类型,验证代码和验证数据字段的正确性。
如果链接类型不正确,则发送带有操作码1(打开时链接类型错误)的NOTIFICATION消息。以下链接类型字段的组合是正确的; 所有其他组合无效。
如果两个对等体之间的链路是INTERNAL,则两个对等体的AS号必须相同。否则,发送带有操作码1(打开时链接类型错误)的NOTIFICATION消息。
如果两个对等体具有相同的AS号并且这些对等体之间的链接类型不是INTERNAL,则发送带有操作码1的NOTIFICATION消息(打开的链接类型错误)。
如果“验证代码”字段的值为零,则忽略“验证数据”字段(如果存在)中的任何信息。如果验证码字段非零,则检查已知的验证码。如果认证码未知,则发送带有操作码2(未知认证码)的BGP NOTIFICATION消息。
如果验证代码值不为零,则调用相应的验证过程。默认值为零验证码,无验证数据。
如果上述任何测试都检测到错误,则本地系统会关闭BGP连接并将其状态更改为BGP_Idle。
如果BGP OPEN消息中没有错误,则BGP发送OPEN CONFIRM消息并进入BGP_OpenConfirm状态。此时,最初设置为某个任意大值的保持计时器(见上文)将替换为OPEN消息中指示的值。
如果从底层传输协议收到断开连接通知或者保持时间到期,则本地系统关闭BGP连接并将其状态更改为BGP_Idle。
BGP OpenConfirm状态:
在此状态下,BGP等待OPEN CONFIRM消息。收到此消息后,BGP会立即将其状态更改为BGP_Established。如果保持定时器在收到OPEN CONFIRM消息之前到期,则本地系统关闭BGP连接并将其状态更改为BGP_Idle。
BGP_Established 状态:
在BGP_Established状态中,BGP可以与其对等方交换UPDATE,NOTIFICATION和KEEPALIVE消息。
如果从基础传输协议收到断开连接通知或保持时间到期,则本地系统关闭BGP连接并将其状态更改为BGP_Idle
响应系统或操作员发起的Stop事件,本地系统发送带有操作码10(BGP Cease)的NOTIFICATION消息,关闭BGP连接,并将其状态更改为BGP_Idle。
5. 更新消息处理
只能在BGP_Established状态下接收BGP UPDATE消息。收到BGP UPDATE消息时,将检查每个字段的有效性。当发送关于UPDATE的NOTIFICATION消息时,操作码总是4(更新错误),子代码取决于错误的类型,并且数据字段的其余部分尽可能多地引起UPDATE的数据部分错误。
如果网关字段不正确,则发送带有子代码6(无效网关字段)的BGP NOTIFICATION消息。此UPDATE消息中的所有信息都将被丢弃。
如果AS Count字段小于或等于零,则发送BGP NOTIFICATION,子代码为1(AS计数无效)。否则,提取并检查完整的AS路径,如下所述。
如果未定义AS路由列表中的某个方向字段,则BGP NOTIFICATION消息带有子代码2(无效的方向代码)。
如果AS路由列表中的AS号字段之一不正确,则发送带有子码3(无效自治系统)的BGP NOTIFICATION消息。
如果在AS路径的末尾以外发生EGP_LINK或INCOMPLETE_LINK链接类型,则会发送带有子代码4的BGP NOTIFICATION消息(EGP_LINK或INCOMPLETE_LINK链接类型不在AS路径列表的末尾)。
如果上述测试都没有失败,则检查完整的AS路由是否存在AS循环。
AS环路检测是通过扫描完整的AS路由并检查此路由中的每个AS仅发生一次来完成的。如果检测到AS环路,则发送带有子代码5(路由环路)的BGP NOTIFICATION消息。
如果检测到任何上述错误,则不进行进一步处理。否则,完整的AS路径是正确的,并处理其余的UPDATE消息。
如果Net Count字段不正确,则发送BGP NOTIFICATION消息,其子代码为7(无效的Net Count字段)。
检查BGP UPDATE消息中列出的每个网络和度量对以获取有效的网络号。如果网络字段不正确,则发送带有子代码8(无效网络字段)的BGP通知消息。未对度量标准字段进行检查。由特定实现来决定是否在第一个不正确的网络上继续处理或终止它。
如果网络,其完整的AS路径和网关正确,则将路由与到同一网络的其他路由进行比较。如果新路由优于当前路由,则将其泛洪到其他BGP对等体,如下所示:
—如果通过INTERNAL链路接收到BGP UPDATE,则不会通过任何其他INTERNAL链路传播。这种限制是由于单个AS内的所有BGP网关形成完全连接的图(见上文)。
—在通过非INTERNAL链路发送BGP UPDATE消息之前,请检查AS路径以确保这样做不会导致路由环路。然后,在路由环路的任何非INTERNAL链路上传播BGP UPDATE消息(受本地策略限制)。
—如果BGP UPDATE消息通过非INTERNAL链路传播,则其将要传播的链路的当前AS号和链路类型被添加到完整AS路径,并且AS计数字段增加1。如果BGP UPDATE消息通过INTERNAL链路传播,则完整的AS路径未经修改就传递,并且AS计数保持不变。 Gateway字段将替换为发件人自己的地址。
附录1:
BGP FSM状态转换和操作
本附录讨论了BGP FSM中响应BGP事件的状态之间的转换。以下是这些状态和事件的列表:
BGPStates:
1 -BGP_Idle
2 -BGP_Active
3 -BGP_OpenSent
4 -BGP_OpenConfirm
5 -BGP_Established
BGPEvents:
1 -BGP Start
2 -BGP Transport connection open
3 -BGP Transport connection closed
4 -BGP Transport connection open failed
5 -Receive OPEN message
6 -Receive OPEN CONFIRM message
7 -Receive KEEPALIVE message
8 -Receive UPDATE messages
9 -Receive NOTIFICATION message
10 -Holdtime timer expired
11 -KeepAlive timer expired
12 -Receive CEASE message
13 -BGP Stop
下表描述了BGP FSM的状态转换以及这些转换触发的操作
所有其他状态事件组合都被视为致命错误,并导致BGP传输连接终止(如果需要)并转换到BGP_Idle状态。