【網絡編程】【SCTP】SCTP協議介紹,四次握手,三次揮手

 

一、SCTP介紹

      SCTP是流控制傳輸協議(Stream Control Transmission Protocol)。SCTP和TCP比較像,提供可靠性、排序、流量控制以及全雙工的數據傳送。我們SCTP中使用“關聯”一詞取代“連接”是爲了避免這樣的內涵: 一個連接只涉及兩個IP地址之間的通信。一個關聯指代兩個系統之間的一次通信,它可能因爲SCTP支持多宿而涉及不止兩個地址。

 

1 面向連接

         SCTP是面向消息的(message oriented)。它提供各個記錄的按序遞送服務。與UDP一樣,由發送端寫入的每條記錄的長度隨數據一道傳遞給接收端應用。

         SCTP能夠在所連接的端點之間提供多個流,每個流各自可靠地按序遞送消息。一個流上某個消息的丟失不會阻塞同一關聯其他流上消息的投遞。這種做法與TCP正好相反,就TCP而言,在單一字節流中任何位置的字節丟失都將阻塞該連接上其後所有數據的遞送,直到該丟失被修復爲止。

 

2 多宿特性

             SCTP還提供多宿特性,使得單個SCTP端點能夠支持多個IP地址。該特性可以增強應對網絡故障的健壯性。

 

二、SCTP連接的建立和終止

1 四路握手

 

  1. 客戶SCTP發送一個INIT消息(初始化),該消息告訴服務器客戶的IP地址清單、初始序列號、用於標識本關聯中所有分組的起始標記、客戶請求的外出流的數目以及客戶能夠支持的外來流的數目
  2. 服務器以一個INIT ACK消息確認客戶的INIT消息,其中含有服務器的IP地址清單、初始序列號、起始標記、服務器請求的外出流的數目、服務器能夠支持的外來流的數目以及一個狀態cookie。狀態cookie包含服務器用於確信本關聯有效所需的所有狀態,它是數字化簽名過的,以確保其有效性。
  3. 客戶以一個COOKIE ECHO消息回射服務器的狀態cookie.除COOKIE ECHO外,該消息可能在同一個分組中還捆綁了用戶數據。
  4. 服務器以- -個COOKIE ACK消息確認客戶回射的cookie是正確的,本關聯於是建立。該消息也可能在同一個分組中還捆綁了用戶數據。

 

2 三次揮手


         SCTP不像TCP那樣允許“半關閉”的關聯。當一端關閉某個關聯時, 另一端必須停止發送新的數據。關聯關閉請求的接收端發送完已經排隊的數據(如果有的話)後,完成關聯的關閉。上圖展示了這一交換過程。

         SCTP沒有類似於TCP的TIME_ WAIT狀態,因爲SCTP使用了驗證標記。所有後續塊都在捆綁它們的SCTP分組的公共首部標記了初始的INIT塊和INIT ACK塊中作爲起始標記交換的驗證標記; 由來自舊連接的塊通過所在SCTP分組的公共首部間接攜帶的驗證標記對於新連接來說是不正確的。因此,SCTP通過放置驗證標記值就避免了TCP在TIME_WAIT狀態保持整個連接的做法。

 

3 SCTP分組交換

 

 

4 SCTP狀態圖

 

 

三、SCTP的益處


         SCTP的益處如下:

(1) SCTP直接支持多宿。一個端點可以利用它的多個直接連接的網絡獲得額外的可靠性。除了移植到SCTP外,應用程序無需採取其他行爲就可以自動使用SCTP的多宿服務。

(2)可以消除頭端阻塞。應用進程可以使用單個SCTP關聯並行地傳輸多個數據元素。同一個關聯內,一個流中的數據丟失不會影響其他並行的流中的數據流動。

(3)保持應用層消息邊界。許多應用發送的並不是字節流,而是消息。SCTP保持應用進程: 發送的消息邊界,從而略微簡化了應用程序開發人員的任務。使用SCTP無需在字節流中標記消息邊界,也無需提供在接收端從字節流中重構出消息的特殊處理代碼。

(4)提供無序消息服務。對於某些應用,消息的到達順序無關緊要。這樣的應用出於可靠性要求一般使用TCP,不過沒有順序要求的消息還是將按照發送端提交順序遞送到接收端。其中任何- -個消息的丟失將導致並非不可避免的頭端阻塞,即後續消息即使到達也不能提前無序遞送。SCTP的無序服務可用於避免這個問題,使得應用需求與傳輸服務直接匹配。

(5)有些SCTP實現提供部分可靠服務。這個特性允許SCTP發送端爲每個消息指定一個生命期,使用的是sctp_ sndrcvinfo結構的sinfo_ timetolive字段。(這個生命期不同於IPv4的TTL或IPv6的跳限,它是真正的時間長度.)當源端點和目的端點都支持本特性時,時間敏感的過期數據可改由傳輸層而不是應用進程丟棄(該數據可能發送過,不過丟失了),從而在面臨網絡阻塞時優化數據的傳輸。

(6) SCTP以一到一式接口提供了從TCP到SCTP的簡易移植手段。該接口類似典型的TCP接口,因此稍加修改,一個TCP應用程序就能移植成SCTP應用程序。

(7) SCTP提供TCP的許多特性,包括正面確認、重傳丟失數據、重排數據、窗口式流量控制、慢啓動、擁塞避免、選擇性確認,沒有包括進來的兩個例外特性是半關閉狀態和緊急數據。

(8) SCTP提供許多供應用進程配置和調整傳輸服務,以便基於關聯匹配其需求的掛鉤。這些掛鉤提供的靈活性配合良好的默認設置(供不希望調整傳輸服務的應用進程使用),爲應用程序提供了TCP難以企及的控制能力。

 

SCTP不提供的TCP特性:      

(1) 半關閉狀態。當一個應用進程關閉了某個TCP連接的自身一半卻仍然允許對端發送數據時,該連接進入半關閉狀態(6.6節), 同時告知對端本端已經發送完數據。使用本特性的應用不是很多,因此在SCTP開發階段,本特性被認爲不值得增加到SCTP中。確實需要本特性的應用程序移植到SCTP時不得不修改應用層協議,在應用數據流中提供這個告知EOF的手段。有些個案如此修改協議並非輕而易舉之事。

(2) 緊急數據。使用分離的SCTP流傳輸緊急數據多少類似TCP的緊急數據的語義,不過難以準確複製這個特性。

         不能從SCTP中真正獲益的是那些確實必須使用面向字節流傳輸服務的應用,譬如說telnet、rlogin、 rsh、 ssh等等。 對於這樣的應用,TCP能夠比SCTP更高效地把字節流分割分裝到TCP分節中。SCTP忠實地保持消息邊界,當每個消息的長度僅僅是一個字節時,SCTP封裝消息到數據塊中的效率非常之低,導致過多的開銷。

 

四、SCTP協議

一個SCTP分組含了一個公共的分組頭(Common Header)和若干數據塊(Chunk),每個數據塊中既可以包含控制信息,也可以包含用戶數據。

除了INIT、INIT ACK和SHUTDOWN COMPLETE數據塊外,其他類型的多個數據塊可以捆綁在一個SCTP分組中,以滿足對MTU大小的要求。當然,這些數據塊也可以不與其他數據塊捆綁在一個分組中。如果一個用戶消息不能放在一個SCTP分組中,這個消息可以被分成若干個數據塊 [1]  。

  1. Source Port Number:16比特的無符號整數,源端口號,識別SCTP發送端點的SCTP端口號。接收方可以使用源端口號、源IP地址、目的端口號和目的IP地址標識該SCTP分組所屬的偶聯。

  2. Destination Port Number:16比特的無符號整數,目的端口號,爲目的端點的SCTP端口號。接收主機可以使用目的端口號將SCTP分組複用到正確的端點或應用中。

  3. Verification Tag:32比特的無符號整數,驗證標籤是偶聯建立時,本端端點爲這個偶聯生成一個隨機標識。偶聯建立過程中,雙方會交換這個TAG,到了數據傳遞時,發送端必須在公共分組頭中帶上對端的這個TAG,以備校驗。包含INIT數據塊的分組中驗證標籤必須爲0。在包含SHUTDOWN-COMPLETE數據塊且設置了T比特的分組中,驗證標籤必須要從包含 SHUTDOWN-ACK數據塊的分組中複製。

    在包含ABORT數據塊的分組中,驗證標籤必須要從觸發這個ABORT發送的分組中複製。

  4. Checksum:32比特的無符號整數,SCTP通過對用戶數據使用ADLER-32算法,計算出一個32位的校驗碼,帶在數據報中,在接收端進行同樣的運算,通過檢查校驗碼是否相等來驗證用戶數據是否遭到破壞。

  5. Chunk Type:8比特的無符號整數,塊類型定義在塊值(Chunk Value)中消息所屬的類型。包括:INIT、INIT ACK、SACK、ABORT、ERROR、SHUTDOWN、COOKIE ACK等13種數據塊類型。該參數的取值範圍爲0~254,255留作今後的擴展。數據塊類型字段的編碼分配如下:

    0:淨荷數據(DATA)

    1:啓動(INIT)

    2:啓動證實 (INIT ACK)

    3:選擇證實 (SACK)

    4:Heartbeat請求(HEARTBEAT)

    5:Heartbeat證實(HEARTBEAT ACK)

    6:中止 (ABORT)

    7:關閉(SHUTDOWN)

    8:關閉證實(SHUTDOWN ACK)

    9:操作差錯(ERROR)

    10:狀態Cookie(COOKIE ECHO)

    11:Cookie證實(COOKIE ACK)

    12:爲明確擁塞通知響應(ECNE)預留

    13:爲降低擁塞窗口(CWR)預留

    14:關閉完成(SHUTDOWN COMPLETE)

    15~62:IETF預留

    63:IETF定義的數據塊擴展

    64~126:IETF預留

    127:IETF定義的數據塊擴展

    128~190:IETF預留

    191:IETF定義的數據塊擴展

    192~254:IETF預留

    255:IETF定義的數據塊擴展

    Chunk type的高兩位bit指示了收端不認識對應的chunk type的處理原則:

    00:停止處理數據報並丟棄,不再處理報中的其他Chunk。

    01:與00相同處理外,還要在ERROR或INIT ACK中上報,原因爲不認識的參數類型。

    10:忽略該Chunk ,繼續處理數據報中的其他Chunk。

    11:同10相同處理外,還要在ERROR中上報,原因爲不認識的Chunk類型。

  6. Chunk Flags:8比特的無符號整數,塊標誌位用法由塊類型決定。除非被置爲其他值,塊標記在傳送過程中會被置0而且接收端點會忽視塊標記。

  7. Chunk Length:16比特的無符號整數,塊長度用來表示包括塊類型、塊標記、塊長度和塊值在內的字節數,長度使用二進制表示。

  8. Chunk Value:變長,塊值字段是在該數據塊中真正傳送的信息,內容由數據塊類型決定。塊值的長度爲不定長。

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