天天看點

SCTP簡介

SCTP (Stream Control Transmission Protocol)是一種傳輸協定,在TCP/IP協定棧中所處的位置和TCP、UDP類似,兼有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連接配接就還可以用。

SCTP簡介
SCTP簡介

展現在socket API中,TCP隻能bind一個IP,而SCTP可以bind到多個IP。

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

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

SCTP簡介

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

SCTP簡介

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協定是如何實作上述功能的。

繼續閱讀