1. 程式人生 > >SCTP協議詳解

SCTP協議詳解

SCTP (Stream Control Transmission Protocol)是一種傳輸協議,在TCP/IP協議棧中所處的位置和TCPUDP類似,兼有TCP/UDP兩者特徵。

SCTP是可以確保資料傳輸的,和TCP類似,也是通過確認機制來實現的。和TCP不同的是:

1. TCP是以位元組為單位傳輸的,SCTP是以資料塊為單位傳輸的

TCP接收端確認的是收到的位元組數,SCTP接收端確認的是接收到的資料塊。SCTP的這種資料塊(被稱為DATA CHUNK)通常會攜帶應用的一個數據包,或者說是應用要傳送的一個訊息。

在實際的應用中,TCP傳送方的可以將應用程式需要傳送的多個訊息打包到一個TCP包裡面發出去。比如,應用程式連續呼叫兩次send

()向對端傳送兩條訊息,TCP協議可能把這兩條訊息都打包放在同一個TCP包中。接收端在收到這個TCP包時,回給對端的ACK只是表明自己接收到了多少個位元組,TCP協議本身並不會把收到的資料重新拆散分成兩條應用層訊息並通知應用程式去接收。事實上,應用程式可能只需要呼叫一次receive(),就會把兩條訊息都收上來,然後應用需要根據應用程式自己定義的格式去拆成兩條訊息。

TCP不同,SCTP是將應用程式的每次呼叫sendmsg()傳送的資料當作一個整體,放到一個被稱為DATA CHUNK的資料塊裡面,接收端也是以DATA CHUNK為單位接收資料,並重新組包,通知應用程式接收。通常,應用程式每次呼叫

recvmesg()都會收到一條完整的訊息。

SCTP的傳送端,多條短的應用層訊息可以被SCTP協議打包放在同一個SCTP包中,此時在SCTP包中可以看到多個DATA CHUNK。另一方面,一條太長(比如,超過了路徑MTU)的應用層訊息也可能被SCTP協議拆分成多個片段,分別放在多個DATA CHUNK並通過不同的SCTP包傳送給對端。這兩種情況下,SCTP的接收端都能重新組包,並通知應用程式去接收。

2. TCP通常是單路徑傳輸,SCTP可以多路徑傳輸

TCP的兩端都只能用一個IP來建立連線,連線建立之後就只能用這一對IP來相互收發訊息了。如果這一對IP之間的路徑出了問題,那這條TCP連線就不可用了。

SCTP不一樣的地方是,兩端都可以繫結到多個IP上,只要有其中一對IP能通,這條SCTP連線就還可以用。

體現在socket API中,TCP只能bind一個IP,而SCTP可以bind到多個IP

3. TCP是單流有序傳輸,SCTP可以多流獨立有序/無序傳輸

一條SCTP連線裡面,可以區分多條不同的流(stream),不同的流之間的資料傳輸互不干擾。這樣做理論上的好處是,如果其中某一條流由於丟包阻塞了,那隻會影響到這一條流,其他的流並不會被阻塞。但是實際上,如果某一條流由於丟包阻塞,其他的流通常也會丟包,被阻塞,最後導致所有的流都被阻塞,SCTP連線中斷。

在同一條stream裡面,SCTP支援有序/無序兩種傳輸方式,應用程式在呼叫sendmsg()的時候,需要指定用哪一條stream傳輸,以及指定這條要傳送的訊息是需要有序傳輸還是無序傳輸的。如果在傳輸過程中丟包,則有序傳遞模式可能會在接收端被阻塞,而無序傳輸模式不會在接收端被阻塞。

4. TCP連線的建立過程需要三步握手,SCTP連線的建立過程需要四步握手

TCP連線建立過程,容易受到DoS攻擊。在建立連線的時候,client端需要傳送SYN給server端,server端需要將這些連線請求快取下來。通過這種機制,攻擊者可以傳送大量偽造的SYN包到一個server端,導致server端耗盡記憶體來快取這些連線請求,最終無法服務。

SCTP的建立過程需要四步握手,server端在收到連線請求時,不會立即分配記憶體快取起來,而是返回一個COOKIE。client端需要回送這個COOKIE,server端校驗之後,從cookie中重新獲取有效資訊(比如對端地址列表),才會最終建立這條連線。這樣,可以避免類似TCP的SYN攻擊。

應用程式對此感知不到,對應用程式來說,不管是TCP還是SCTP,都只需要在server端listen一個socket,client呼叫connect()去連線到一個server端。

5. SCTP有heartbeat機制來管理路徑的可用性

SCTP協議本身有heartbeat機制來監控連線/路徑的可用性。

前面說過,SCTP兩端都可以bind多個IP,因此同一條SCTP連線的資料可以採用不同的IP來傳輸。不同的IP傳輸路徑對應一條path,不同的path都可以由heartbeat或者是資料的傳輸/確認來監控其狀態。

如果heartbeat沒相應,或者是資料在某條path超時沒收到確認導致重傳,則認為該path有一次傳輸失敗。如果該path的連續傳輸失敗次數超過path的連續重傳次數,則認為該path不可用,並通知應用程式。如果一條連線的連續傳輸次數超過設定的“連線最大重傳次數”,則該連線被認為不可用,該連線會被關閉並通知應用程式。

下一節將描述SCTP協議是如何實現上述功能的。