網路協議之:sctp流控制傳輸協議

簡介

要講網路協議,肯定離不開OSI(Open System Interconnection)的七層模型。 我們一般關注的是網路層之上的幾層,比如IPV4 IPV6所在的網路層,TCP UDP所在的傳輸層,HTTP FTP所在的應用層等。

今天要講的sctp協議,全稱是Stream Control Transmission Protocol,翻譯成中文就是流控制傳輸協議。是由IETF在RFC 4960中提出的。

傳輸層已經有廣泛被使用的TCP和UDP協議,那麼為什麼還要發明一個SCTP協議呢?

很明顯SCTP協議是對TCP和UDP協議的提升,具體而言SCTP協議既提供了UDP協議的面向消息的特性,同時又具有TCP協議的可靠性、順序傳輸和擁塞控制的功能,並且還提供了多宿主和冗餘路徑的功能,從而提高彈性和可靠性。

本文將會詳細講解SCTP的實現原理和協議詳情。

TCP有什麼不好

TCP有什麼不好呢?TCP當然好,我們知道UDP是不可靠的消息傳輸方式,而TCP是可靠的消息傳輸方式。

UDP和TCP已經被應用在非常廣泛的應用場景中。但是一個產品或者協議不可能十全十美,肯定會有一些缺點,我們來看看TCP的缺點有哪些。

TCP和UDP最大的不同是TCP是可靠的,也就是說TCP提供了通過 Internet 可靠地傳輸數據的方法。

但是TCP為了保證可靠的數據傳輸,對傳輸做了一些限制。

比如說,TCP為了保證數據傳輸的可靠性,需要嚴格要求數據傳輸的順序。比如一個數據包被分拆成了三份分別標號為A,B,C。那麼對於接收方來說,則必須先接受數據包A,然後是B和C。如果先接受到的B,那麼接收方就會需要讓發送發重發數據包。

在這種嚴格要求數據包順序的情況下,可能會造成不必要的數據延遲和消息阻塞。

因為TCP是面向數據流的,為了標記數據流中的不同記錄,TCP中的數據需要額外添加一些標記或者編碼來對記錄進行區分。

另外,為了提升傳輸效率,避免發送多個小數據包的情況,TCP還可能會對其進行優化,也就是說等等多個小的數據包將其合併為一個大的數據包。如果不希望這樣的優化,那麼需要在TCP數據包中設置PSH標誌,明確該請求是無延遲的傳輸請求。

最後TCP還容易收到DOS(denial-of-service)攻擊。

sctp的特點

既然TCP還有諸多的缺點,那麼新的SCTP協議又有什麼特點呢?

SCTP主要有兩大特點,第一個特點就是Message-based,也就是說SCTP是面向消息的。SCTP傳輸的是一系列的消息,一個消息是一組位元組。

相比之下TCP傳輸的是位元組流。

SCTP中的一條消息可以拆分成為多個數據塊,每個數據塊中的所有數據都來自同一個用戶。當這些數據需要在IP中進行傳輸的時候,SCTP會將這些數據包打包成為SCTP packets,每個SCTP packet,都包含一個packet header,如果需要的話還可以包含控制塊,最後跟著的是數據塊。

怎麼理解TCP包和SCTP包的不同呢?

舉個例子,當客戶端以TCP協議向伺服器端發送多條消息的時候,如果消息非常短,為了提升傳輸效率,TCP可能會將這些不同作用的小的數據放到同一個TCP包中。在伺服器端接收的過程中也是一次收取這個TCP包中的所有數據,然後由應用程式本身來進行TCP包中底層數據的拆分。

對於SCTP包來說,一個SCTP包中可以包含多個data chunks,不同的data chunks可以包含不同用戶的不同消息,因為SCTP包已經對不同的消息進行了區分,所以對於伺服器端的讀取來說就相對容易很多。

下面是一個SCTP包的基本結構:

從上圖可以看出,前面的藍色部分的12個位元組是SCTP包的包頭,其中前面的兩個位元組是源埠號,接著的兩個位元組是目標埠號,然後4個位元組是驗證標記,最後的4個直接是校驗位,總共12個位元組。

header後面就是data chunks,也就是數據塊,每個chunk都包含一個類型位,flags位和長度位,後面跟著的是chunk的具體數據。

SCTP的另外一個特點就是multi-streaming,多流指的是SCTP能夠並行傳輸多個獨立的數據流,比如在訪問網頁的時候可以同時傳輸網頁中的影像和網頁的文本。

為什麼可以這樣操作呢?這也是由SCTP數據包的結構來決定的,我們可以看到SCTP的數據包中可以包含多個data chunks,這些data chunks可以包含不同的數據流過來的數據,所以面向消息的SCTP可以實現並行傳輸不同數據源數據的功能。

SCTP的另外一個特性就是Multihoming,Multihoming是multiple+homing的合成詞,字面上的意思就是多個home。

這是什麼意思呢?

我們知道對於TCP協議來說,客戶端和伺服器端都只有一個,屬於一對一進行連接的情況,如果這個連接兩端的而任何一個IP或者埠不可以,那麼整個TCP的連接就崩潰了。

那麼TCP可不可以發展為類似LSB負載均衡的模式呢?如果一個IP不可以,自動重連到備用的IP地址。

SCTP就是TCP協議的升級版本,它在增強可靠性方面做了優化。

具體而言,每個SCTP的節點都會使用心跳的機制定時檢查遠程節點的主IP地址和備用的冗餘IP地址的可達性。在SCTP中一個節點可以綁定多個IP地址。

SCTP節點將會根據收到的遠程節點的心跳返回值來確認具體的訪問資訊。

因為客戶端節點和伺服器端節點的個數可能是不同的,所以SCTP可以分為對稱的multihoming和非對稱的multihoming。

下面三個圖分別是對稱multihoming和兩個非對稱multihoming的情況:

最後,SCTP的安全性也有所提升。相較於TCP的三次握手相比,SCTP具有四次握手。

TCP的三次握手可能導致SYN攻擊。

什麼是SYN攻擊呢?我們回顧一下TCP的三次握手流程,首先客戶端發送一個SYN A請求給伺服器端,伺服器端在收到這個SYN請求之後,會將SYN請求快取起來,然後向客戶端返回SYN B,ACK A+1, 客戶端在收到回復之後,校驗ACK的值,然後再次發送ACK B+1到伺服器端。伺服器端收到B+1請求之後,最終確認客戶端的身份,連接建立完成。

上面的流程中因為伺服器端需要快取TCP客戶端的SYN消息,所以如果伺服器收到大量SYN消息的話,就造成了SYN攻擊。

相較而言,SCTP在收到客戶端的連接請求之後,並不會立即分配記憶體快取起來,而是返回一個COOKIE給客戶端。客戶端再次請求的時候,需要帶上這個COOKIE資訊,伺服器端通過COOKIE校驗,確認客戶端的身份之後,才會最終建立連接。從而避免TCP的SYN攻擊。

總結

綜上所述,SCTP可以保證有序和無數數據流的可靠傳輸,可以支援Multihoming,每個節點都可以包含多個IP地址,從而實現冗餘網路路徑之間的透明故障轉移。並提升了驗證和確認機制,可以防止SYN攻擊。

SCTP是一個非常優秀的協議。對於常用的作業系統而言,在特定的版本也提供了對SCTP的支援。比如在linux中,內核2.4版本之上都支援SCTP協議。

如果在windows或者MAC上,需要額外安裝第三方驅動,其中windows的驅動叫做SctpDrv kernel driver,MAC上的驅動叫做SCTP Network Kernel Extension for Mac OS X。

本文已收錄於 //www.flydean.com/21-sctp/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!