Segment Routing技术浅淡SRv6中IPv6 Header处理过程
发布网友
发布时间:2024-10-19 22:47
我来回答
共1个回答
热心网友
时间:2天前
Segment Routing 是一种创新的转发技术,它利用IGP/BGP作为控制平面协议来分配、分发SID,使用MPLS或IPv6作为转发平面,其中SRv6使用IPv6作为转发平面。我们将深入探讨SRv6中IPv6包头的基本操作。
IPv6包头分为基本包头和扩展包头,基本包头占40字节,其中包含一个关键字段“next header”,类似于IPv4包头中的“protocol”字段,用于指示上层协议(或IPv4报文负载的协议),例如当next header字段为17时,表示后面跟着UDP报文;等于6时,表示后面跟着TCP报文;4时,表示后面跟了一个IPv4头部(IPv4 over IPv6)。
在路由扩展包头中,有一个Routing Type字段,定义于多个RFC中,包括:0表示Source Route(于2007年被取消)、1表示Nimred(于2009年被取消)、2表示Mobility(RFC 6275中定义,用于移动)、3表示RPL Source Route(RFC 6554中定义,主要用于物联网)以及4表示Segment Routing(当前为暂定使用,尚未被RFC定义,可能设计新的扩展包头)。
在SRv6的路由头部中,包括一个基本包头(next-header = 43)、一个路由扩展包头(Routing Type = 4)以及Segment Routing部分的字段。扩展路由包头中最关键的字段包括Segments Left、First Segment和Segment List。
Segment List在头端压路径标签时,会压入多层标签(基于MPLS的SRTE的操作方式),对于SRv6来说,会在SR specific中压入多个在数据包传输过程中需要经过的节点。其中,最后一个节点(即头端压入的Segment List [0])称为Tail-end或End-point,然后按顺序反向压入SR specific中,例如经过N个节点,则最后一个压入的是Segment List [n-1]。
First Segment表示数据包从头端发送到终节点经过的第一跳设备,在Segment List中,下面的节点是离头端更近的,最上面的是终节点,因此图中的First Segment字段值为n-1。
Segments Left(简称SL)指的是Active Segment,即当前要前往的下一跳设备。在头端时,SL的值为n-1,表示要前往终节点,下一个要经过的节点是Segment List [n-1]。
工作原理是每经过一个Segment List中的节点,SL的值会递减,同时将Segment List [SL]节点的SID(实际上是一个IPv6地址)复制到基本包头的目的IPv6地址字段中,告知路由器下一跳需要去往哪个节点。数据包依次通过每个节点直至目的地。
接下来,我们以数据包转发过程为例来说明其工作流程。假设A为头端节点,D为终节点,编程时压入必须经过的节点B、C、D。在SR Header中,反向压入:
Segment List [0] = D
Segment List [1] = C
Segment List [2] = B
此时,B是我们要经过的第一个节点,因此First Segment为B的下标2;数据包尚未发送,因此Segment List中的节点尚未到达,所以Segment Left也为B的下标2;同时,将Segment List [SL = 2] = B的地址复制到IPv6基本包头的目的地址字段中,当前IPv6基本包头的目的地址为B。
数据包到达节点B后,查看IPv6基本包头的目的地址为B,此时可以拆掉基本包头,查看后面的扩展包头,发现是一个SR Header,看到Segment Left字段为2,表示尚未到达终节点,需要继续转发。因此,First Segment字段不变,Segment Left减1变为1,并将Segment List [SL=1] = C节点的地址复制到IPv6基本包头的目的地址字段中,当前IPv6基本包头的目的地址为C,然后继续转发数据包。
数据包到达终节点D后,查看IPv6基本包头目的地址为D,此时可以拆掉扩展包头,根据此Segment List中的Function部分对payload部分进行服务。
通过以上工作流程,我们可以发现SRv6实际上很容易理解,也很容易进行编程处理,因为SR Header中的Segment List可以根据手动或控制器等方式编写。