本文是关于交换原理实验三——MPLS编程实验报告记录。

一、实验目的

安排的三个编程实验主要用于加强学生对MPLS交换中标记请求、标记分配与分发、标记分组转发的理解。

二、实验内容和实验步骤

1、实验原理及设计

多协议标记交换MPLS(Multiple Protocol Labeled Switching)技术是将第二层交换和第三层路由结合起来的一种L2/L3集成数据传输技术。MPLS是一项面向连接的交换技术,因此有建立连接的过程。各个MPLS设备运行 路由协议,在标记分发协议LDP的控制下根据计算得到的路由在相邻的路由器进行标记分配和分发,从而通过标记的拼接建立起从网络入口到出口的标记交换路径LSP。

在数据转发过程中,入口标记路由器LER根据数据流的属性比如网络层目的地址等将分组映射到某一转发等价类FEC,并为分组绑定标记。核心标记交换路由器LSR只需根据分组中所携带的标记进行转发即可。出口标记路由器LER弹出标记,根据分组的网络层目的地址将分组转发到下一跳。MPLS节点(MPLS标记交换路由器LSR或MPLS边缘路由器LER)均要创建和维护传统的路由表和标记信息库LIB。

路由表记录记录路由信息,用于转发网络层分组和标记分发从而建立标记交换路径。LIB记录了本地节点分配的标记与从邻接MPLS节点收到的标记之间的映射关系,用于标记分组的转发。

MPLS技术的核心实质在于:

  1. 网络中分组基于标记的转发;
  2. LDP协议控制下的进行标记分发从而建立标记交换路径LSP;

2、实验主要数据结构

所需要的头文件:”mplsconstant.h”

其中的主要数据结构为:

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//发送的请求信息包数据结构
struct ReqType
{
int iFirstNode; //请求信息包的源节点
int iEndNode; //请求信息包的目的节点
double ipaddress; //请求信息包包含的网络层目的IP地址前缀(例如197.42)
};
//路由表表项的数据结构
struct routertype
{
double ipaddress; //网络层目的地址前缀
int nexthop; //下一跳节点
int lasthop; //上一跳节点
int inpoint; //入端口号
int outpoint; //出端口号
};
//标记信息表表项的数据结构
struct libtype
{
double ipaddress; //网络层目的地址前缀
int inpoint; //入端口号
int outpoint; //出端口号
int inlabel; //入标记值
int outlabel; //出标记值
};
//发送的标记信息包数据结构
struct LabelPack
{
int iFirstNode; //源节点号
int iEndNode; //目的节点号
int labelvalue; //标签值
};
struct funcusedtype
{
struct libtype libinfo; //包含的标记信息表项
struct LabelPack labelinfo; //包含的标记信息包数据结构
};
//发送的标记分组信息包类型
struct LabelledDataPack
{
int iFirstNode; //源节点号
int iEndNode; //目的节点号
struct MessageType DataInfo; //包含的标记分组类型信息
};
//标记分组类型
struct MessageType
{
double ipaddress; //网络层目的地址前缀
int labelvalue; //输出标签值
};

①标记请求实验:

1
2
3
4
5
extern "C" _declspec(dllexport) struct  ReqType req_process(int idnow,struct routertype routenow)
{
struct ReqType reqtemp;
return reqtemp;
}

参数意义:

int idnow:当前的节点号;

struct routertype routenow:当前所指的路由表的表项;

函数要求:

根据提供的当前节点号和路由表表项值产生标记请求包;

过程描述:

标记请求包的源节点号由当前节点号提供,目的节点号和ip地址前缀由当前所指的路由表表项的下一跳节点和ip地址前缀提供;

②标记分配与分发实验:

1
2
3
4
5
extern  "C" _declspec(dllexport) struct  funcusedtype label_process(struct routertype routenow,int labelout,int  idnow)
{
struct funcusedtype tempstruct;
return tempstruct;
}

参数意义:

struct routertype routenow:当前所指的路由表表项;

int labelout:分配的输出标签号;

int idnow:当前的节点号;

函数要求:

该函数要求根据提供的路由表当前表项、分配的输出标签号和当前节点号,构造一funcusedtype信息包。注:各节点的输入标签可以自由选定,但必须是1-9的整数;

过程描述:

该funcusedtype信息包的libinfo部分可由当前的路由表表项、当前分配的标签号的有关部分构成;labelinfo部分由当前节点号和当前的路由表表项的有关部分构成;

③标记分组转发实验

1
2
3
4
5
extern "C" _declspec(dllexport) struct  LabelledDataPack pack_process(struct routertype routenow,struct libtype  libnow,int idnow)
{
struct LabelledDataPack packtemp;
return packtemp;
}

参数意义:

struct routertype routenow:当前所指的路由表表项;

struct libtype libnow:当前的标签信息表表项;

int idnow:当前的节点号;

函数要求:

该函数要求根据提供的路由表表项、标签信息表表项和当前节点号,构造出一个标签数据信息包。

过程描述:

该标签信息包的源节点、目的节点、IP地址前缀和标签值均可由当前节点号、路由表表项和标签信息表表项构成;

3、实验效果检验

建立连接阶段、数据传输阶段、拆除阶段,三阶段均可正常进行。

4、实验步骤

  1. 熟悉实验平台和测试环境;
  2. 编写C程序实现所要求的功能;
  3. 运行测试程序;
  4. 完成实验报告。

三、源代码

①标记请求实验:

点击查看代码
1
2
3
4
5
6
7
8
9
10
#include "mplsconstant.h"
extern "C" _declspec(dllexport) struct ReqType req_process(int idnow, struct routertype routenow)
{
struct ReqType reqtemp;
reqtemp.iFirstNode = idnow; //源节点号由当前节点号提供
reqtemp.iEndNode = routenow.nexthop; //目的节点号由当前路由表表项的下一跳节点提供
reqtemp.ipaddress = routenow.ipaddress; //IP地址前缀由当前路由表表项的IP地址前缀提供

return reqtemp;
}

②标记分配与分发实验:

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mplsconstant.h"
extern "C" _declspec(dllexport) struct funcusedtype label_process(struct routertype routenow, int labelout, int idnow)
{
struct funcusedtype tempstruct;
//包含的标记信息表项
tempstruct.libinfo.ipaddress = routenow.ipaddress; //网络层目的地址前缀
tempstruct.libinfo.inpoint = routenow.inpoint; //入端口号
tempstruct.libinfo.outpoint = routenow.outpoint; //出端口号
tempstruct.libinfo.inlabel = 1; //入标记值
tempstruct.libinfo.outlabel = labelout; //出标记值
//包含的标记信息包数据结构
tempstruct.labelinfo.iFirstNode = idnow; //当前节点号
tempstruct.labelinfo.iEndNode = routenow.lasthop; //当前的路由表表项的上一跳节点
tempstruct.labelinfo.labelvalue = 1; //与tempstruct.libinfo.inlabel保持一致

return tempstruct;
}

③标记分组转发实验

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
#include "mplsconstant.h"
extern "C" _declspec(dllexport) struct LabelledDataPack pack_process(struct routertype routenow, struct libtype libnow, int idnow)
{
struct LabelledDataPack packtemp;
packtemp.iFirstNode = idnow; //源节点号
packtemp.iEndNode = routenow.nexthop; //目的节点号
//包含的标记分组类型信息
packtemp.DataInfo.ipaddress = routenow.ipaddress; //网络层目的地址前缀
packtemp.DataInfo.labelvalue = libnow.outlabel; //输出标签值

return packtemp;
}

四、实验结果

运行程序后,建立连接阶段、数据传输阶段、拆除阶段,三阶段均可正常进行,实验成功。

五、实验心得

这次实验要编写三个程序,但是基本框架都已经规定好了,对照指导书上结构体和函数的说明,只需要简单的创建结构体和赋值操作就能很轻松地完成。加强了我对MPLS的原理和标记请求、标记分配与分发、标记分组转发过程的理解和认识。实验虽然简单,但是很有意义,收获很多。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒...