SCTP流控制傳輸協議

SCTP流控制傳輸協議 算法

SCTP(STREAM CONTROL TRANSMISSION PROTOCOL 流控制傳輸協議)是IETF新定義的一個傳輸層transport layer協議(2000年)。是提供基於不可靠傳輸業務的協議之上的可靠的數據報傳輸協議。SCTP的設計用於經過IP網傳輸SCN窄帶信令消息。  安全

SCTP其實是一個面向鏈接的協議,但SCTP偶聯的概念要比TCP的鏈接具備更廣的概念,SCTP對TCP的缺陷進行了一些完善,使得信令傳輸具備更高的可靠性,SCTP的設計包括適當的擁塞控制、防止氾濫和假裝***、更優的時時性能和多歸屬性支持。RFC 2960詳細說明了SCTP,介紹性的文檔是RFC 3286。服務器

SCTP最初是被設計用於在IP上傳輸電話(SS7),把SS7信令網絡的一些可靠特性引入IP。IETF的這方面的工做稱爲信令傳輸SIGTRAN。與此期間,也提出了這個協議的其餘一些用途。網絡

SCTP 提供以下服務: 數據結構

* 確認用戶數據的無錯誤和無複製傳輸;框架

* 數據分段以符合發現路徑最大傳輸單元的大小;ide

* 在多數據流中用戶信息的有序發送,帶有一個選項,用戶信息能夠按到達順序發送;性能

* 選擇性的將多個用戶信息綁定到單個 SCTP 包;   測試

* 經過關聯的一個終端或兩個終端多重宿主支持來爲網絡故障規定容度。   編碼


與TCP的關係

做爲一個傳輸層協議,SCTP兼有TCP及UDP二者的特色。SCTP能夠稱爲是TCP的改進協議,但他們之間仍然存在着較大的差異。

首先SCTP和TCP之間的最大區別是SCTP的鏈接能夠是多宿主鏈接的,TCP則通常是單地址鏈接的。在進行SCTP創建鏈接時,雙方都可聲明若干IP地址(IPv4,Ipv6或主機名)通知對方本端全部的地址。若當前鏈接失效,則協議可切換到另外一個地址,而不須要從新創建鏈接。

  其次SCTP是基於消息流,而TCP則是基於字節流。所謂基於消息流,是指發送數據和應答數據的最小單位是消息包(chunk)。一個SCTP鏈接(Association)同時能夠支持多個流(stream),每一個流包含一系列用戶所需的消息數據(chunk)。而TCP則只能支持一個流。

在網絡安全方面,SCTP增長了防止惡意***的措施。不一樣於TCP鏈接採用的三次握手機制,SCTP鏈接採用四次握手機制,有效的防止了相似於SYN Flooding的防範拒絕服務***。SCTP主要的貢獻是對多重聯外線路的支持,一個端點能夠由多於一個IP地址組成,使得傳輸可在主機間或網卡間作到透明的網絡容錯備援。


SCTP處於SCTP用戶應用層與IP網絡層之間,它運用「關聯」(association)這個術語定義交換信息的兩個對等SCTP用戶間的協議狀態 。

SCTP也是面向鏈接的,但在概念上,SCTP「關聯」比TCP鏈接更爲普遍:TCP的鏈接只有一個源地址和一個目的地址,SCTP提供一種方式使得每一個SCTP端點能爲另外一個對等端點提供一組傳輸地址,即傳輸地址= 一組IP地址+端口號。

在繼承TCP特色的基礎上,SCTP提供了一些額外的功能:

1. 在多個「流」(stream)中實現用戶數據的有序發送

「流」在TCP中指一系列的字節,而在SCTP中是指發送到上層協議的必定系列的用戶消息,這些消息的順序與流內其餘消息相關。SCTP用戶在創建關聯時,能夠規定關聯支持的流的數目。這個數目是與源端商定的,用戶消息與流數目關聯。在鏈路中,SCTP爲每一個送到對等端的消息分配一個流序號。在接收端,SCTP確保在給定流中消息按順序發送。同時,當一個流正在等待下一個非順序的用戶消息時,其餘流的發送會繼續。

2. 根據已發現的路徑MTU(最大傳輸單元)大小進行用戶數據分片

爲了確保發送到下層的SCTP數據包與路徑MTU一致,SCTP對用戶消息分片。在接收端,分片被重組後傳給上層SCTP用戶。

3. 選擇性確認(SACK)和擁塞控制

選擇性確認用於數據包丟失發現,TCP中確認序號返回的是發送方已成功收到數據字節序號(不包含確認序號所指的字節),而SCTP反饋給發送端的是丟失的而且要求重傳的消息序號。 SCTP運用了TCP中的擁塞控制技術,包括慢啓動,擁塞避免和快速重傳。所以,當和TCP應用共存時,SCTP應用可接收屬於SCTP的網絡資源部分。

4. 塊(chunk)綁定

即多個用戶消息可選擇地綁定到一個SCTP包上,經過將消息放到一個或多個SCTP數據結構——「塊」中,SCTP保留了應用程序的消息框架邊界。不一樣類型的塊可綁定到一個SCTP包中,可是控制塊必須放在任何一個數據塊以前。

5. 路徑管理

SCTP 路徑管理功能主要負責從遠端提供的一組傳輸地址中選擇目的傳輸地址,它根據兩個方面來選擇目的地址:SCTP用戶指示和當前可達的合格目的地。當其餘流控制不能提供可達性信息時,路徑管理功能定時地掃描鏈路的可達性,並向SCTP報告遠端傳輸地址所發生的變化。SCTP 路徑管理功能模塊同時還負責在創建鏈路時,向遠端報告可用的本地地址,並把遠端返回的傳輸地址告訴SCTP用戶。

6. 支持多宿

當SCTP傳送數據包給目的IP地址時,若是此IP地址是不可達的,SCTP能夠將消息重路由給一個交替的IP地址。這樣,在關聯的一端甚至兩端,可容忍網絡級錯誤。

7. 防範拒絕服務(DoS)***

DoS的***方式有不少種,最基本的DoS***就是利用合理的服務請求來佔用過多的服務資源,從而使合法用戶沒法獲得服務的響應。SYN Flooding***是DoS***的一種實例,是目前效果最好的一種******方式。爲了抵抗SYN Flooding對目標主機***,SCTP在關聯初始化階段實施了一種安全的「Cookie」機制。

8. 支持多種傳輸模式

嚴格有序傳輸(像TCP),部分有序傳輸(像per-stream)和無序傳輸(像UDP)。


SCTP包結構

包的結構,一個數據包首部可跟一個或多個可變長的塊。塊採用「類型—長度—值」(TLV)的格 式。源端口、目的端口、校驗碼的意義同TCP中的意義類似。

確認標籤保存着在SCTP握手中第一次交換的初始標籤的值。

在關聯中,任何SCTP數據包若不包含這樣一個標籤,當到達時會被接收端丟棄。

在每一個塊中,TLV包括塊類型、傳輸處理標記、塊長度。不一樣的塊類型可用來傳輸控制信息或數據。

傳輸序列號(TSN)和流序列號(SSN)是兩種不一樣的序列號,TSN保證整個關聯的可靠性,而SSN保證整個流的有序性,這樣,在傳輸中,將數據的可靠性與有序性獨立分開。


SCTP四路握手及抵抗SYN Flooding***的原理


一個SCTP關聯定義爲:[主機A的一組IP地址]+[主機A的端口]+ [主機B的一組IP地址]+[主機B的端口]。 所以,每一端對應組中的任何一個IP地址均可做爲相應的源/目的地址來標示本次關聯,經過四路握手,兩端SCTP主機交換通訊狀態。

SYN Flooding利用了TCP/IP的固有漏洞,面向鏈接的TCP三次握手是SYN Flooding存在的基礎。SYN Flooding***的原理是:惡意的***者大量向服務器發送SYN報文,服務器在發出SYN+ACK應答報文後沒法收到客戶端的ACK報文(第三次握手沒法完成),服務器端將爲維護一個很是大的半鏈接列表而消耗很是多的CPU時間和內存資源,還要不斷對這個列表中的IP進行SYN+ACK的重試。服務器端將忙於處理***者僞造的TCP鏈接請求而無暇理睬客戶的正常請求,此時從正常客戶的角度看來,服務器失去響應。

而在一次SCTP四路握手中,INIT消息的接收端沒必要保存任何狀態信息或者分配任何資源,這樣就可防範SYN Flooding等DoS***。它在發送INIT-ACK消息時,採用了一種機制——「狀態Cookie」,該Cookie具備發送端要創建本身狀態所需的所有信息。

SCTP產生一個狀態Cookie的過程以下:

1. 使用收到的INIT和發出的INIT- ACK塊中的信息建立一個關聯的TCB(傳輸控制塊)。

2. 在TCB中,將當前日期設爲建立日期,將協議參數「有效Cookie時間」設爲生存期間。

3. 根據TCB,收集重建TCB所需的最小信息子集,將該子集和密鑰產生一個MAC(信息認證編碼)。

4. 結合上述最小信息子集和MAC產生狀態Cookie。

5. 在發送完INIT ACK(包含狀態Cookie參數)後,發送方必須刪除TCB以及任何與新關聯有關的本地資源。 INIT和INIT-ACK都必須包含創建初始狀態所需的參數:一組IP地址,保證可靠傳輸的初始TSN,每一個被接收的SCTP包中必須含有的初始標籤,每一端請求發出的流數目和每一端能支持接收的流數目。交換完這些消息以後,INIT的發送端以COOKIE-ECHO消息的方式發送回狀態Cookie。接收端根據所接收到的COOKIE-ECHO中的狀態Cookie,完整地重建本身的狀態,並回送COOKIE- ACK來確認關聯已創建。COOKIE-ECHO和COOKIE-ACK均可將用戶數據消息綁定到各自的包中。

因而可知,採用以上這種方式,即便接收再多的INIT消息, 接收端也沒有任何資源的消耗:它既不分配任何系統資源,也不保存這次新關聯的狀態,它只是把相應重建狀態所用的狀態Cookie做爲參數,包含在每個回送的INIT-ACK消息中,最後該狀態Cookie會被COOKIE-ECHO消息發送回來。


SCTP數據交換

在兩個SCTP主機間的正常數據交換。SCTP主機發送SACK塊,用來確認每個收到的SCTP包。由於SACK能完整地描述接收端的狀態,所以,依據SACK,發送端能作出重傳判決。SCTP支持相似於TCP中的快速重傳和time-out重傳算法。 對於數據包丟失發現,SCTP和TCP採用大相徑庭的機制:當TCP發現接收序號有缺口時,會等到該缺口被填上後,才發送序列號高於丟失數據包的數據。然而,SCTP即便發現接收序號有缺口或順序錯亂,仍會發送後面的數據。


SCTP關閉關聯

做爲面向鏈接的傳輸協議,SCTP也運用三路握手來關閉一個關聯,但與TCP有一點不一樣:一個TCP終端在「關聯關閉」的過程當中可以保持鏈接開啓,並從對端接收新的數據,而SCTP不支持TCP的這種「半關閉」狀態。

1. 主機A發出「關閉」(SHUTDOWN)塊來終止與主機B的關聯,主機A進入「SHUTDOWN- PENDING」狀態,對應的動做是:再也不接受上層應用的數據,只發送隊列中剩餘的數據,進入「SHUTDOWN-SENT」狀態。

2. 主機B一旦接收到「關閉」塊,就進入「SHUTDOWN-RECEIVED」狀態,同主機A同樣,再也不接受上層應用的數據,只發送隊列中剩餘的數據。

3. 主機A再次發送「關閉」塊,通知主機 B所發送的剩餘數據已到達,而且重申了關聯正在關閉。

4. 當第二次收到「關閉」塊時,主機B發送「確認關閉」塊。

5. 主機A隨後發送「關閉結束」塊,完成本次關聯的關閉。


結束語

SCTP是爲傳輸信令業務流而開發的,但它所具備的一些優於TCP的先進協議機制,如選擇性確認、快速重傳、無序遞交等,使它又知足高性能傳輸的需求,這會給它帶來更爲寬廣的應用需求。目前,已有各類操做系統支持SCTP, 如Linux、AIX、Solaris、Windows、FressBSD。在不一樣協議實現間的互操做性測試的成功,揭示着SCTP正走向商業產品之路。

IEFT正在致力於SCTP進一步的修改,使其更能知足下一代應用的需求,例如支持IPv6地址,解決對端對於IPv6的site-local、link-local地址無連通性的問題,以及在已存在的關聯中動態地增長或刪除IP地址而無需重啓該關聯。 此外,在第三代移動通訊中,SCTP可做爲信令承載層的備選方案之一,它的應用及其性能評估也有待研究。

相關文章
相關標籤/搜索