segment routing是個新的轉發技術,利用了IGP/BGP做爲控制平面協議來分配、分發SID(Segment-ID 段ID),使用MPLS或IPv6做爲轉發平面。其中SRv6使用IPv6來做爲轉發平面。今天咱們來討論下SRv6中IPv6 Header的基本操做。編程
首先IPv6包頭有基本包頭和擴展包頭之分,基本包頭40 bytes,裏面包含一個重要字段」next header」,這個字段相似於IPv4包頭中」protocol」字段,用於表示上層是什麼協議(或IPv4報文的負載是什麼報文),好比next header字段等於17的時候,表示後面跟着UDP報文;等於6的時候表示後面跟着TCP報文;4的時候表示後面跟了一個IPv4的頭部(IPv4 over IPv6)。其中當next header等於43的時候,後面跟的是IPv6的Routing Extension Header(路由擴展包頭)。如下圖示例:網絡
在路由擴展包頭中,有個Routing Type字段,被幾個RFC所定義,其中:ide
0 表示Source Route (在2007年被取消)學習
1 表示Nimred (在2009年被取消)spa
2 表示Mobility (RFC 6275中定義),用於移動設計
3 表示RPL Source Route (RFC 6554中定義),主要用於IOT視頻
4 表示Segment Routing (如今是tentative),意味着是臨時使用,還沒有被RFC定義,不排除未來會設計一個新的擴展包頭的可能blog
因此一個SRv6的路由頭部就是這麼多,一個基本包頭(next-header = 43),一個路由擴展包頭(Routing Type = 4),後面是Segment Routing部分的字段。這個擴展路由包頭中,最重要的字段是Segments Left,First Segment和Segment List。咱們大概來解釋下這些字段。ci
l Segment List:其中咱們在頭端壓路徑標籤的時候,會壓入多層標籤(這是基於MPLS的SRTE的操做方式),對於SRv6來說,會在SR specific中壓入多個在數據包傳輸過程當中須要通過的節點。其中Last Segment,或稱爲尾節點(Tail-end)或稱爲終節點(End-point),Segment List編號爲0 (即圖上Segment List [0]),而後按順序反向將須要通過的節點壓入SR specific中,好比通過N個節點,則最後一個壓入的是Segment List [n-1]路由
l First Segment:意思指數據包從頭端發送到終節點通過的第一跳設備,在Segment List中,下面的節點是離頭端更近的,最上面的是終節點,因此在這個圖中First Segment字段的值是n-1
l Segment Left:簡稱SL,指的是Active Segment,意思是如今咱們將要去往的下一跳是誰。在頭端的時候,Segment Left字段的值爲n-1,意思是咱們要去往終節點,下一個要通過的節點是Segment List [n-1]
工做原理是每通過一個Segment List中包含的節點,SL的值會遞減,同時會將Segment List [SL]的節點SID (實際上是一個IPv6地址,只不過可能有不一樣功能)拷貝到基本包頭的目的IPv6地址的字段裏面,告訴路由器下一跳須要去往哪個節點,這樣一跳一跳將數據包發往目的地。下面咱們用一個數據包的轉發過程來講明一下它的工做流程,以下圖:
l 第一張圖:從圖中能夠看到,A是頭端節點,D是終節點,咱們programming壓入必須通過的節點爲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基本包頭的Destination Address中,你能夠看到IPv6基本包頭的目的地址爲B;
l 第二張圖:從圖中咱們能夠看到數據包發送到了中間的節點,你能夠理解爲Underlay中通過的任意節點,這個節點僅僅會根據IPv6的基本包頭的目的地址B,來正常的路由數據包,除了Hop Limit字段之外,其餘字段基本不變;
l 第三張圖:這時數據包到達了節點B,收到報文後查看IPv6基本包頭的目的地址爲B,這時能夠拆掉基本包頭,看後面的擴展包頭,發現是一個SR Header,看到Segment Left字段爲2,表示尚未到達終節點,須要繼續轉發,因此這時First Segment字段不變,Segment Left減1變爲1,而且將Segment List [SL=1] = C節點的地址,拷貝到IPv6基本包頭的Destination Address中,你能夠看到此時IPv6基本包頭的目的地址爲C,而後繼續轉發數據包;
l 第四張圖:數據包達到終節點D,此時查看IPv6基本包頭目的地址爲本身,拆掉看擴展包頭,擴展包頭中SL等於0,表示已經到達終節點。而後根據此Segment List中的Function部分對payload部分進行服務。
從以上工做流程中,咱們能夠發現SRv6實際上很容易理解,也很容易作Programming(編程)處理,緣由是SR Header中Segment List你能夠根據手工或控制器等方式進行編寫。因此SRv6是運營商和大型企業核心網中下一步能夠發展應用的技術。
爲了幫助更多技術愛好者瞭解SR-TE的技術,SR-TE的專題技術文案會不斷推出。相關的專題視頻也會配套在IE-LAB的各學習平臺發佈。而對新技術的不斷學習,應成爲網絡工程師必備的學習習慣。