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)。
2 SCTP包結構
SCTP包的結構,壹個數據包首部可跟壹個或多個可變長的塊。塊采用“類型—長度—值”(TLV)的格式。源端口、目的端口、校驗碼的意義同TCP中的意義相似。確認標簽保存著在SCTP握手中第壹次交換的初始標簽的值。在關聯中,任何SCTP數據包若不包含這樣壹個標簽,當到達時會被接收端丟棄。
在每個塊中,TLV包括塊類型、傳輸處理標記、塊長度。不同的塊類型可用來傳輸控制信息或數據。
傳輸序列號(TSN)和流序列號(SSN)是兩種不同的序列號,TSN保證整個關聯的可靠性,而SSN保證整個流的有序性,這樣,在傳輸中,將數據的可靠性與有序性獨立分開。
3 SCTP數據傳輸
4.1 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消息發送回來。
2.2 SCTP數據交換
在兩個SCTP主機間的正常數據交換。SCTP主機發送SACK塊,用來確認每壹個收到的SCTP包。因為SACK能完整地描述接收端的狀態,因此,依據SACK,發送端能做出重傳判決。SCTP支持類似於TCP中的快速重傳和time-out重傳算法。
對於數據包丟失發現,SCTP和TCP采用截然不同的機制:當TCP發現接收序號有缺口時,會等到該缺口被填上後,才發送序列號高於丟失數據包的數據。然而,SCTP即使發現接收序號有缺口或順序錯亂,仍會發送後面的數據。
3.3 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隨後發送“關閉結束”塊,完成本次關聯的關閉。
4 結束語
SCTP是為傳輸信令業務流而開發的,但它所具有的壹些優於TCP的先進協議機制,如選擇性確認、快速重傳、無序遞交等,使它又滿足高性能傳輸的需求,這會給它帶來更為寬廣的應用需求。目前,已有各種操作系統支持SCTP, 如Linux、AIX、Solaris、Windows、FressBSD。在不同協議實現間的互操作性測試的成功,揭示著SCTP正走向商業產品之路。
IEFT正在致力於SCTP進壹步的修改,使其更能滿足下壹代應用的需求,例如支持IPv6地址,解決對端對於IPv6的site-local、link-local地址無連通性的問題,以及在已存在的關聯中動態地增加或刪除IP地址而無需重啟該關聯。
此外,在第三代移動通信中,SCTP可作為信令承載層的備選方案之壹,它的應用及其性能評估也有待研究。