「BGP/MPLS-IP-VPN」- 组网:Intranet

网络拓扑

第一步、配置 MPLS Domain 环境
1)配置网络地址基础信息,以用以实现网络互通;
2)运行 OSPF 协议,实现 MPLS Domain 网络互通;
3)运行 MPLS 协议,通过 LDP 建立 MPLS 环境;
第二步、接入 CE 设备(VRF-Inst)
通过 VRF-Inst 将 CE 接入到网络中;
1)VRF Instance
2)RD
3)RT
4)Interface Binding
第三步、路由通告(CE ⇔ PE)
配置 CE 设备,以将路由通告给 PE 设备。例如 OSPF、ISIS 等等;
对于 CORP-A-HQ 设备,其使用 OSPF 协议:

# 1. 配置 OSPF 协议;
# 2. 在 BPG 中,引入 OSPF 路由;

对于 CORP-B-HQ 设备,其使用 BGP 协议:

# 1. 需要进入 ipv4-family vpn-instance 中配置
[PE-01]bgp 100
[PE-01-bgp]ipv4-family vpn-instance CORP-B-HQ
[PE-01-bgp-CORP-B-HQ]display this
[V200R003C00]
#
#
ipv4-family vpn-instance CORP-B-HQ
network 10.0.61.0 255.255.255.0
peer 10.0.61.6 as-number 65002
#
return

特殊 BGP 配置:AS Number 冲突
问题描述:在 VPN Instance 内,两个 Site 使用相同的 AS Number,导致路由通告触发 BGP AS-PATH 防环;
解决方案:可以在 PE 上执行 peer substitute-as 命令使能 AS-Number 替换功能,即 PE 用本地 AS 号替换收到的私网路由中 CE 所在 VPN 站点的 AS 号,这样对端 CE 就不会因为 AS 号重复而丢弃路由;
AS Subustitute:

[PE-01] bgp 100
[PE-01-bgp] ipv4-family vpn-instance CORP-B-HQ
[PE-01-bgp-CORP-B-HQ] peer 10.0.61.6 substitute-as

[CORP-B-SUB]display bgp routing-table

*> 10.0.61.0/24 10.0.48.4 0 100i
*> 192.168.1.0 10.0.48.4[……]

READ MORE

「BGP/MPLS-IP-VPN」- 组网:Hub-Spoke

拓扑信息
Hub-Spoke,即所有流量通过 Hub 进行中转,而 Spoke 不会进行通信;

补充说明:
1)针对 Hub-Spoke 组网,鉴于配置与其他方式相同,所以我们不再讨论具体配置;
2)我们将重点讨论 Hub-Spoke 组网将遇到的问题,及相关问题的解决方案;
配置 VRF 实例
在 Hub-PE 上,需要配置两个 VRF-Inst,否则如果不使用分离的 VRF-Inst,则 Spoke-CE1 与 Spoike-CE2 能够直接通信,流量将不再经过 Hub-CE 设备;

组网方案
针对 Hub-Spoke 组网,有以下方案:
1)BGP/BGP:Spoke-CE <=(BGP)⇒ Spoke-PE;Hub-PE <=(BGP)⇒ Hub-CE;
2)IGP/IGP:Spoke-CE <=(IGP)⇒ Spoke-PE;Hub-CE <=(IGP)⇒ Hub-PE;
3)IGP/BGP:Spoke-CE <=(IGP)⇒ Spoke-PE;Hub-CE <=(BGP)⇒ Hub-PE;4)BGP/IGP:Spoke-CE <=(BGP)⇒ Spoke-PE;Hub-CE <=(IGP)⇒ Hub-PE;该方案是不可行的,后面将介绍原因;
组网方案:BGP + BGP

需要注意的问题:
BPG Loop | allow-as-loop
问题描述:路由传递,Spoke-PE1 ⇒ Hub-PE ⇒ Hub-CE ⇒ Hub-PE,两次经过 Hub-PE 设备,当第二次到达时,会触发 BGP AS-PATH 防环;
解决方案:通过 [ipv4-family vpn instance] peer <IP-ADDR> allow-as-loop 1 命令,检查 AS-PATH 属性,允许单次防环;
补充说明:

这里并不能使用 AS Number Substitution 替换,替换动作将替换 BGP Peer 的 AS Number,并不能解决环路问题;
Allow AS Loop 其检查 AS Path 属性,如果其中包含多个 AS Number 值,则需要设置允许多次防环;

组网方案:IGP + IGP

需要注意的问题:
IGP Loop
如果 Hub-CE 仅使用单个 OSPF 进程,怎会导致 Hub-PE 仅将路由保存到 LSD,但不会加表。这与防环机制有关;
所以,在 Hub-CE 中,我们会运行两个 OSPF 进程,并进行路由引入,进程变成外部路由后不会在出现环路;
后面,我们将会深入讨论细节问题。
单次引入
虽然 Hub-CE 上运行两个 OSPF 进程,但是仅需要单[……]

READ MORE

「COMPUTER-NETWORING」- 网络硬件 | 软件方案 | 参数信息

问题
其他章节的内容偏向于理论,而该部分的内容则为我们接触过的装置。例如 设备、硬件、线缆 等等。
分析
路由器 带机量:路由器的带机量指的是路由器能够同时连接并支持的设备数量,包括有线和无线设备。这个数量是路由器性能的一个重要指标,对于家庭或企业网络来说,选择合适的带机量路由器至关重要。
方案
设备厂商
华为、思科、H3C、锐捷
设备类型
路由交换设备、安全设备、无线设备、数据中心相关设备、云计算相关设备
VoIP Phone
白盒交换机 (White Box Switch)
白盒交换机是一种解耦了硬件和软件的开放网络设备,它允许用户自由选择网络操作系统(NOS)并在标准化的商用硬件上运行。白盒交换机代表了网络设备向开放、标准化方向发展的趋势,特别适合需要大规模部署和高度定制化的场景。
常见白盒交换机操作系统有 SONiC (Microsoft开发的开源NOS)、Open Network Linux (ONL)、Cumulus Linux、Pica8 PICOS、IP Infusion OcNOS
构建
特点

硬件与软件分离:白盒交换机使用标准化的商用芯片(如Broadcom、Barefoot等)和硬件,用户可以自主选择安装不同的网络操作系统。
开放架构:采用开放标准,打破了传统厂商的封闭生态系统。
成本效益:通常比品牌交换机便宜30-50%,因为避免了厂商锁定和专有溢价。
灵活性:可根据特定需求定制软件功能。

应用
– 大型数据中心网络
– 云计算基础设施
– 电信运营商网络
– SDN(软件定义网络)环境
– 需要高度定制化的网络环境[……]

READ MORE

「COMPUTER-STORAGE」- Ceph | 分布式存储平台 | Object | Block |File

认识
Ceph 最早是加州大学 Santa Cruz 分校的一个研究项目,项目创始人 Sage Weil 被誉为“Ceph 之父”。其最初的研究目标是围绕文件系统使用场景构建一个可水平扩展的基于对象的文件系统,用于数据中心高性能计算。
当研究工作接近尾声时,Sage 开始与许多传统存储供应商谈论 Ceph 及其在该项目中所做的工作,试图谋求与企业的合作,但结果都不理想。最后,Sage 通过开放源代码的方式改变 Ceph,从而影响存储界,进而效仿 Solaris、Ultrix、Irix 等公司的发展模式。
Ceph 项目于 2006 年正式开源,代码存放在 SourceForge 中,而后逐步发展成为我们今天看到的这个项目。
Red Hat’s Ceph offers unified object and block storage capabilities. It’s a distributed storage solution that boasts excellent performance, scalability and reliability. Well-known users include Cisco, DreamHost, CERN, Bloomberg, and Deutsche Telekom. Operating System: Linux
组成
其设计思路是将通用的服务器和硬盘设备通过网络协议进行集群组建,构建成一套存储集群,对外提供多种访问接口,实现满足多种使用场景的分布式存储;
最初,Ceph 利用了几种技术,包括 EBOFS(针对对象工作负载的文件系统)、CRUSH 算法、RADOS(为 Ceph 提供支持底层对象存储的算法)等,并且这几项技术的监控部分在集群内部实现,这样做的主要目的是实现存储智能化。
构建
WIP
性质
总体表现在 4 个方面:集群可靠性、集群扩展性、数据安全性、接口统一性;
冗余:通过高可用,能够实现无任何单故障点;可靠:每个组件必须尽可能拥有自我管理和自我修复能力;运行于现有商业硬件之上;纠删码;缓存;计数;
可靠性和高可用性
1)条带化、纠删码、副本:数据持久性、高可用性和离性能,并支持多站点和灾难恢复
2)动态调整块大小:无须停机即可扩展或缩小 Ceph 块设备
3)存储策略:使用 CRUSH 算法对数据进行跨节点复制,以实现故障域解决方案;通过 CRUSH 算法,Client 能够自己计算出存储位置,而不再需要 Server 提供中心化的节点来计算数据存放位置;通过 CRUSH 算法,存储单元能够自己完成数据的高可用,依旧无需中心化的控制节点来管理集群;
4)快照:整个池或单个块设备的快照
5)服务支持:SLA 支持的技术,保证实现产品升级和漏洞修[……]

READ MORE

「HUAWEI-ENSP」- 实验学习:MPLS VPN | Hub-Spoke 组网 | BGP + BGP

实验环境

底层网络已配置;各个 Site 内部互通;MPLS Domain 内部互通;
实验需求
部署 MPLS L3 VPN 网络,要求:

通过 Site Hub 来实现 Site A 与 Site B 互通;
PE CE 使用 BGP 协议对接;

实验拓扑
配置过程:

# ——————————————————————————- # BGP vpnv4

[AR2]bgp 65000
[AR2-bgp]peer 7.7.7.7 as-number 65000
[AR2-bgp]peer 7.7.7.7 connect-interface LoopBack 0
[AR2-bgp]ipv4-family vpnv4
[AR2-bgp-af-vpnv4]peer 7.7.7.7 enable

[AR4]bgp 65000
[AR4-bgp]peer 7.7.7.7 as-number 65000
[AR4-bgp]peer 7.7.7.7 connect-interface LoopBack 0
[AR4-bgp]ipv4-family vpnv4
[AR4-bgp-af-vpnv4]peer 7.7.7.7 enable

[AR7]bgp 65000
[AR7-bgp]peer 2.2.2.2 as-number 65000
[AR7-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[AR7-bgp]peer 4.4.4.4 as-number 65000
[AR7-bgp]peer 4.4.4.4 connect-interface LoopBack 0
[AR7-bgp]ipv4-family vpnv4
[AR7-bgp-af-vpnv4]peer 2.2.2.2 enable
[AR7-bgp-af-vpnv4]peer 4.4.4.4 enable

# —————————————————————————- # 传递路由

# ————————————————– # Site A

[AR3]bgp 65002
[AR3-bgp]peer 10.0.23.2 as-number 65000
[AR3-bgp]ipv4-family unicast
[AR3-bgp-af-ipv4]peer 10.0.23.2 enable
[AR3-bgp-af-ipv4]network 192.16[……]

READ MORE

「BGP」- 报文格式

概览格式
BGP 报文格式如图所示:
注:此图并不严谨:BGP Packet 的 Open、Update、Notification … 并非字段,而是不同类型的 BGP Packet 载荷;
Header: BGP Header

主要字段解释如下:
Marker:长度:16-Byte;用于标明 BGP 报文边界,所有 bit 均为“1”;
Length:长度:2-Byte;BGP 报文总长度(包括报文头在内),以 Byte 为单位。
Type:长度:1-Byte;BGP 报文的类型。其取值从 1-5 来表示 5 种报文,分别表示 Open、Update、Notification、Keepalive、Route-refresh 报文;
Payload: BGP Packet
BGP 存在 5 种类型的报文,不同类型的报文拥有相同的头部(header)。
报文名称,作用,发送时刻:
Open:协商 BGP 对等体参数,建立对等体关系;
BGP TCP连接建立成功之后
Keepalive:标志对等体建立,维持BGP对等体关系
BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接
Update,发送 BGP 路由更新
当 BGP Peer 关系建立后,如果有路由需要发送或路由变化,则向对等体发送Update报文
Notification,报告错误信息,中止对等体关系;
当 BGP 在运行中发现错误时,发送 Notification 报文将错误通告给 BGP Peer;
Route-Refresh,用于当本端改变路由策略后,要求 BGP Peer 重新发送路由信息。只有支持 Router Refresh 能力的 BGP 设备会发送和响应此报文
当路由策略发生变化时,触发请求对等体重新通告路由[……]

READ MORE

「BGP」- Route-Refresh Packet

Route-Refresh 报文用来要求 BGP Peer 重新发送指定地址族的路由信息,一般场景:当本端修改相关路由策略后,让对方重新发送 Update 报文,本端执行新的路由策略重新计算 BGP 路由。
报文格式

相关字段内容如下:
AFI:Address Family Identifier,地址族标识,如 IPv4;
Res.:保留,8 个 bit 必须置 0;
SAFI:Subsequent Address Family Identifier,子地址族标识;
报文示例

Frame 58: 77 bytes on wire (616 bits), 77 bytes captured (616 bits) on interface -, id 0
Ethernet II, Src: HuaweiTe_2e:4a:35 (00:e0:fc:2e:4a:35), Dst: HuaweiTe_0b:50:b5 (00:e0:fc:0b:50:b5)
Internet Protocol Version 4, Src: 10.1.12.1, Dst: 10.1.12.2
Transmission Control Protocol, Src Port: 50115, Dst Port: 179, Seq: 253, Ack: 198, Len: 23
Border Gateway Protocol – ROUTE-REFRESH Message
Marker: ffffffffffffffffffffffffffffffff
Length: 23
Type: ROUTE-REFRESH Message (5)
Address family identifier (AFI): IPv4 (1)
Subtype: Normal route refresh request [RFC2918] with/without ORF [RFC5291] (0)
Subsequent address family identifier (SAFI): Unicast (1)

补充说明
在 Open 报文协商时,会协商是否支持 Route-Refresh
如果 Peer 支持 Route-Refresh 能力,则可以通过 refresh bgp 命令手工对 BGP 连接进行软复位,BGP 软复位可以在不中断 BGP 连接的情况下重新刷新 BGP 路由表,并应用新的策略。
针对不支持 Route-Refresh 能力的 BGP 对等体,可以配置 keep-all-routes 命令,保留该对等体的所有原始路由,这样不需要复位 BGP 连接即可完成路由表的刷新。缺省情况下未开启 keep-a[……]

READ MORE

「JENKINS-PIPELINE」- 发送 HTTP 请求

在 Jenkins Pipeline 中,虽然可以使用 Java 类库或者 Groovy 类库发送 HTTP 请求,但是这不是 Jenkins 推荐的做法。该笔记将记录:在 Jenkins Pipelie 中,如何发送 HTTP 请求。
解决办法
使用 Http Request 插件
插件地址:https://plugins.jenkins.io/http_request
步骤手册:https://www.jenkins.io/doc/pipeline/steps/http_request/
仓库地址:https://github.com/jenkinsci/http-request-plugin
发送普通 HTTP 请求

def response = httpRequest(
url: ‘http://localhost:8080/jenkins/api/json?pretty=true’, // 请求地址
quiet: true, // 不显示请求日志
validResponseCodes: “100:399,403” // 设置可接受的返回码,其他状态码将返回异常
)

println(response.status)
println(response.content)

使用 Basic Auth 认证
第一步、创建用户及密码凭证
Credentials => Add Credentials => Username with password
第二步、在请求中引用凭证

def response = httpRequest(
url: ‘http://localhost:8080/jenkins/api/json?pretty=true’,
authentication: “<credentialsId>”,
)

参考文献
Pipeline Steps Reference/HTTP Request PluginvalidResponseCodes cannot be empty or nullHow to pass a range of validResponseCodes for Jenkins pipeline httpRequest methodBasic Auth with Jenkins http-request-plugin[……]

READ MORE

「TMV」- 运维工程师 | Operations Engineer | 岗位了解 | 工作内容 | OPERATIONS-ENGINEER

认识
运维工程师是负责维护和管理计算机系统、网络和服务器的专业人员。主要职责是确保计算机系统的稳定运行,并解决系统故障和问题。
运维部(运行维护部),Operation Maintenance Department
运维用英文说是 Operation,还是 Operation And Maintenance?| https://segmentfault.com/q/1010000042699041
运维是运营(Operation)+维护(Maintenance),所以全称是 O&M。其实 O&M 不只局限于软件,现实中很多项目都是需要运维人员的,比如水电站、基站等等。但软件领域的话直接说 Operation 指代运维也是可以的,而且似乎这种反倒是更常见的。毕竟运维人员是直接被叫做 Operator (早期互联网也有叫 SRE 的,但现在比较少见了,因为现在的项目往往不只有 Site)。比如 AWS 对“云运维”的叫法是 Cloud Operations
参考
介绍运维工程师 —— ChatGPT 3.5[……]

READ MORE

「WordPress」- REST API Handbook

描述
通过 WordPress API 可以操作 WordPress 站点的方方面面,比如文章增删改查、选项管理、主题修改、插件开发等等。
按照功能特征,这些 API 被分为不同的章节,详细内容参考官方 WordPress APIs 手册。
我们这里主要关注 REST API,通过 REST API 能够操作 WordPress 站点,比如文章变更、分类设置等等。
该笔记将记录:在 Wordpress 中,如何通过 REST API 进行文档操作,以及常见问题解决办法。
应用
在旧版本(不记得什么时候了)的 WordPress 中,并没有内置 REST API,貌似需要单独安装;
在新版本(也不知道哪个版本开始)的 WordPress 中,已经内置了 REST API,可以直接使用;
# 03/13/2020 目前,我们使用的是 4.9 版本,所以这里是基于 WordPress 4.9 版本进行介绍;
# 05/08/2022 现在,我们使用 5.9.3 版本,追随官方更新,该笔记是对之前内容不断补充的结果;
参考 REST API Handbook 手册,以获取更多的官方说明。
第一步、添加 NGINX 重写
接口地址通常是 http://example.org/wp-json/wp/v2 的形式,鉴于 wp-json/ 并非目录,所以需要配置 Nginx 重写来传递给 index.php 处理:

location / {
try_files $uri $uri/ /index.php?$args;
}

当修改配置且重启 Nginx 后,可以访问 http://example.org/wp-json/wp/v2 以验证是否配置成功。
第二步、安装认证插件并配置
如果没有认证插件,只能进行查询,不能进行增删改。参考 Authentication 手册,获取对于认证相关内容的官方说明。
我们采用 Application Passwords 认证插件,创建密码的大致流程如下(详细的使用方法请仔细阅读插件描述):
1)在管理页面,进入某个用户的信息设置页面;
2)页面最底部,New Application Password Name,该字段仅是标识密码,仅注释作用;
3)点击 Add New Application Password 按钮,将自动生成密码,请注意保存;
# 05/08/2022 我们发现该插件已经合并到 Wordpress 5.6 版本(Application Passwords);
第三步、修改文章测试
上述配置完成后,即可访问 REST API 来测试文章的创建:

# 如下命令,将创建标题为 New Title 的文章:
curl –header “Aut[……]

READ MORE

「PRODUCTIVITY-TOOLS」- 飞书 | Fieshu | Lark | 即时通讯

组成
日志存储路径
~/.config/LarkShell/sdk_storage/log/feishu-xxxxxx.log
构建
安装
下载 | https://www.feishu.cn/download
dpkg -i xxx.deb
安装目录:/opt/bytedance/xxxx
https://flathub.org/apps/cn.feishu.Feishu
flatpak install flathub cn.feishu.Feishu
卸载
apt-get purge bytedance-feishu-stable
升级
# 05/07/2024 升级到 7.11.9 版本
应用
常用
自定义机器人发送通知:

curl -X POST “https://open.feishu.cn/open-apis/bot/v2/hook/{webhook}” \
-H ‘Content-Type: application/json’ \
-d ‘{“msg_type”:”text”,”content”:{“text”:”Hello, world!”}}’

语法格式:Markdown – Developer Guides – Documentation – Feishu Open Platform
改进
当 Ubuntu 20.04 LTS 升级 Ubuntu 22.04 LTS 后,飞书无法正常启动
原因分析:

# strace /opt/bytedance/feishu/bytedance-feishu

getpid() = 33327
openat(AT_FDCWD, “/home/k4nz/.config/LarkShell/sdk_storage/log/apollo_2023.0426.log”, O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 ENOENT (No such file or directory)
gettid() = 33327
getpid() = 33327
openat(AT_FDCWD, “/home/k4nz/.config/LarkShell/sdk_storage/log/apollo_2023.0426.log”, O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 ENOENT (No such file or directory)
exit_group(0)[……]

READ MORE

「LINUX-SHELL-SCRIPTING」- Linux | 脚本编程 | Shell Scripting | LINUX-SHELL-SCRIPTING

认识
GNU Bash manual:https://www.gnu.org/software/bash/manual/bash.html怎样写出规范的 shell 脚本(仅限 Scripting with style)https://www.tutorialspoint.com/unix/case-esac-statement.htm
1)理论:掌握 Shell 脚本的编写方法,及与 Shell 编程有关的内容;
2)实践:能够进行 Shell 编写,并且编写出可移植性高的脚本是个非常重要的目标;
书籍文章:
1)《Linux Shell 脚本攻略(第 2 版)》
官方文档:

POSIX / Shell Command Language
https://www.gnu.org/software/bash/manual/bash.html

针对 Bash 的学习,我们将沿用 Bash Reference Manual 的结构,逐步深入学习;
组成
// ONHD 我们是 Shell 的用户,暂时不需要关心 Shell 实现的内部架构。
Shell(抽象概念)
shell 只是一个执行命令的宏处理器。术语宏处理器是指扩展文本和符号以创建更大表达式的功能;
Unix shell 既是命令解释器又是编程语言。作为命令解释器,shell 为丰富的 GNU 实用程序集提供了用户界面。编程语言特性允许组合这些实用程序。可以创建包含命令的文件,并使其本身成为命令。这些新命令与 /bin 等目录中的系统命令具有相同的地位,允许用户或组建立自定义环境以自动执行他们的常见任务;
可以交互或非交互地使用外壳。在交互模式下,它们接受键盘输入。当以非交互方式执行时,shell 执行从文件中读取的命令;
我们这里学习的脚本编程,属于非交互模式运行;
Bash(具体实现)
Bash 是 GNU 操作系统的 shell 或命令语言解释器。该名称是“Bourne-Again SHell”的首字母缩写词,是对 Stephen Bourne 的双关语,Stephen Bourne 是当前 Unix shell sh 的直接祖先的作者,它出现在 Unix 的第七版贝尔实验室研究版中;
Bash 是众多 Shell 的一种,还有其他很多类型的 Shell 实现:sh csh ksh dash;
Bash 在很大程度上与 sh 兼容,并结合了 Korn shell ksh 和 C shell csh 的有用特性。它旨在成为 IEEE POSIX 规范(IEEE 标准 1003.1)的 IEEE POSIX Shell 和工具部分的一致实现。它为交互和编程使用提供了对 sh 的功能改进;
应用
该笔记将记录:与 Shell 相关的概念术[……]

READ MORE

「SHELL-SCRIPTING」- 概念术语

Bash 是“Bourne-Again SHell”的首字母缩写词。Bourne shell 是传统的 Unix shell,最初由 Stephen Bourne 编写。Bash 中提供了所有 Bourne shell 内置命令,评估和引用规则取自“标准”Unix shell 的 POSIX 规范。
shell 的“构建块”:命令、控制结构、shell 函数、shell 参数、shell 扩展、重定向,这是一种直接从命名文件输入和输出的方法,以及 shell 如何执行命令。
关于 Shell 编程语言的学习。既然是编程语言的学习,自然也就逃不开编程语言的那一套:变量,数组,类型函数等等概念;
该部分还整理了 Shell 中的常见错误,包括脚本错误,命令错误等等。
01)变量参数:用于存储数据的容器;
02)数据类型:描述变量可以存储的数据的种类,如整数、浮点数、布尔值等;
03)运算符号:用于对变量进行操作的符号,如加减乘除等;
04)控制结构:用于控制程序如何执行的结构,如条件语句、循环语句等;
if and if !
循环语句 | for

#!/bin/bash

step=1
for (( i = 0; i < 60; i=(i+step) )); do
curl “http://www.baiud.ocm/”
sleep $step
done
exit 0

05)函数方法:一段可重复使用的代码,用于完成特定的任务;
定义函数
How do I unset or get rid of a bash function?
执行命令:unset -f function_name
执行数学运算
How to add arithmetic variables in a script
以下是几种不同的写法,以及各自的兼容性:

# portable but slow
a=`expr “$a” + “$num”`

# POSIX and portable except to the Bourne shell and earlier versions of the Almquist shell
a=$(($a+$num))

# require ksh, bash or zsh
((a=a+num))

let a=a+num

((a+=num))

06)类和对象:面向对象编程中的基本概念,用于描述现实世界中的事物;
07)模块单元:用于组织代码的单元,可以将代码分成多个文件或模块,提高代码的可维护性和重用性;
08)注释注解:用于在代码中添加说明性文字,方便其他人理解代码;
09)异常处理:用于处理程序中可能出现的错误或异常情况;
10)编译解释:编程语言的执行方式,编译将[……]

READ MORE

「MPLS-VPN」- BGP/MPLS IP VPN | 域内

认识
BGP/MPLS IP VPN,简称 MPLS VPN,也是 VPN 技术中的一种,这是种常见被业界广泛使用的 Layer 3 VPN 技术。
该部分笔记,我们将以BGP/MPLS IP VPN为例学习MPLS VPN技术原理。在后续内容中,MPLS VPN 即指 BGP/MPLS IP VPN,除非特别指出;
组成
BGP/MPLS IP VPN 网络通常由运营商搭建,用户购买其服务来实现用户网络之间的路由传递、数据互通等。注意 MPLS VPN 的骨干网也可以由企业自行搭建,技术层面与运营商搭建基本一致,我们这里讨论的是企业购买运营商 MPLS VPN 服务的场景;
1999, RFC 2547, https://www.rfc-editor.org/rfc/rfc2547.html#page-8
2006, RFC 4364, https://www.rfc-editor.org/rfc/rfc4364
MPLS VPN 使用 BGP 在运营商骨干网(IP-Network)上发布 VPN 路由,使用 MPLS 在运营商骨干网上转发 VPN 报文;
性质
针对 VPN Customer 而言:

“感知”不到 VPN 的存在,不需要部署和维护 VPN,降低企业运维难度和成本;
一般部署在运营商的 MPLS VPN 专网上,有一定的安全性保障,不容易被入侵;

针对 ISP 而言:

在无连接的 IP-Network 中,MPLS 增加面向连接的控制平面,为 IP-Network 增添管理和运营的手段;
支持地址空间重叠、支持重叠 VPN、组网方式灵活、可扩展性好;
能够方便地支持 MPLS TE 合理调控现有网络资源,最大限度的节省运营商成本;

补充说明:

MPLS TE(MPLS Traffic Engineering,MPLS 流量工程):基于一定约束条件 LSP 隧道,并将流量引入到这些隧道中进行转发,使网络流量按照指定的路径进行传输。在不进行硬件升级的情况下,实现对现有网络资源进行合理调配和利用,并对网络流量提供带宽和 QoS 保证,最大限度的节省成本;

应用
BGP/MPLS IP VPN 网络通常由 ISP 搭建,用户购买其服务来实现用户网络业务,例如,路由传递、数据互通、……[……]

READ MORE

「MPLS-VPN」- 概念术语

组网架构

基本的 MPLS VPN 网络架构由三部分组成:
1)CE(Customer Edge):用户网络边缘设备,任何设备,有接口直接与运营商网络相连。通常 CE 感知不到 VPN 的存在,也不需要支持 MPLS 协议;
2)PE(Provider Edge):运营商边缘路由器,是运营商网络的边缘设备,与 CE 直接相连。在 MPLS 网络中,对 VPN 的所有处理都发生在 PE 上,对 PE 性能要求较高;
3)P(Provider):运营商网络的骨干路由器,不与 CE 直接相连。P 设备只需要具备基本 MPLS 转发能力,不维护 VPN 相关信息;
Site
Site(站点)就是 MPLS VPN 的用户,由 CE 和其他用户设备构成。注意:Site 也有可能仅为一台主机的情况,此时该主机就是 CE 设备。我们学习的 Site 是一个或多个子网,用路由器或交换机作为 CE 的情况;
Site 的含义可以从下述几个方面理解:
1)站点是指相互之间具备 IP 连通性的一组 IP 系统,并且这组 IP 系统的 IP 连通性不需通过运营商网络实现;
2)站点的划分是根据设备的拓扑关系,而非地理位置。如图所示,公司 A 的 X 省网络和公司 A 的 Y 省网络需要通过运营商的骨干网进行互联,所以它们被划分为两个站点。若在当前 X 省网络和 Y 省网络的 CE 之间增加一条物理专线,不需要通过运营商网络就可以互通,那么这两张网络就是一个站点;
Site 与 VPN 的关系:
1)对于多个连接到同一服务提供商网络的站点,通过制定策略,可将它们划分为不同的集合,只有属于相同集合的站点间才能通过服务提供商网络互访,该集合就是 VPN;
2)一个 Site 中的设备可以属于多个 VPN,换言之,一个 Site 可以属于多个 VPN;
技术架构
MPLS VPN 不是单一的一种 VPN 技术,是多种技术结合的综合解决方案,主要包含下列技术:

1)路由协议:静态路由、IGP、BGP,负责 PE 与 CE 之间的路由信息交换;
2)MP-BGP:负责在 PE 与 PE 间传递站点内的路由信息;
3)LDP:负责 PE 与 PE 间的隧道建立;
4)VRF:负责 PE 的 VPN 用户管理;
组网形态(组网方案,常见组网)
根据 VPN 用户的需求不同,可采用以下几种常见的组网方案:
Intranet
特征:同个 VPN 的所有用户形成闭合用户群,同个 VPN 站点之间可以互访,不同 VPN 站点间不能互访;
场景:Intranet 组网是最简单也是最典型的 MPLS VPN 组网方案,我们将基于该组网方案对 MPLS VPN 技术原理进行学习;

本例中有四个CE站点分别属于[……]

READ MORE

「MPLS-VPN」- 概述工作原理

原理概述(总结)
第一阶段、路由分发:路由传递及标签分配

CE1 与 PE1 之间运行 IGP/BGP 交互路由信息(IPv4 Route);
PE1 收到 CE1 的路由后,将其转化为 VPNv4 路由,并通过 MP-IBGP 发送给 PE2,同时分配 VPN 标签 V1(内层标签);
PE2 收到 VPNv4 路由后,将其转化为 IPv4 路由,并通过 IGP/BGP 发送给 CE2;
MPLS 骨干网内部 PE 及 P 设备之间运行 LDP 协议,用于分配隧道标签。假设 PE1、P 为 PE1 分配的标签分别为 T1、T2(外层标签);
补充说明:
1)只有 PE 感知 VPN 路由信息,P 设备不感知;
2)骨干网采用 MPLS 隧道转发避免路由黑洞;
第二阶段、数据转发:

CE2 发送一个目的地址为 Net1 的 IPv4 报文;
PE2 收到报文后进行 MPLS 标签的封装,先封装 VPN 标签 V1,再封装外层标签 T2,然后将此报文发送给 P;
P 进行标签交换,把外层标签 T2 换成 T1,然后将此报文发送给 PE1;
PE1 收到后去掉所有标签,将 IPv4 报文转发给 CE1;
第一阶段、路由分发
Route Distributing (Left to Right)
第二阶段、数据转发
Data Forwarding (Right to Left)[……]

READ MORE

「MPLS-VPN」- 控制平面:路由发布、路由传递

问题描述
若想实现同一个 VPN 的不同站点之间的通信,首先需要完成不同站点之间的路由交互。在基本 MPLS VPN 组网中,VPN 路由信息的发布涉及 CE 和 PE,而 P 只维护骨干网的路由,不需要了解任何 VPN 路由信息;
解决方案
VPN 路由信息的发布过程包括三部分:
本地 CE 到入口 PE
入口 PE 到出口 PE
出口 PE 到远端 CE
路由(指 Site-A 内的路由信息)的发布过程包括三部分:
1)Local-CE 到 Local-PE,即 CE1 ⇒ PE1;
2)Local-PE 到 Right-PE,即 PE1 ⇒ PE2;
3)Right-PE 到 Right-CE,即 PE2 ⇒ CE3;

CE ⇒ PE(CE1 => PE1)

如图,User-X 和 User-Y 属于不同的 VPN,分别拥有两个站点,现需要实现站点间的路由信息交互:
1)在 CE 与 PE 间,可以使用静态路由、OSPF、IS-IS、BGP 交换路由信息;
2)无论使用哪种路由协议,CE 和 PE 间交换的都是标准的 IPv4 路由(我们这里学习的是 IPv4 相关场景);
本地 CE 到入口 PE 和出口 PE 到远端 CE 的路由信息交换原理完全相同;
PE ⇒ PE(PE1 => PE2)
问题:用户的地址空间出现重叠
但是,VPN 是种私有网络,不同的 VPN 独立管理自己的地址范围,也称为地址空间(address space)。不同 VPN 的地址空间可能会在一定范围内重合,例图中 User-X 和 User-Y 都使用 192.168.1.0/24 网段地址,即地址空间的重叠(address spaces overlapping);

以下两种情况允许 VPN 使用重叠的地址空间:两个 VPN 没有共同的站点,即相互独立;两个 VPN 有共同的站点,但此共同站点中的设备不与两个 VPN 中使用重叠地址空间的设备互访;
所以,当 PE 接收到 CE 传递来的路由后,需要独立保存不同 VPN 的路由,且需要解决不同的客户使用重叠地址空间的问题;
首先:本端需要区分用户的路由(VRF)
既然地址空间重叠,我们需要先确定收到的多个相同路由分别是来自哪个用户,以将路由传递到正确的对端;
解决方案是 VRF,其是 MPLS VPN 架构中的关键技术,设备接口分属不同的 VRF 实例,每个 VRF 使用独立的路由转发表项,实现 VPN 间的逻辑隔离;

然后:远端需要区分用户的路由(VPNv4, RD)
Left-PE 收到不同 VRF Instance 的 CE 发来的 IPv4-Route 条目,Left-PE 能根据 VRF 配置去区分这些 I[……]

READ MORE

「MPLS-VPN」- 数据转发

问题描述
前面 MP-BGP 已经完成路由传递,接下来可以开始进行数据转发。但是,中间 P 设备是没有路由的,那么数据转发是如何进行的呢?

如图所示,这里存在两个问题:
1)中间的 P 设备无路由,所以无法转发来自 PE2 的数据;
2)远端的 PE1 无法区分数据所属的站点;
解决方案
数据转发是通过 Lable(标签)解决的,简单说,就是涉及两层标签:
1)第一层标签(外层),用于数据在 P、PE 间进行转发;
2)第二层标签(内层),用于区分数据所属站点(VRF-Inst)

详细解释
外层标签:在 PE 和 P 间,运行 LDP 协议,交换公网标签,建立 PE 间的 LSP 隧道(公网隧道);
内层标签:入口 PE,PE 之间建立 MP-BGP 邻居关系,并分配私网标签,在通过 MP-BGP 传递 VPNv4 路由时,会携带私网标签,用于区分不同 VPN 的数据;
隧道迭代:出口 PE 在接收到 VPNv4 路由后,需要执行私网路由交叉和隧道迭代来选择路由;

PE 上分配私网标签的方法有如下两种:
1)基于路由的 MPLS 标签分配:为 VPN 路由表的每一条路由分配一个标签(one label per route)。这种方式的缺点是:当路由数量比较多时,设备入标签映射表 ILM(Incoming Label Map)需要维护的表项也会增多,从而提高了对设备容量的要求;
2)基于 VRF 实例的 MPLS 标签分配:为整个 VRF 实例分配一个标签,该 VRF 实例里的所有路由都共享一个标签。使用这种分配方法的好处是节约标签,也是目前采用的方法,也是我们正在学习的方法;
私网路由交叉:VPNv4-Route 与本地 VRF 实例的 RT 进行匹配的过程称为私网路由交叉。PE 在收到 VPNv4 路由后,既不进行优选,也不检查隧道是否存在,直接将其与本地的 VPN 实例进行交叉;
隧道迭代:为了将私网流量通过公网传递到另一端,需要有一条公网隧道承载这个私网流量。因此私网路由交叉完成后,需要根据目的 IPv4 前缀进行路由迭代,即该 IPv4 路由的下一跳有对应的 LSP 存在;只有隧道迭代成功,该路由才被放入对应的 VRF 实例路由表。
要想理解数据转发,我们认为这里有两点非常关键:
1)当 PE2 收到报文时,他会首先查找去往 192.168.1.0/24 的路由,该路由是由 MP-BGP 传递过来,在传递路由时 MP-BGP 已为该路由分配标签,所以报文将被添加该标签(即内层标签);
2)该路由的 Next-Hop 是 PE1,然后设备会去查询去往 PE1 的路由,而到达 PE1 的路由在 MPLS Domain 中,也被分配标签,所以该报文将被添加外层标签;[……]

READ MORE

「BGP/MPLS-IP-VPN」- 组网场景

组网场景
BGP/MPLS IP VPN 因其支持地址空间重叠、组网方式灵活、可扩展性好,并能够方便地支持 MPLS TE 等系列优点,已经在广域 IP 承载网络得到了广泛的应用;
针对不同客户的业务需求以及组网情况,MPLS VPN 的部署方式不尽相同。我们将学习几种常见的 MPLS VPN 应用场景与这些场景下 MPLS VPN 的部署方法;
Intranet
在该组网方案中,具有如下特性:
1)内部互联:同个 VPN 实例中的所有用户形成闭合用户群,相互之间能够进行流量转发,其站点通常是属于同一个组织;
2)隔离外部:在 VPN 示例中的用户不能与任何本 VPN 实例以外的用户通信;
实现方式:
1)PE 需要为每个站点创建 VPN 实例,并配置全网唯一的 RD 参数;
2)PE 通过配置 IRT 和 ERT 来控制不同 VPN-Site 来实现无法互访;
Extranet
场景:VPN 用户 Site 2 将站点的部分网络资源分享给其他 VPN 实例的用户进行访问;

如图,Site 2 作为能被 VPN1 和 VPN2 访问的共享站点,需要保证:

PE2 能够接收 PE1 和 PE3 发布的 VPNv4 路由;
PE2 发布的 VPNv4 路由能够被 PE1 和 PE3 接收;
PE2 不把从 PE1 接收的 VPNv4 路由发布给 PE3,也不把从 PE3 接收的 VPNv4 路由发布给 PE1;

实现:

通过 RT 来控制通告的路由信息,即在 PE2 上配置 IRT ERT 参数,以同时接收来自 Site1 Site3 的路由;

Hub & Spoke
场景:

能够将多个站点中的某个站点设置为 Hub-Site,其余为 Spoke-Site;
站点间的互访必须通过 Hub-Site,通过 Hub-Site 集中管控站点间的数据传输;

实现:

Spoke-Site 需要把路由发布给 Hub-Site,再通过 Hub-Site 发布给其他 Spoke-Site,而 Spoke-Site 间不直接交互路由信息;
Spoke-PE 需要设置 ERT 为“Spoke”,IRT 为“Hub”;
Hub-PE 上需要使用两个接口或子接口(创建两个 VPN Instance):

一个用于接收 Spoke-PE 发来的路由,其 VPN 实例的 Import Target 为“Spoke”;
另一个用于向 Spoke-PE 发布路由,其 VPN 实例的 Export Target 为“Hub”;

1)Spoke-CE1 发布路由给 Spoke-PE1;
2)Spoke-PE1[……]

READ MORE

「OSPF」- 针对 MPLS VPN 的扩展

在 MPLS VPN 中的 OSPF/BGP 扩展
问题描述

当 PE-CE 间部署 OSPF 交互路由信息时,若在 PE 上使用标准 BGP/OSPF 过程(简称为 BGP/OSPF 互操作)互来传递路由信息,则 Remote-PE 在将 BGP 引入 OSPF 进程时,会直接产生 Type5 LSA 路由,此时不同站点都会将其他站点的路由视为自治系统外部路由(AS_external);
在实际应用中,如果两个要互通的 Site 都在相同的 AS 内,那么每个 Site 都应该将另个 Site 的路由视为区域间路由,而不是 AS 外部路由。此时 PE2 应该视为 ASBR 设备;
解决方案
为了解决标准 BGP/OSPF 的互操作导致的 OSPF 路由信息丢失的问题,BGP 和 OSPF 得以拓展;
为了保留 OSPF 的路由信息,BGP.Path-Attr.Ext-Comm 能够携带 OSPF 路由信息:
1)Domain ID:域标识符,用来标识和区分不同的域;默认为空(0.0.0.0);
2)Route Type:包含被引入到 BGP 的 OSPF-Route 的 Area-ID 以及 Route Type 信息;
3)Router ID:是 PE.OSPF 的 Router ID 信息;

注:该图仅表达其中的若干字段、交互大致过程,并未准确显示报文字段信息;
Domain ID
在 PE 上,将 BGP import OSPF 时,PE 将根据本地配置为 BGP-Route 增加 Domain ID 属性,并在 BGP.Path-Attr.Ext-Comm 中传播;
在 PE 上,将 OSPF import BGP 时:
1)若 BGP-Route.Domain-ID == OSPF.Domain-ID 时,则认为两个站点属于同个 OSPF 路由域;
2)若 BGP-Route.Domain-ID != OSPF.Domain-ID 时,则认为该路由来自不同的路由域;
Domain ID 需要在绑定到 VRF-Inst 的 OSPF 视图下使用命令 domain-id 配置:
1)缺省,Domain-ID=0(NULL)。若不同 OSPF Domain 都使用 NULL 作为 Domain ID,将无法区分 OSPF 域,此时它们间的路由将被当作区域内路由;
2)如果一个 OSPF Domain 配置非 0(即非 NULL)的 Domain ID,NULL 不再是该 OSPF Domain 的 Domain ID;
3)建议与同个 VPN 相关的所有 OSPF 都使用相同的 Domain ID,或者都使用缺省的 Domain ID;
Area-ID
PE.OSPF[……]

READ MORE

「MPLS」- 标签分发协议 | LDP | Label Distribution Protocol | RFC 5036,2007

认识
MPLS 是种根据标签报文中携带的短而定长的标签来转发数据的技术,所以 MPLS 的基本概念就是两台 LSR 必须对在它们之间转发的数据的标签使用上“达成共识”。
在 LSR 间,运行 LDP(Label Distribution Protocol,标签分发协议)来告知其他 LSR 本设备上的标签绑定信息,从而实现标签报文的正确转发。
简而言之,类似动态路由协议,手动管理和配置过于繁琐,所以创造出新的协议来自动完成配置
2001, RFC 3036, https://datatracker.ietf.org/doc/html/rfc3036
2007, RFC 5036, https://www.rfc-editor.org/rfc/rfc5036.html
补充说明:

该标签分发协议 LDP 特指由 RFC 3036 首次定义的标签分发协议,当前该标准已被 RFC 5036 废弃。
除了 LDP 外,标签分发协议也可以指 MP-BGP、RSVP 等可执行标签分发的一类协议(即 LDP 可指特定协议,亦指某类协议);

组成
LDP 的工作过程主要分为两部分:
1)在 LSR 间,建立 LDP Session;
2)在 LSR 间,基于 LDP Session 动态交换 Label 与 FEC 的映射信息,并根据标签信息建立 LSP 路径;

简单说就是:通过 LDP 协议,本端设备 将 针对特定 FEC 所使用的标签值 通知给 上游设备(“上游”指数据报文的来源,而非 LDP 来源)。
性质
LDP 规定标签分发过程中的各种消息以及相关处理过程;
LDP 是 MPLS 的一种控制协议,相当于传统网络中的信令协议,负责 FEC 的分类、标签的分配、LSP 的建立和维护等等操作。
LDP 配置和维护相对简单
缺点:
1)MPLS LDP LSP 基于 IP 最短路径建立,无法进行隧道转发路径规划;
注意事项:很多协议,例如 MP-BGP 等等,能够用来分发各种信息。在学习的过程中,要注意这些协议分发的内容。如果分发的内容不同,其数通中扮演的角色也不同。为什么要强调这个?前面我们提到 MP-BGP 能够分发标签来建立 LSP 路径,后面我们会还会用到 MP-BGP 用来分发 VPNv4 路由 ———— 一定要注意区分这些协议的所分发的内容,不然会非常的混乱;
应用
运营商建设 MPLS VPN 广域承载网
广泛应用于 BGP/MPLS IP VPN 场景下的 LSP 的创建。例如本图中运营商建设 MPLS VPN 广域承载网为客户提供跨省的 L3VPN 业务;[……]

READ MORE

「MPLS/LDP」- 概念术语

LDP Adjacency
两台 LSR 之间,当交互 Hello 消息后,即建立起邻接体(Adjacency)关系;
LDP Session and LDP Peer
在 LSR 间,当交互标签绑定消息前,必须建立 LDP 会话(类似 BGP,也采用 TCP 连接);
LDP Session 可以分为:

本地 LDP 会话(Local LDP Session):建立会话的两个 LSR 之间是直连的;
远程 LDP 会话(Remote LDP Session):建立会话的两个 LSR 之间可以是直连的,也可以是非直连的;

补充说明:

L2 MPLS VPN 会使用 Remote LDP Session 技术,我们这里主要学习 Local LDP Session 技术;

在建立邻接体关系的基础上,两台 LSR 间交互 LDP 会话消息,建立起 LDP Session,两台设备之间形成 LDP Peer 关系;
LDP ID = LSR ID + Label Space ID
每台运行 LDP 的 LSR 除了必须配置 LSR ID,还必须拥有 LDP ID;
LDP ID 的长度为 48bit,由 32bit 的 LSR ID 与 16bit 的 Label Space ID(标签空间标识符)构成;
LDP ID 以“<LSR-ID (32bit)>:<Label-Space-ID (16-bit)>”的形式呈现。例如 2.2.2.2:0;
Label Space ID,虽然 16bit,但通常存在两种形态:

值为 0:表示基于设备(或基于平台)的标签空间(针对同个 FEC,所有邻居设备将看到相同的标签值,即针对所有邻居,同个 FEC 同个 Label 值);

在华为或思科中,其均使用基于设备(或基于平台)的标签空间,即:针对同个 FEC,分发给不同邻居的标签值是相同的;

值非 0:表示基于接口的标签空间(针对同个 FEC,所有的邻居设备将看到不相同的标签值,即针对不同邻居,同个 FEC 不同 Label 值);

LDP Message
在运行 LDP 的 LSR 间,通过交换 LDP Message 来实现邻居发现、会话建立与维护、标签管理等等功能;
按照消息的功能,LDP 消息共可以分为四大类型:
1)发现消息(Discovery Message),用来宣告和维护网络中一个 LSR 的存在;用于通告和维护网络中 LSR 的存在,如 Hello 报文;
2)会话消息(Session Message),用于建立、维护和终止 LDP 对等体之间的会话,如 Initialization 报文、KeepAlive 报文[……]

READ MORE

「MPLS/LDP」- 报文格式

LDP 协议报文包括:
1)LDP Header:携带 LDP 版本、报文长度等信息;
2)LDP Message:携带消息类型、消息长度等信息;

LDP Header
长度为 10Byte,包括三部分:
Version,占用 2Byte,表示 LDP 版本号,当前版本号为 1;
PDU Length,占用 2Byte,以字节为单位表示除了 Version 和 PDU Length 以外的其他部分的总长度;
LDP Identifier,LDP ID,长度 6Byte:前 4Byte 用来唯一标识一个 LSR;后 2Byte 用来表示 LSR 的标签空间;
LDP Message
包含五个部分:
U(Unknown Message bit)占用 1 bit,当 LSR 收到一个无法识别的消息时,对该消息的 U 字段:
1)当 U=0 时,LSR 会返回给该消息的生成者一个通告;
2)当 U=1 时,忽略该无法识别的消息,不发送通告给生成者;
Type,表示具体的消息类型,目前 LDP 定义的常用的消息有:Notification,Hello,Initialization,KeepAlive,Address,Address Withdraw,Label Mapping,Label Request,Label Abort Request,Label Withdraw,Label Release;
Message Length,占用 2Bytes,以字节为单位表示 Message ID、Mandatory Parameters、Optional Parameters 的总长度;
Message ID,占用 32bit,用来标识一个消息;
Mandatory Parameters、Optional Parameters:分别为可变长的该消息的必须的参数和可选的参数;[……]

READ MORE

「MPLS/LDP」- 会话建立

会话状态机
LDP Session 协商过程可以通过状态机来描述,LDP 使用 5 种状态描述 LDP 会话状态机:Non-Existent,Initialized,OpenRec,OpenSent,Operational;
LDP 状态切换信息可以通过指令 debug mpls ldp session 看到;

Non-Existent:该状态为 LDP Session 最初的状态,在此状态双方发送 HELLO 消息,选举主动方,在收到 TCP 建立成功事件的触发后变为 Initialized 状态;
Initialized:该状态下分为主动方和被动方两种情况:
1)主动方将主动发送 Initialization 消息,转向 OpenSent 状态,等待回应的 Initialization 消息;
2)被动方在此状态等待主动方发给自己的 Initialization 消息;
3)被动方如果收到的 Initialization 消息,并且参数可以接受,则发送 Initialization 和 KeepAlive 报文,并转向 OpenRec 状态;
4)主动方和被动方在此状态下收到任何非 Initialization 消息或等待超时时,都会转向 Non-Existent 状态;
OpenSent:此状态为主动方发送 Initialization 消息后的状态,在此状态等待被动方回答 Initialization 和 KeepAlive 消息,
如果收到的 Initialization 消息中的参数可以接受,则转向 OpenRec 状态;
如果参数不能接受或 Initialization 超时,则断开 TCP 连接转向 Non-Existent 状态;
OpenRec:在此状态,不管主动方还是被动方,都是发出 KeepAlive 后的状态,在等待对方回应 KeepAlive 消息;
只要收到 KeepAlive 消息就转向 Operational 状态;
如果收到其它消息或 KeepAlive 超时,则转向 Non-Existent 状态;
Operational:该状态是 LDP Session 成功建立的标志。在此状态下可以发送和接收所有其它的 LDP 消息;
在此状态如果 KeepAlive 超时或收到致命错误的 Notification(Shutdown 消息)或自己发送 Shutdown 消息主动结束会话,都会转向 Non-Existent 状态;
发现阶段与连接建立(Non-Existent ⇒ Initialized)

发现阶段
设备通过周期性地发送 LDP Link Hello(LDP 链路 Hello 报文),实现 LDP 基本发现机制;
如果 LSR 在特[……]

READ MORE

「MPLS/LDP」- 标签分发 | 标签的发布和管理

在 MPLS Network 中,Downstream-LSR 决定 Label 和 FEC 的绑定关系,并向 Upstream LSR 发布这种绑定关系;
然后,通过 LDP 发送 标签请求 和 标签映射 消息,在 LDP Peer 间通告 FEC 和 Label 的绑定关系来建立 LSP 路径;
补充说明:
1)标签分配:LSR 从本地 Lable-Space 中取出一个标签与 FEC 绑定;
2)标签分发:LSR 将标签与 FEC 的绑定关系通知给上游 LSR;
标签的发布和管理由三方面共同决定:标签发布方式、标签分配控制方式、标签保持方式;
标签发布方式(Label Advertisement Mode)
下游自主方式(Downstream Unsolicited,DU)
针对一个特定的 FEC,LSR 无需从 Upstream 获得标签请求消息即进行标签分配与分发。简单说,LSR 会主动将自己为 FEC 捆绑的标签通告给 Upstream-LSR 邻居,无需邻居先发起请求再通告;
当 DU 时,系统默认支持 LDP 为所有对等体分标签,即每个节点都可以向所有的 LDP-Peer 发布标签映射关系,不再区分上下游关系。因为在只给上游对等体分标签情况下,发送标签映射消息的时候,要根据路由信息对会话的上下游关系进行确认(数据是双向的,自己既能是上游,又能是下游);
针对华为设备,其默认 DU 模式;
下游按需方式(Downstream on Demand,DoD)
针对一个特定的 FEC,LSR 获得标签请求消息之后才进行标签分配与分发。即只有上游邻居向自己请求标签映射时,LSR 才会通告标签映射给该邻居
一般情况下,对特定 FEC 的访问需求会触发标签请求消息。(那么也就是说这里的 LSP 并非提前建立?)
标签分配控制方式(Label Distribution Control Mode)
独立方式(Independent)
本地 LSR 可以自主地分配一个标签绑定到某个 FEC,并通告给上游 LSR,而无需等待下游的标签;
DU + Independent 行为:简单说就是,随意的通告,邻居之间互相通告;
DoD + Independent 行为:简单说就是,互相通告,但需要等待上游来询问;
有序方式(Ordered)
针对 LSR 上某个 FEC 的标签映射,只有当该 LSR 已经具有此 FEC 下一跳的标签映射消息、或者该 LSR 就是此 FEC 的出节点时,该 LSR 才可以向上游发送此 FEC 的标签映射;
DU + Ordered 行为:简单说就是,从 Egress-LSR 开始,不断向上游传递;

DoD + Ordered 行为,简单说就是,一级一级的向下游请求,然后从 Egre[……]

READ MORE

「MPLS/LDP」- 显式空标签与隐式空标签

PHP | Penultimate Hop Popping
PHP(Penultimate Hop Popping,次末跳弹出),如果激活 PHP 特性,那么 Egress-LSR 在针对本地路由分配标签的时候(注意,这里的分配标签是用于向“次末跳(即上游)”发布的报文,将通告给上游设备),会分配一个特殊标签,Label=3,该标签被称为隐式空标签(Implicit NULL Label);
当 LSR 转发一个标签报文时,如果发现对应的 Out-Label=3,则 LSR 不会再打标签,而是将栈顶标签弹出,并将里面所封装的数据转发给下游 LSR;
PHP 特性存在的目的是为了提高转发效率,否则:最后一跳将进行 ILM 查询得到 Pop 行为,两次查询的第二次是多余的;

开启 PHP 特性:
1)在标签发布时,R3 为作为 192.168.3.0/24 这条 FEC 的 Egress LSR,其在分配标签时,R3 为该 FEC 分配 Label=3,并将该标签绑定信息通告给 R2;
2)在数据转发时,R2 作为到达 192.168.3.0 的次末跳(倒数第二跳),发现 Out-Label=3,于是将标签头部弹出,将 IP 报文转发给 R3,
3)而 R3 则仅需执行一次查询操作(查询 FIB 表)即可获得相应的转发信息,转发效率得到提升;
注意,该拓扑中 R2 为次末跳。但是次末跳与设备位置无关,而与路由(或 FEC)相关。简而言之,目的路由的上一跳为次末跳。
Explicit Null | 显式空标签
描述
缺省情况,开启 PHP 特性,Egress-LSR 向倒数第二跳分配隐式空标签(implicit-null),即特殊标签(Label==3)。但在部署 MPLS QoS 的场景下,标签被弹出后,其中的优先级也会一并丢失,无法进一步进行 QoS 相关的处理。
针对该问题,可以部署 IP QOS 来解决,但是过于复杂。
还有种方法是,显式空标签(Label=0)
原理

1)显式空标签机制,Egress-LSR 向倒数第二跳分配特殊标签(Label=0);
2)当 R3 在转发标签报文时,若出标签封装为 0,则不会将标签头部弹出,标签头部中的 QoS 信息得以保存;
3)R4 在收到带 Label=0 的报文的时候,直接弹出标签,不用去查找 ILM 表项;
应用
华为设备,缺省,Egress-LSR 分配的是隐式空标签,通过 label advertise explicit-null 使能 Egress 节点向倒数第二跳分配显式空标签;[……]

READ MORE

「MPLS/LDP」- 协议交互过程详解(标签分发 + 数据转发)

概述环境
我们将基于如下环境来学习 LDP 的工作过程,包括标签分发及 数据转发两部分;

1)网络互通:在网络中,已经部署 OSPF 协议,且各设备之间能够正常学习到对方的路由信息;
2)开启 MPLS 协议:已在各设备及相应接口上激活 MPLS 及 LDP 协议,且在相邻的设备之间已正常建立本地 LDP 会话;
3)标签发布与管理:所有 LSR 均采用 DU + Ordered + Liberal 方式;
对于从 R1 进入,到达 192.168.4.0/24 的数据,R1 为 Ingress LSR,R4 为 Egress LSR;
标签分发
Egress-LSR

R4 直连网段 192.168.4.0/24,R4 将主动为到达该网段的路由分配标签,如 1041,并主动通过 LDP 协议报文将标签映射通告给 LDP 对等体 R2 和 R3;
Transit-LSR

以 R2 为例,在其路由表中,192.168.4.0/24 路由的下一跳为 R4,当它从 R4 收到关于 192.168.4.0/24 的标签映射通告时,由于该通告来自下游 LDP 邻居,因此这将触发它自己为该路由分配标签 1021,并将标签映射通告给 LDP 邻居(如 R1)。R3 同理;
Ingress-LSR

R1 收到 LDP 邻居 R2 及 R3 通告过来的关于 192.168.4.0/24 路由的标签映射后,将这两个标签都存储起来,
但是由于在自己的路由表中,到达 192.168.4.0/24 的下一跳是 R2,因此当前它只会使用 R2 所通告的标签 1021;
注:当 R2 发生故障时,OSPF 路由将会重新收敛,此时 R1 的路由表中 192.168.4.0/24 路由的下一跳将会切换至 R3,此时 R1 将启用 R3 所通告的、关于 192.168.4.0/24 的标签;
标签转发
Ingress-LSR
R1 作为 Ingress LSR,需要对接收的 IP 报文执行 Push 操作压入标签,并进行标签转发;

当 R1 收到发往 192.168.4.1 的 IP 报文时,首先在其 FIB 表中查询该目的 IP 地址,它发现所匹配的表项的 Tunnel ID 为非 0,
因此继续在 NHLFE 中查询该 Tunnel ID,然后意识到需要将对该 IP 报文压入标签并进行标签转发,出接口为 GE0/0/0、下一跳为 R2、出站标签为 1021,
于是为报文插入标签头部并转发出去;
Transit-LSR
R2 作为 Transit LSR,需要对接收的 IP-Packet 执行 Swap 操作交换标签,并进行标签转发;

当 R2 收到携带 1021 标签的标签报文时,查询 ILM,根据 I[……]

READ MORE

「MPLS」- 多协议标记交换 | Multiprotocol Label Switching

认识
早期广域网常用的数据链路层协议包括 PPP、HDLC、ATM 等。在 90 年代中期,互联网流量的快速增长,随着全网 IP 化的演进,基于 IP 技术的 Internet 快速普及,但基于最长匹配算法的 IP 技术必须依赖路由器查询路由表来完成转发,但由于硬件技术而转发性能低,所以基于路由器查表转发的 IP 技术的转发性能成为当时限制网络发展的瓶颈;
传统的 IP 转发采用的是逐跳转发:所有路由器需要知道全网的路由;IP-Header 不定长,处理效率低;传统 IP-Forwarding 是面向无连接(不会提前计算转发路径)的,无法提供较好的端到端 QoS 保证;数据报文经过每一台路由器,都要被解封装查看报文网络层信息,然后根据路由最长匹配原则查找路由表指导报文转发。各路由器重复进行解封装查找路由表和再封装的过程,所以转发性能低;
在网络发展初期,为了满足不同的业务需求,存在着不同的网络形态,例如 X.25 网络、FR 网络、ATM 网络和 IP 网络。这些网络之间不仅不能互联互通,而且还存在着竞争,其中最为主要的是 ATM 网络和 IP 网络之间的竞争。ATM 是一种采用固定长度信元交换方式传输数据的技术,采用面向连接的方式建立路径,可以提供更好的 QoS。ATM 的设计哲学是“以网络为中心,提供可靠传输”。ATM 的设计理念充分体现了电信网络对可靠性和可管理性的要求,因此在早期的电信网络中得到了广泛的部署。IP 网络的设计理念正好相反,IP 是一种无连接的通信机制,仅提供尽力而为的转发能力,报文长度也不固定,依靠传输层 TCP 来保证传输可靠性,网络层简单可用即可。IP 网络的设计理念体现了计算机网络的“以端为中心,尽力而为”的思想,满足计算机网络的业务需求。这两者的竞争实际是电信网络和计算机网络之间的竞争。随着网络规模扩大、网络业务变多,ATM 网络的复杂度和管理成本均高于 IP 网络。电信运营商在成本和收益的多重作用下,ATM 网络逐渐被 IP 网络取代;
虽然 IP 比起 ATM 更适合计算机网络的发展,但是计算机网络也需要一定的 QoS 保障。为了弥补 IP 网络 QoS 的不足,业界提出过诸多 IP 与 ATM 网络融合的技术,例如 LANE(Local Area Network Emulation,局域网仿真)、IPoA(IP over ATM)等。但是这都只能解决部分问题,直到 1996 年 MPLS 的出现更好解决此问题;
MPLS(Multiprotocol Label Switching,多协议标记交换),起源于 IPv4,其核心技术可扩展到多种网络协议,包括 IPv6、IPX、Appletalk、DECnet、CLNP 等。
MPLS 的 Multiprotocol 指的就是支持多种网络协议。
2001, RFC[……]

READ MORE

「MPLS」- 概念术语

MPLS Domain | MPLS 域

其指系列连续的运行 MPLS 的网络设备构成的区域;
标签交换路由器 | LSR | Label Switching Router
标签交换路由器,LSR,Label Switching Router,其指支持 MPLS 的路由器(实际上也指支持 MPLS 的网络设备,并非限为路由器)。
根据拓扑位置分类:LER and Core LSR
根据 LSR 在 MPLS Domain 中的位置进行分类:

LER,Label Edge Router,边沿路由器):位于 MPLS Domain 边缘、连接其它网络的 LSR 设备;
Core LSR,核心 LSR,:区域内部的 LSR 设备;

根据数据处理分类:Ingress LSR, Transit LSR, Egress LSR
根据对数据处理方式的不同进行分类:

入站 LSR(Ingress LSR):通常是向 IP-Header 前压入 MPLS 头部并生成 MPLS 报文的 LSR;
中转 LSR(Transit LSR):通常是将 MPLS 报文进行例如标签置换操作,并将报文继续在 MPLS Domain 中转发的 LSR;
出站 LSR(Egress LSR):通常是将 MPLS 报文中 MPLS 头部移除,还原为 IP 报文的 LSR;

转发等价类 | FEC | Forwarding Equivalence Class
FEC(Forwarding Equivalence Class,转发等价类)是组具有某些共性的数据流的集合。在转发过程中,该类数据流被网络节点以相同方式处理。

在 MPLS Network 中,FEC 可以通过多种方式划分:

例如 DST-IP-ADDR/MASK、DSCP、组播流、VPN Instance 等等,依据这些特征特征来划分;
在 MPLS 中,划分 FEC 最常见方法是:DST IP Address 匹配同条 IP Route 的报文,则被认为属于同个 FEC;
在传统的采用最长匹配算法的 IP Forwarding 中,匹配到同条路由的所有报文就属于同个 FEC;

划为 FEC 的意义:标签的分配与 FEC 存在对应关系。例如,达到 3.3.3.3 与 到达 4.4.4.4 网段的使用不同的 FEC,即便两者经过相同的设备。
性质:

针对同个 FEC 的报文,其通常采用相同的 LSP 穿越 MPLS Domain,即对同个 FEC,LSR 总是用相同的标签转发;
通常 MPLS-Lable 与 FEC 是相对应的,必须有某种机制使得网络中的 LSR 获得关于某 FEC 的标签信息;
针对同个 FEC,若[……]

READ MORE

「MPLS」- 报文格式

当上层为 MPLS 协议时:
1)以太网头部中,Type==0x8847;
2)在 PPP 中,Header.Protocol==0x8281;
报文格式

Label | 标签
用于携带标签值,长度 20 bit;
EXP | Experimental Use
其主要用于 CoS(Class of Service),长度 3bit;
该字段在早期的 MPLS 标准中被定义,意为试验性的字段,但实际上该字段主要被用于 CoS。为了避免歧义,RFC5462 重新定义该字段,命名为流分类(Traffic Class);
S(Bottom of Stack)
栈底位,指示该标签头部是否为最后一层标签,长度 1-bit;
S==1,则表示当前标签头部为栈底,指示设备该标签为最后一个标签;
S==0,则表示当前标签头部之后依然还有其他标签头部;
TTL(Time To Live)
用于当网络出现环路时,防止标签报文被无限制转发,与 IP-Header.TTL 具有相同的意义,长度 8bit;
IP TTL

根据 RFC 3031 描述,LER 在对 Packet 压入标签时,需要将原 IP Packet 或下层标签中的 TTL 值拷贝到新增加的标签的 TTL 域。LSR 在转发标签分组时,对栈顶标签进行 TTL – 1 操作。标签弹出时,再将栈顶的 TTL 值拷贝回 IP Packet 或下层标签中;

TTL 除了用于防止产生路由环路外,也用于实现 tracert 功能:

若在 Ingress LSR 使用 IP TTL 复制功能,则报文在 LSP 中经过的每一跳都体现为 IP TTL 逐跳递减,tracert 的结果将反映报文实际经过的路径;
若在 Ingress LSR 禁用 IP TTL 复制功能,则报文在 LSP 中经过的跳数不会导致 IP TTL 递减,tracert 的结果不包括 MPLS 骨干网络中每一跳,就好像 Ingress LSR 与 Egress LSR 是直连的;

根据 RFC 3443 描述,其定义两种 MPLS 对 IP Packet TTL 的处理模式:

Uniform Mode(MPLS 拷贝 TTL 字段):报文进入 MPLS Network 时,Ingress LSR 将 IP TTL – 1 映射到 MPLS TTL 字段。报文在 MPLS Network 中传递时,按照标准的 TTL 处理方式处理。报文在离开 MPLS Network 时,Egress LSR 将 MPLS TTL – 1 并映射到 IP TTL 字段;

Pipe Mode(MPLS 创建 TTL 字段):在 I[……]

READ MORE