网络协议——BGP(边界网关协议)全网最详解

1. 什么是AS?

AS: 指的是在同一个组织管理下,使用统一选路策略的设备集合,AS取值范围四字节( 0~43亿

2. BGP概念

        BGP是边界网关协议,用于自治系统间的动态协议路径矢量。基于TCP中应用层协议,端口号为179,只发送增量路由更新

3. BGP特点
  1. BGP使用TCP作为其传输层协议(端口号为179),使用触发式路由更新,而不是周期性路由更新。
  2. BGP能够承载大批量的路由信息,能够支撑大规模网络。
  3. BGP提供了丰富的路由策略,能够灵活的进行路由选路,并能指导对等体按策略发布路由。
  4. BGP能够支撑MPLS/VPN的应用,传递客户VPN路由。
  5. BGP提供了路由聚合和路由衰减功能用于防止路由振荡,通过这两项功能有效地提高了网络稳定性。
4. BGP对等体关系

        EBGP:位于不同AS的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件:

                        两个路由器所属AS不同(即AS号不同)。

                        在配置EBGP时,Peer命令所指定的对等体IP地址要求路由可达,并且TCP连接能够正确建立。

        IBGP:位于相同自治系统的BGP路由器之间的BGP邻接关系。

5. BGPIGP区别

        IGP:发现路由

        BGP:传递路由

6. BGP作用

        路由控制和优选

        传递路由

7. 基础配置

IBGP配置(在同一个AS域内)

进入BGP进程:bgp 100
绑定对端BGP: peer 10.1.1.2 as-number 100(绑定对端环回地址和as)
绑定自己环回接口:peer 10.1.1.2 connect-interface LoopBack0
宣告自己的环回地址:network  10.1.1.1 32

EBGP配置:(在不同AS域内)

进入BGP进程:bgp 100
绑定对端BGP: peer 192.168.10.2 as-number 200 (绑定对端接口IP地址和as)
宣告自己的环回地址:network  10.1.1.1 32(如果用环回接口创建时)绑定对端BGP:peer 10.1.1.2 as-number 200 (绑定对端环回地址和as)改变最大跳数:peer 10.1.1.2 ebgp-max-hop 2

查询命令:

查看BGP对等体信息:display bgp peer
查看BGP错误信息:display bgp error
查看BGP路由表信息:display bgp routing-table
查看一条BGP详细信息:display bgp routing-table 10.1.1.1
8. TCP连接源地址

        缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。

        在部署IBGP对等体关系时,建议使用Loopback地址作为更新源地址。Loopback接口非常稳定,而且可以借助AS内的IGP和冗余拓扑来保证可靠性。

        在部署EBGP对等体关系时,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等体关系,则应注意EBGP多跳问题。

9. BGP报文类型

10. OPEN报文

        Version(8bit):BGP的版本号。对于BGP 4来说,其值为4。

        My AS(autonomous system):本地AS号。通过比较两端的AS号可以判断对端是否和本端处于相同AS。

        Hold Time:保持时间。

        BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器。

11. Update报文格式

        Unfeasible routes length(2Byte): 不可达路由字段的长度,以Byte为单位。如果为0则说明没有Withdrawn Routes 字段。

        Withdrawn routes(NByte): 不可达路由的列表

Total path attribute length(2Byte):

        Path attributes(NByte): 路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成。

        NLRI(NByte): 可达路由的前缀和前缀长度二元组

 12. Notification报文格式

        Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型。

        Data:用于辅助描述详细的错误内容,长度并不固定。

13. Keepalive报文格式

        Keepalive报文格式中只包含报文头,没有附加其他任何字段,周期60s

14. Route-refresh报文格式

        AFI:Address Family Identifier,地址族标识,如IPv4。

        Res.:保留,8个bit必须置0。

        SAFI:Subsequent Address Family Identifier,子地址族标识。

15. BGP状态机

        Idle:开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源

        Connect正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接

        Active:TCP连接没建立成功,反复尝试TCP连接

        OpenSent:TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立

        OpenConfirm参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包

        Established:已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息.

        idle初始化状态,谁先建立TCP链接谁就是start事件发起者,进入connect状态建立TCP链接,建立成功进入OpenSent,建立失败进入Active状态,在Active中还会反复建立连接,在Active建立成功进入Opensent,建立失败返回connect,在OpenSent状态发送Open包,协商对等体参数,对方收到open包进入Opencofirm状态,在Openconfirm状态发送keepalive包,当对端收到keepalive包进入Established状态,至此对等体建立成功,除Active状态中间任何一个状态建立失败都会返回idle状态

16.BGP路由生成

        BGP注入路由的方式有两种:

        Network:注入路由

        import-route:(直连路由,静态路由,OSPF路由,IS-IS路由,等协议的路由注入到BGP路由表中。)

17. BGP聚合路由

        手动聚合

        建立好对等体之后

        AR1:        

进入回环接口:interface loopback 1
创建按回环地址:ip address 172.16.10.1 32
………
进入BGP宣告回环地址:network 172.16.10.1 32
……..
进入BGP进行聚合:aggregate 172.168.10.0 255.255.255.0 detail-suppressed  as-set

        如果在执行聚合时指定了detail-suppressed,则BGP只会向对等体通告聚合后的路由,而不通告聚合前的明细路由。

AR2

查询聚合:display bgp router-table

自动聚合(只能聚合引入的路由)

进入BGP进行聚合:summary automatic

18. BGP路由通告原则

通告原则一:只发布最优且有效(即下一跳地址可达)路由。

通告原则二:从EBGP对等体获取的路由,会发布给所有对等体。

通告原则三:从IBGP对等体获取的路由,不会再发送给其他IBGP对等体。该条原则也被称为“IBGP水平分割”。

通告原则四:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。(IBGP和IGP同步)

18. BGP路由表状态代码

*:表示路由有效,下一跳可达                  >:   表示选出的BGP最优路由

d: 表示路由是衰减路由                             h: 表示路由是历史路由

i: 表示内部路由                                        s: 表示被抑制状态

S:处于Stale状态的路由,正在被删除

19. BGP属性:

        1. 公认: 

                1. 公认必遵:必须包括在每个Update消息里

                    Origin(起源):标识BGP路由的起源,去往一个目的地有多条起源,其他条件相同,顺   序优选路径为:IBGP>EBGP>incomplete

                    as-path:前往目标的路由经过的AS号列表,防止EBGP环路,和进行路由优选

                    next_hop:指定到达目标下一跳地址

                2. 公认任意:可能包括在某些update中

                    local_preference(本地优先级):用于告诉AS中的路由器,哪条是离开本AS的首选路径,越大越优,缺省100c

  1.                     atomic_aggregate(原子聚合):用于标记聚合

          2. 可选:

                1. 可选过度:不识别此属性但依然会接收该属性通告给其他对等体

                  Aggregator: 手工聚合

                  Community(团体属性):是一种路由标记,用于简化路由策略的执行

        

         3. 可选非过度:不识别此属性会忽略此属性,也不会通告给其他对等体

                  MED: 属性越小越优先

                  Cluster-List:蔟列表

                  Originator-ID:路由反射器反射过去携带的属性

        4. 华为私有属性:preferred-value(协议首选值):优选preferred-vlue高的路由取值范围(0~65535)只能在本地设置,不会传递给对等体,主要用于AS之间,选大

19. As-path属性更改配置

    配置允许环路:   

进入BGP视图:bgp200
宣告对等体:peer 192.168.10.1 as-number 100
允许环路:peer 192.168.10.1 allow-as-loop(允许环路)

    选路配置:   

acl抓取网段:acl 2000rule 5 permit source 1.1.1.1 0
route-policy设置:route-policy name1 permit node 10if-math acl 2000apply as-path 10 20 30 40 50 additive(添加)(overwrite替换)(none overwrite清空)BGP调用:bgp 200peer 192.168.10.1 route-policy A import

     as-path-filter工具

抓取AS:ip as-path-filter  asname permit 200route-policy设置: route-policy A deny node 10if-math as-path-filter asnameBGP中调用:BGP 100peer 192.168.10.1 route-policy A import
19. Next_hop属性配置

Next_hop默认三种下一跳不可达:

        1. 路由器将BGP路由通告给自己的EBGP对等体时,将该路由的Next_Hop设   置为自己的TCP连接源地址。

        2.  EBGP通告给IBGP时,会保持NEXT_HOP保持不变,

        3.  Next_Hop属性值与EBGP对等体(更新对象)同属一个网段,那么该条路由的Next_Hop地址将保持不变并传递给它的BGP对等体。

进入BGP:BGP 200
设置下一跳为本地出接口:peer 1.1.1.1 next_hop_local
20. Local_preference属性配置

选路配置:

抓取网段:ip ip-prefix wh index 10 permit 1.1.1.1 32
使用路由策略:route-policy A permit node 10if-math ip-prefix  whapply local-preference 1000
BGP中调用:BGP 100peer 192.168.10.1 route-policy A import

更改默认local_preference值:

进入BGP:BGP 200
更改默认本地优先级值:default local-preference 10000

Local_preference注意事项:

  1. 不能在EBGP中传递
  2. 在传递到IBGP中IBGP会产生缺省Local_preference,再传递给IBGP对等体
  3. 使用bgp default local-preference命令修改缺省Local_Preference值,该值缺省为100。
  4. 路由器在向其EBGP对等体发送路由更新时,不能携带Local_Preference属性,但是对方接收路由之后,会在本地为这条路由赋一个缺省Local_Preference值(100),然后再将路由传递给自己的IBGP对等体。
  5. 本地使用network命令及import-route命令引入的路由, Local_Preference为缺省值100,并能在AS内向其他IBGP对等体传递,传递过程中除非受路由策略影响,否则Local_Preference不变。
21. Community属性

        Internet: 0  默认向所有的对等体发送路由

        No-Advertise:0xFFFFFF02 收到此属性路由不向任何对等体发送

        No-Export:0xFFFFFFF01 收到后不向AS外发送路由

        No-Export-Subconfed:0xFFFFFF03 收到路由后,即不向AS外发也不向子AS发

路由配置:

抓取网段:ip ip-prefix wh index 10 permit 1.1.1.1 32
使用路由策略:route-policy A permit node 10if-math ip-prefix  whapply community No-Export ( Internet,Advertise,No-Export-Subconfed ,100:200)
BGP中调用:BGP 100peer 192.168.10.1 route-policy A Export
开启团体属性: peer 192.168.10.1 advertise-community

        Community-filter工具

        AR1:

抓取网段:ip ip-prefix 4 index 20 permit 10.1.100.5 32
使用路由策略:route-policy w1 permit node 40if-match ip-prefix 4apply community 100:200
BGP中调用:bgp 100peer 192.168.1.2 route-policy w1 export

        AR4:

使用community-filter工具:ip community-filter 1 permit 100:200
使用路由策略:route-policy w2 deny node 10if-match community-filter 1
BGP中调用:bgp 2001peer 2.2.2.2 route-policy w2 import

22. 联盟

        将一个AS内部划分为多个子AS

        配置命令:

    

进入子ASBGP: BGP2000
标识属于的联盟:confederation id 200
标识要建立对等体的子AS号:confederation peer-as 2001 2002
建立对等体:peer 192.168.1.1 as-number 2001
peer 192.168.2.1 as-number 2002
更改下一跳为本地:peer 192.168.1.1 next-hop-localpeer 192.168.2.1 next-hop-local
22. preferred-value属性(华为特有属性,越大越优,本地有效)

路由配置

抓取网段:ip ip-prefix 1 index 10 permit 4.4.4.4 32
使用路由策略:route-policy wh1 permit node 10if-match ip-prefix 1apply preferred-value 10000#
默认允许:route-policy wh1 permit node 20
BGP中应用:bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack0
peer 2.2.2.2 route-policy wh1 import
23. MED属性:

注意事项:1.  缺省情况下,路由器只比较来自同一相邻AS的BGP路由的MED值;

  1. 如果一条路由是本地开始通过import或network引入的,则默认携带MED属性通告给MED对等体
  1. 一条BGP路由为从BGP对等体学习到,那么该路由传递给EBGP对等体时缺省不会携带MED属性。
  2. 在IBGP对等体之间传递路由时,MED值会被保留并传递

默认操作:1. 如果路由器通过IGP学习到一条路由,并通过network或import-route的方式将路由引入BGP,产生的BGP路由的MED值继承路由在IGP中的metric

    2. 如果路由器将本地直连、静态路由通过network或import-route的方式引入BGP,那么这条BGP路由的MED为0,因为直连、静态路由cost为0

     3. 一条从BGP学习到的路由传递给其他EBGP对等体时,默认不携带MED,MED不会跨AS传递

          4. 修改默认MED值时只能通过import-route和aggregate(聚合)的路由生效

路由配置:            

抓取网段:ip ip-prefix 1 index 10 permit 192.168.1.1 24使用路由策略:route-policy wh1 permit node 10if-match ip-prefix 1apply cost 100BGP中应用:bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack0
peer 2.2.2.2 route-policy wh1 import
Compare-different-as-med (比较不同的as的med)  
24. BGP路由反射器

反射规则:

  1. RR从非客户端学习到的IBGP路由会反射给所有客户端
  2. RR从客户端学习到的IBGP路由会反射给所有的除该客户端之外客户端和非客户端
  3. RR从EBGp对等体学习到的路由会发送给所有的非客户和客户对等体

       反射和发送的区别反射携带特殊属性,发送不携带特殊属性 (Originator_ID,Cluster_List)

       路由反射器特殊属性:

  1. Originator_ID:当BGP路由器收到一条携带Originator_ID属性的IBGP路由,并且Originator_ID属性值与自身的Router ID相同,则它会忽略关于该条路由的更新
  2. Cluster_List:当一条路由被反射器反射后,该RR(该簇)的Cluster_ID就会被添加至路由的Cluster_list属性中。 当RR收到一条携带Cluster_list属性的BGP路由,且该属性值中包含该簇的Cluster_ID时,RR认为该条路由存在环路,因此将忽略关于该条路由的更新。

       命令配置:

进入BGP:BGP 200
配置他的对等体为客户端: peer 3.3.3.3 reflect-client
配置路由反射器集群ID:reflector cluster-id
25. BGP选路原则
  1. 首先丢弃下一跳next_hop不可达的
  2. 优选协议首选值(Preferred-value)值最大的路由
  3. 优选本地优先级(local_pref)最高的
  4. 优选手动聚合>自动聚合>network>import>对 等体学到的
  5. 优选AS路径AS_path最短的路由
  6. 优选Origin属性最优的路由:i>e>?
  7. 优选MED值最小的
  8. 优选EBGP对等体学习的路由
  9. 优选Next_hop的IGP度量值最小的
  10. 优选Cluster_list最短的路由
  11. 优选Router_ID最小的设备通告的路由
  12. 优选具有最小IP地址的对等体通告的路由

16. BGP路由负载分担

负载分担前提条件:

  1. Preferred-Value属性值相同。
  2. Local_Preference属性值相同。
  3. 都是聚合路由或者非聚合路由。
  4. AS_Path属性长度相同。
  5. Origin类型(IGP、EGP、Incomplete)相同。
  6. MED属性值相同。
  7. 都是EBGP路由或都是IBGP路由。
  8. AS内部IGP的Metric相同。
  9. AS_Path属性完全相同。

负载分担配置:

进入BGP:BGP 100
配置负载分担:maximum load-balancing ibgp 2
配置不比较AS_PATH:load_balancing  as_path_ignore

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478640.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】Servlet:表白墙

文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖&#xff0c;mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作&#xff0c;和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或者…

《硬件架构的艺术》笔记(七):处理字节顺序

介绍 本章主要介绍字节顺序的的基本规则。&#xff08;感觉偏软件了&#xff0c;不知道为啥那么会放进《硬件架构的艺术》这本书&#xff09;。 定义 字节顺序定义数据在计算机系统中的存储格式&#xff0c;描述存储器中的MSB和LSB的位置。对于数据始终以32位形式保存在存储器…

【STM32】在 STM32 USB 设备库添加新的设备类

说实话&#xff0c;我非常想吐槽 STM32 的 USB device library&#xff0c;总感觉很混乱。 USB Device library architecture 根据架构图&#xff1a; Adding a custom class 如果你想添加新的设备类&#xff0c;必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…

C 语言学习-06【指针】

1、目标单元与简介存取 直接访问和间接访问 #include <stdio.h>int main(void) {int a 3, *p;p &a;printf("a %d, *p %d\n", a, *p);*p 10;printf("a %d, *p %d\n", a, *p);printf("Enter a: ");scanf("%d", &a)…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

《用Python画蔡徐坤:艺术与编程的结合》

简介 大家好&#xff01;今天带来一篇有趣的Python编程项目&#xff0c;用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库&#xff0c;通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍&#xff0c;快来试试看吧&…

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念&#xff1a; 主机&#xff1a;配有IP地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;配有IP地址&#xff0c;同时进行路由控制的设备 节点&#xff1a;主机和路由器的统称 所以现在…

国土安全部发布关键基础设施安全人工智能框架

美国国土安全部 (DHS) 发布建议&#xff0c;概述如何在关键基础设施中安全开发和部署人工智能 (AI)。 https://www.dhs.gov/news/2024/11/14/groundbreaking-framework-safe-and-secure-deployment-ai-critical-infrastructure 关键基础设施中人工智能的角色和职责框架 https:/…

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天&#xff0c;远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

lua除法bug

故事背景&#xff0c;新来了一个数值&#xff0c;要改公式。神奇的一幕出现了&#xff0c;公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…

洛谷 B3635 硬币问题 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/B3635 用贪心可以但是会有测试点不过。比如15,11111115.或者55515&#xff0c;如果你是贪心把最大值的硬币放在第一个&#xff0c;那么这个测试点就错误了。用记忆化搜索可以&#xff0c;因为贪心只能测一次&#xff0c;记…

【数据结构与算法】合并链表、链表分割、链表回文结构

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 1.合并链表 题目&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链…

NuGet如何支持HTTP源

今天是2024年11月21号&#xff0c;最近更新了VisualStudio后发现HTTP的包源已经默认禁止使用了&#xff0c;生成时会直接报错。如下图&#xff1a; 官方也明确指出了要想使用HTTP包源的解决办法&#xff0c;这里就简单总结一下。 一、全局配置 1、全局NuGet包的配置文件路径在…

ArcGIS API for Javascript学习

一、ArcGIS API for Javascript 介绍 ArcGIS API for Javascript 是由美国 Esri 公司推出&#xff0c;跟随ArcGIS 9.3 同时发布的&#xff0c;是Esri 基于dojo 框架和 REST 风格实现的一套编程接口。通过 ArcGIS API for Javascript可以对ArcGIS for Server 进行访问&#xff…

React表单联动

Ant Design 1、dependencies Form.Item 可以通过 dependencies 属性&#xff0c;设置关联字段。当关联字段的值发生变化时&#xff0c;会触发校验与更新。 一种常见的场景&#xff1a;注册用户表单的“密码”与“确认密码”字段。“确认密码”校验依赖于“密码”字段&#x…

Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序

在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发&#xff0c;提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE&#xff0c;可用于在各种应用程序…

丹摩征文活动|实现Llama3.1大模型的本地部署

文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型&#xff0c;相较于之前的版本&#xff0c;它在规模和功能上实现了显著提升&#xff0c;尤其是最大的 4050亿参数版本&#xff0c;成为开源社区中非常…

STM32F103外部中断配置

一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器&#xff0c;其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中&#xff0c;有一些比较特殊的中断&#xff1a; 中断编号13 EXTI…

docker run m3e 配置网络,自动重启,GPU等 配置渠道要点

启动命令&#xff1a; docker run -d --restart always -p 6008:6008 --gpus all --name m3e --network fastgpt_fastgpt stawky/m3e-large-api 配置渠道m3e base url要像我这样填写才行&#xff0c;不然回出问题 模型要选m3e 密钥填&#xff1a;sk-aaabbbcccdddeeefffggghhhi…