SCTP協議詳解

轉自:http://wiki.dzsc.com/info/4248.html

 

SCTP 被視爲一個傳輸層協議,它的上層爲SCTP 用戶應用,下層作爲分組網絡。在SIGTRAN 協議的應用中,SCTP 上層用戶是SCN 信令的適配模塊(如M2UA、M3UA),下層是IP 網。

SCTP

SCTP相關術語

  •   1. 傳送地址

      傳送地址由 IP 地址、傳輸層協議類型和傳輸層端口號定義。由於SCTP 在IP 上傳 輸,所以一個SCTP 傳送地址由一個IP 地址加一個SCTP 端口號決定。SCTP 端口 號就是SCTP 用來識別同一地址上的用戶,和TCP 端口號是一個概念。比如IP 地 址10.105.28.92 和SCTP 端口號1024 標識了一個傳送地址,而10.105.28.93 和 1024 則標識了另外一個傳送地址,同樣,10.105.28.92 和端口號1023 也標識了一 個不同的傳送地址。

      2. 主機和端點

      主機(HoST) 主機配有一個或多個 IP 地址,是一個典型的物理實體。

      端點(SCTP Endpoint)

      端點是SCTP 的基本邏輯概念,是數據報的邏輯發送者和接收者,是一個典型的邏 輯實體。

      一個傳送地址(IP 地址+SCTP 端口號)唯一標識一個端點。一個端點可以由多個 傳送地址進行定義,但對於同一個目的端點而言,這些傳送地址中的IP 地址可以配 置成多個,但必須使用相同的SCTP 端口。

      3. 偶聯和流

      偶聯(AssociATION) 偶聯就是兩個 SCTP 端點通過SCTP 協議規定的4 步握手機制建立起來的進行數據 傳遞的邏輯聯繫或者通道。 SCTP 協議規定在任何時刻兩個端點之間能且僅能建立一個偶聯。由於偶聯由兩個 端點的傳送地址來定義,所以通過數據配置本地IP 地址、本地SCTP 端口號、對端 IP 地址、對端SCTP 端口號等四個參數,可以唯一標識一個SCTP 偶聯。正因爲如 此,在GTSOFTX3000 中,偶聯可以被看成是一條M2UA 鏈路或M3UA 鏈路。

      流(Stream) 流是 SCTP 協議的一個特色術語。SCTP 偶聯中的流用來指示需要按順序遞交到高 層協議的用戶消息的序列,在同一個流中的消息需要按照其順序進行遞交。嚴格地 說,“流”就是一個SCTP 偶聯中,從一個端點到另一個端點的單向邏輯通道。一 個偶聯是由多個單向的流組成的。各個流之間相對獨立,使用流ID 進行標識,每個 流可以單獨發送數據而不受其他流的影響。

      4. 通路(Path)和首選通路(Primary Path)

      通路(Path) 通路是一個端點將 SCTP 分組發送到對端端點特定目的傳送地址的路由。如果分組 發送到對端端點不同的目的傳送地址時,不需要配置單獨的通路。

      首選通路(Primary Path) 首選通路是在默認情況下,目的地址、源地址在SCTP 分組中發到對端端點的通路。

      如果可以使用多個目的地地址作爲到一個端點的目的地址,則這個SCTP 端點爲多 歸屬。如果發出SCTP 分組的端點屬於多歸屬節點時,如果定義了目的地址、源地 址,能夠更好控制響應數據塊返回的通路和數據包被髮送的接口。 一個 SCTP 偶聯的兩個SCTP 端點都可以配置多個IP 地址,這樣一個偶聯的兩個 端點之間具有多條通路,這就是SCTP 偶聯的多地址性。SCTP 偶聯的多地址性是 SCTP 與TCP 最大的不同。

      一個偶聯可以包括多條通路,但只有一個首選通路。如圖1所示,MGC(如 GTSOFTX3000)一個端點包括兩個傳送地址(10.11.23.14:2905 和10.11.23.15: 2905),而SG 一個端點也包括兩個傳送地址(10.11.23.16:2904 和10.11.23.17: 2904)。

    SCTP 雙歸屬

     

      圖1 SCTP 雙歸屬

      此兩個端點決定了一個偶聯,該偶聯包括4 條通路(Path0、Path1、Path2 和Path3)。 根據數據配置可以確定此4 條通路的選擇方式,如圖2所示。圖中定義了4 條通 路,而且首選通路爲Path0:  Path0:本端傳送地址1(10.11.23.14:2905)發送SCTP 分組到對端傳送地 址1(10.11.23.16:2904)。

      Path1:本端傳送地址1(10.11.23.14:2905)發送SCTP 分組到對端傳送地 址2(10.11.23.17:2904)。

      Path2:本端傳送地址2(10.11.23.15:2905)發送SCTP 分組到對端傳送地 址1(10.11.23.16:2904)。

      Path3:本端傳送地址2(10.11.23.15:2905)發送SCTP 分組到對端傳送地 址2(10.11.23.17:2904)。

      端點發送的 SCTP 工作原理爲:本端點傳送地址A 發送的SCTP 包通過首選通路發 送到對端端點。當首選通路出現故障後,SCTP 可以自動切換到其他備用通路上, 優先切換對端端點的傳送地址,再次切換本端端點的傳送地址。

      SCTP 定義了心跳消息(Heart Beat)。當某條通路空閒時,本端SCTP 用戶要求 SCTP 生成相應的心跳消息並通過該通路發送到對端端點,而對端端點必須立即發 回對應的心跳確認消息。這種機制被用來精確測量回路時延RTT(Round Trip TIme),而且可以隨時監視偶聯的可用情況和保持SCTP 偶聯的激活狀態。

    確定通路選擇方式的數據配置

     

      圖2 確定通路選擇方式的數據配置

      5. TSN 和SSN

      傳輸順序號 TSN(Transmission Sequence Number) SCTP 使用TSN 機制實現數據的確認傳輸。一個偶聯的一端爲本端發送的每個數據 塊順序分配一個基於初始TSN 的32 位順序號,以便對端收到時進行確認。 TSN 是基於偶聯進行維護的。

      流順序號 SSN(Stream Sequence Number)

      SCTP 爲本端在這個流中發送的每個數據塊順序分配一個16 位SSN,以便保證流 內的順序傳遞。 在偶聯建立時,所有流中的SSN 都是從0 開始。當SSN 到達65535 後,則接下來 的SSN 爲0。 TSN 和SSN 的分配是相互獨立的。

      6. 擁塞窗口CWND(Congestion Window)

      SCTP 也是一個滑動窗口協議,擁塞窗口是針對每個目的地址維護的,它會根據網 絡狀況調節。當目的地址的發送未證實消息長度超過其CWND 時,端點將停止向這 個地址發送數據。

      7. 接收窗口RWND(Receive Window)

      RWND 用來描述一個偶聯對端的接收緩衝區大小。偶聯建立過程中,雙方會交換彼 此的初始RWND。RWND 會根據數據發送、證實的情況即時地變化。RWND 的大 小限制了SCTP 可以發送的數據的大小。當RWND 等於0 時,SCTP 還可以發送一 個數據報,以便通過證實消息得知對方緩衝區的變化,直到達到CWND 的限制。

      8. 傳輸控制塊TCB(Transmission Control Block)

      TCB 是一種內部數據結構,是一個SCTP 端點爲它與其他端點之間已經啓動的每一 個偶聯生成的。TCB 包括端點的所有狀態、操作信息,便於維護和管理相應的偶聯。

SCTP功能

  •   如圖所示,SCTP 的功能主要包括:偶聯的建立和關閉、流內消息順序遞交、用戶數據分段、證實和避免擁塞、消息塊綁定、分組的有效性和通路管理。

    SCTP 功能示意圖

      圖 SCTP 功能示意圖

      1、偶聯的建立和關閉

      偶聯的建立是由 SCTP 用戶(如M2UA、M3UA 等)發起請求來啓動的。而且建立 過程相對於TCP 連接而言比較複雜,是個“四次握手”過程,並用到了“COOKIE” 的機制。COOKIE 是一個含有端點初始信息和加密信息的數據塊,通信的雙方在關 聯建立時需要處理並交換,從而增加協議的安全性,防止拒絕服務和僞裝等潛在的 攻擊。 SCTP 提供了對激活偶聯的正常的關閉程序,它必須根據SCTP 用戶的請求來執行, 當然SCTP 也提供一種非正常(即中止)程序,中止程序的執行既可以根據SCTP 用戶的請求來啓動,也可以由SCTP 協議檢查出差錯來中止。 SCTP 不支持半打開狀態(即一端可以在另一端結束後繼續發送數據)。無論是哪 個端點執行了關閉程序,偶聯的兩端都應停止接受從SCTP 用戶發來請求原語。

      2、流內消息順序遞交

      SCTP 提供數據報的順序傳遞,順序傳遞的數據報必須放在一個“流”中傳遞。流 是順序傳遞的基石。 通過流,SCTP 將數據的確認和傳輸的有序遞交分成兩種不同機制。SCTP 使用TSN 機制實現了數據的確認傳輸,使用流號和SSN(流順序號)則實現數據的有序遞交。 當SCTP 收到數據的SSN 連續的時候,SCTP 就可以將數據向SCTP 用戶遞交, 而不用等到數據的TSN 號連續以後才向SCTP 用戶遞交。

      當一個流被閉塞時,期望的下一個連續的SCTP 用戶消息可以從另外的流上進行遞 交。 SCTP 也提供非順序遞交的業務,接收到的用戶消息可以使用這種方式立即遞交到 SCTP 用戶,而不需要保證其接收順序。

      3、用戶數據分段

      SCTP 通過對傳送通路上最大PMTU(Path Maximum TransmissiON Unit)的檢測, 實現在SCTP 層將超大用戶數據分片打包,避免在IP 層的多次分片、重組,可以減 少IP 層的數據負擔。

      在發送端,SCTP 可以對大的用戶數據報進行分片以確保SCTP 數據報傳遞到 低層時適合通路MTU(Maximum Transmission Unit)。

      在接收端,SCTP 將分片重組爲完整的用戶數據報,然後傳遞給SCTP 用戶。

      4、 證實和避免擁塞

      證實和重傳是協議保證傳輸可靠性的策略,SCTP 也一樣。證實機制是SCTP 保證 傳輸可靠性的基石。避免擁塞沿襲了TCP 的窗口機制,進行合適的流量控制。 ??

      SCTP 在將數據(數據分片或未分片的用戶數據報)發送給底層之前順序地爲 之分配一個發送順序號(TSN)。

      TSN 和SSN(流順序號)是相互獨立的,TSN 用於保證傳輸的可靠性,SSN 用於保證流內消息的順序傳遞。

      TSN 和SSN 在功能上使可靠傳遞和順序傳遞分開。接收端證實所有收到的 TSNs,即使其中有些尚未收到。

      包重發功能負責 TSN 的證實,還負責擁塞消除。

      5、 消息塊綁定

      如果長度很短的用戶數據被帶上很大一個 SCTP 消息頭,其傳遞效率會很低,因此, SCTP 將幾個用戶數據綁定在一個SCTP 報文裏面傳輸,以提高帶寬的利用率。

      SCTP 分組由公共分組頭和一個/多個信息塊組成,信息塊可以是用戶數據,也 可以是SCTP 控制信息。

      SCTP 用戶能夠可選地使用捆綁功能,決定是否將多個用戶數據報捆綁在一個 SCTP 分組中。

      爲提高效率,擁塞/重發時,捆綁功能可能仍被執行,即使用戶已經禁止捆綁。

      6 、分組的有效性

      分組的有效性是 SCTP 提供無差錯傳輸的基石。SCTP 分組的公共分組頭包含一個 驗證標籤(VerificATIon Tag)和一個可選的32 位校驗碼(Checksum)。 驗證標籤的值由偶聯兩端在偶聯啓動時選擇。如果收到的分組中如果沒有期望的驗 證標籤值,接收端將丟棄這個分組,以阻止攻擊和失效的SCTP 分組。 校驗碼由 SCTP 分組的發送方設置,以提供附加的保護,用來避免由網絡造成的數 據差錯。接收端將丟棄包含無效校驗碼的SCTP 分組。

      7、 通路管理

      發送端的 SCTP 用戶能夠使用一組傳送地址作爲SCTP 分組的目的地。SCTP 管理 功能可以根據SCTP 用戶的指令和當前合格的目的地集合的可達性狀態,爲每個發 送的SCTP 分組選擇一個目的地傳送地址。當其他分組業務量不能完全表明可達性 時,通路管理功能可以通過心跳消息來監視到某個目的地地址的可達性,並當任何 對端傳送地址的可達性發生變化時,向SCTP 用戶提供指示。通路功能也用來在偶 聯建立時,向對端報告合格的本端傳送地址集合,並把從對端返回的傳送地址報告 給本地的SCTP 用戶。 在偶聯建立時,爲每個 SCTP 端點定義一個首選通路,用來正常情況下發送SCTP 分組。

      在接收端,通路管理功能在處理SCTP 分組前,用來驗證入局的SCTP 分組屬於的 偶聯是否存在。

SCTP 基本信令流程

  •   1 偶聯的建立和發送流程

      SCTP 端點A 啓動建立偶聯,並向端點B 發送一個用戶消息,隨後端點B 向A 發送 兩個用戶消息。(假定這些消息沒有捆綁和分段)。信令流程如圖1所示。

    偶聯建立過程消息交互圖

     

      圖1 偶聯建立過程消息交互圖

      (1) 端點A 創建一個數據結構TCB(傳輸控制塊)來描述即將發起的這個偶聯(包 含偶聯的基本信息),然後向端點B 發送INIT 數據塊。INIT 數據塊中主要包 括如下參數:

      啓動標籤(Initiate Tag):對端驗證標籤,如設爲Tag_A。Tag_A 是從1 到 4294967295 中的一個隨機數。

      輸出流數量(OS):本端點期望的最大出局流的數量。

      輸入流數量(MIS):本端點允許入局流的最大數量。

      (2) 端點B 收到INIT 消息後,立即用INIT ACK 數據塊響應。INIT ACK 數據塊中 必須帶有如下參數:

      目的地 IP 地址:設置成INIT 數據塊的起源IP 地址。

      啓動標籤(Initiate Tag):設置成Tag_B。

      狀態 COOKIE(STATE COOKIE):根據偶聯的基本信息生成一個TCB,不 過這個TCB 是一個臨時TCB。這個TCB 生成以後,將其中的必要信息(包含 一個COOKIE 生成的時間戳、COOKIE 的生命期)和一個本端的密鑰通過 RFC2401 描述的算法計算成一個32 位的摘要MAC(這種計算是不可逆的)。 必要信息和MAC 組合成STATE COOKIE 參數。

      本端點傳送地址。

      最大入局流的數量。

      最大出局流的數量。

      (3) 端點A 收到INIT ACK 後,首先停止INIT 定時器定時器 的供應商離開COOKIE-WAIT 狀態, 然後發送COOKIE ECHO 數據塊,將收到INIT ACK 數據塊中的STATE COOKIE 參數原封帶回。最後端點A 啓動COOKIE 定時器並進入 COOKIE-ECHOED 狀態。

      (4) 端點B收到COOKIE ECHO數據塊後,進行COOKIE驗證。將STATE COOKIE 中的TCB 部分和本端密鑰根據RFC2401 的MAC 算法進行計算,得出的MAC 和STATE COOKIE 中攜帶的MAC 進行比較。如果不同則丟棄這個消息;如 果相同,則取出TCB 部分的時間戳,和當前時間比較,看時間是否已經超過 了COOKIE 的生命期。如果是,同樣丟棄。否則根據TCB 中的信息建立一個 和端A 的偶聯。端點B 將狀態遷入ESTABLISHED,併發出COOKIE ACK 數 據塊。端點B 向SCTP 用戶發送SCOMMUNCIATION UP 通知。

      (5) 端點A 向端點B 發送一個DATA 數據塊,啓動T3-RTS 定時器。DATA 數據 塊中必須帶有如下參數:

      TSN:DATA 數據塊的初始TSN。

      流標識符(Stream Identifier):用戶數據屬於的流,假設流標識符爲0。

      流順序碼(Stream Sequence Number):所在流中的用戶數據的順序號碼。 該字段從0 到65535。

      用戶數據(User Data):攜帶用戶數據淨荷。

      (6) 端點B 收到DATA 數據塊後,返回SACK 數據塊。SACK 數據塊中必須帶有 如下參數:

      累積證實 TSN 標籤(Cumulative TSN Ack):端點A 的初始TSN。

      間隔塊(Gap Ack Block):此值爲0。 端點 A 收到SACK 數據塊後,停止T3-RTX 定時器。

      (7) 端點B 向端點A 發送第一個DATA 數據塊。DATA 數據塊中必須帶有如下參 數:

      TSN:端點B 發出DATA 數據塊的初始TSN。

      流標識符(Stream Identifier):用戶數據屬於的流,假設流標識符爲0。

      流順序碼(Stream Sequence Number):所在流中的用戶數據的順序號碼。 假設流順序碼爲0。

      用戶數據(User Data):攜帶用戶數據淨荷。

      (8) 端點B 向端點A 發送第二個DATA 數據塊。DATA 數據塊中必須帶有如下參 數:

      TSN:端點B 發出DATA 數據塊的初始TSN+1。

      流標識符(Stream Identifier):用戶數據屬於的流,假設流標識符爲0。

      流順序碼(Stream Sequence Number):所在流中的用戶數據的順序號碼。 此時流順序碼爲1。

      用戶數據(User Data):攜帶用戶數據淨荷。

      (9) 端點A 收到DATA 數據塊後,返回SACK 數據塊。SACK 數據塊中必須帶有 如下參數:

      累積證實 TSN 標籤(Cumulative TSN Ack):端點B 的初始TSN。

      間隔塊(Gap Ack Block):此值爲0。

      2 偶聯關閉流程

      一個端點退出服務時,需要停止它的偶聯。偶聯的停止使用兩種流程:偶聯的中止 流程(非正常關閉)和偶聯的正常關閉流程。 偶聯的中止(非正常關閉)可以在任何未完成期間進行,偶聯的兩端都捨棄數據並 且不提交到對端。此種方法不考慮數據的安全。偶聯的中止步驟比較簡單:發起端 點向對端端點發送ABORT 數據塊,發送的SCTP 分組中必須填上對端端點的驗證 標籤,而且不在ABORT 數據塊中捆綁任何DATA 數據;接收端點收到ABORT 數 據塊後,進行驗證標籤的檢查。如果驗證標籤與本端驗證標籤相同,接收端點從記 錄上清除該偶聯,並向SCTP 用戶報告偶聯的停止。

      偶聯的正常關閉:任何一個端點執行正常關閉程序時,偶聯的兩端將停止接受從其 SCTP 用戶發來的新數據,並且在發送或接收到SHUTDOWN 數據塊時,把分組中 的數據遞交給SCTP 用戶。偶聯的關閉可以保證所有兩端的未發送、發送未證實數 據得到發送和證實後再終止偶聯。

    偶聯正常關閉消息交互圖

     

      圖2 偶聯正常關閉消息交互圖

      偶聯的正常關閉步驟如下:

      (1) 偶聯關閉發起端點A 的SCTP 用戶向SCTP 發送請求SHUTDOWN 原因。 SCTP 偶聯從ESTABLISHED 狀態遷入SHUTDOWN-PENDING 狀態。在這 個狀態,SCTP 不接受SCTP 用戶在這個偶聯上的任何數據發送請求。同時等待端點A 所有發送未證實的數據得到端點B 的證實。當所有端點A 發送未證 實數據得到證實,則向端點B 發送SHUTDOWN 數據塊。端點A 啓動 T2-shutdown 定時器進入SHUTDOWN-SENT 狀態。啓動T2-shutdown 定時 器的目的是等待端點B 發回的SHUTDOWN-ACK 數據塊,如果定時器超時, 則端點A 必須重新發送SHUTDOWN 數據塊。

      (2) 端點B 收到SHUTDOWN 消息後,進入SHOUTDOWN-RECEIVED 狀態, 不再接收從SCTP 用戶發來的的新數據,並且檢查數據塊的累積TSN ACK 字 段,驗證所有未完成的DATA 數據塊已經被SHUTDOWN 的發送方接收。當 端點B 所有未發送數據和發送未證實數據得到發送和證實後, 發送 SHUTDOWN ACK 數據塊並啓動本端T2-SHUTDOWN 定時器,並且進入 SHUTDOWN-ACK-SENT 狀態。如果定時器超時了,端點B 則重新發送 SHUTDOWN ACK 數據塊。

      (3) 端點A 收到SHUTDOWN ACK 消息後,停止T2-shutdown 定時器,並且向端 點B 發送SHUTDOWN COMPLETE 數據塊,並清除偶聯的所有記錄。端點B 收到SHUTDOWN COMPLETE 數據塊後, 驗證是否處於 SHUTDOWN-ACK-SENT 狀態。如果不是處於該狀態,則丟棄該數據塊;如 果端點處於SHUTDOWN-ACK-SENT 狀態,端點B 則停止T2-shutdown 定時 器並清除偶聯的所有記錄,進入CLOSED 狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章