https://blog.csdn.net/wuxing26jiayou/article/details/79743683
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連接就還可以用。
體現在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協議是如何實現上述功能的。