網(wǎng)絡(luò)協(xié)議之:sctp流控制傳輸協(xié)議

簡(jiǎn)介

要講網(wǎng)絡(luò)協(xié)議荸频,肯定離不開OSI(Open System Interconnection)的七層模型嚼隘。 我們一般關(guān)注的是網(wǎng)絡(luò)層之上的幾層烂斋,比如IPV4 IPV6所在的網(wǎng)絡(luò)層辽俗,TCP UDP所在的傳輸層,HTTP FTP所在的應(yīng)用層等坐榆。

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

傳輸層已經(jīng)有廣泛被使用的TCP和UDP協(xié)議羹铅,那么為什么還要發(fā)明一個(gè)SCTP協(xié)議呢?

很明顯SCTP協(xié)議是對(duì)TCP和UDP協(xié)議的提升愉昆,具體而言SCTP協(xié)議既提供了UDP協(xié)議的面向消息的特性职员,同時(shí)又具有TCP協(xié)議的可靠性、順序傳輸和擁塞控制的功能跛溉,并且還提供了多宿主和冗余路徑的功能焊切,從而提高彈性和可靠性。

本文將會(huì)詳細(xì)講解SCTP的實(shí)現(xiàn)原理和協(xié)議詳情芳室。

TCP有什么不好

TCP有什么不好呢专肪?TCP當(dāng)然好,我們知道UDP是不可靠的消息傳輸方式堪侯,而TCP是可靠的消息傳輸方式嚎尤。

UDP和TCP已經(jīng)被應(yīng)用在非常廣泛的應(yīng)用場(chǎng)景中。但是一個(gè)產(chǎn)品或者協(xié)議不可能十全十美伍宦,肯定會(huì)有一些缺點(diǎn)芽死,我們來看看TCP的缺點(diǎn)有哪些。

TCP和UDP最大的不同是TCP是可靠的次洼,也就是說TCP提供了通過 Internet 可靠地傳輸數(shù)據(jù)的方法关贵。

但是TCP為了保證可靠的數(shù)據(jù)傳輸,對(duì)傳輸做了一些限制卖毁。

比如說揖曾,TCP為了保證數(shù)據(jù)傳輸?shù)目煽啃裕枰獓?yán)格要求數(shù)據(jù)傳輸?shù)捻樞蚝ダ病1热缫粋€(gè)數(shù)據(jù)包被分拆成了三份分別標(biāo)號(hào)為A炭剪,B,C禁悠。那么對(duì)于接收方來說念祭,則必須先接受數(shù)據(jù)包A,然后是B和C碍侦。如果先接受到的B粱坤,那么接收方就會(huì)需要讓發(fā)送發(fā)重發(fā)數(shù)據(jù)包隶糕。

在這種嚴(yán)格要求數(shù)據(jù)包順序的情況下,可能會(huì)造成不必要的數(shù)據(jù)延遲和消息阻塞站玄。

因?yàn)門CP是面向數(shù)據(jù)流的枚驻,為了標(biāo)記數(shù)據(jù)流中的不同記錄,TCP中的數(shù)據(jù)需要額外添加一些標(biāo)記或者編碼來對(duì)記錄進(jìn)行區(qū)分株旷。

另外再登,為了提升傳輸效率,避免發(fā)送多個(gè)小數(shù)據(jù)包的情況晾剖,TCP還可能會(huì)對(duì)其進(jìn)行優(yōu)化锉矢,也就是說等等多個(gè)小的數(shù)據(jù)包將其合并為一個(gè)大的數(shù)據(jù)包。如果不希望這樣的優(yōu)化齿尽,那么需要在TCP數(shù)據(jù)包中設(shè)置PSH標(biāo)志沽损,明確該請(qǐng)求是無延遲的傳輸請(qǐng)求。

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

sctp的特點(diǎn)

既然TCP還有諸多的缺點(diǎn)绵估,那么新的SCTP協(xié)議又有什么特點(diǎn)呢?

SCTP主要有兩大特點(diǎn)卡骂,第一個(gè)特點(diǎn)就是Message-based,也就是說SCTP是面向消息的国裳。SCTP傳輸?shù)氖且幌盗械南ⅲ粋€(gè)消息是一組字節(jié)全跨。

相比之下TCP傳輸?shù)氖亲止?jié)流缝左。

SCTP中的一條消息可以拆分成為多個(gè)數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊中的所有數(shù)據(jù)都來自同一個(gè)用戶螟蒸。當(dāng)這些數(shù)據(jù)需要在IP中進(jìn)行傳輸?shù)臅r(shí)候盒使,SCTP會(huì)將這些數(shù)據(jù)包打包成為SCTP packets,每個(gè)SCTP packet,都包含一個(gè)packet header,如果需要的話還可以包含控制塊七嫌,最后跟著的是數(shù)據(jù)塊。

怎么理解TCP包和SCTP包的不同呢苞慢?

舉個(gè)例子诵原,當(dāng)客戶端以TCP協(xié)議向服務(wù)器端發(fā)送多條消息的時(shí)候,如果消息非常短挽放,為了提升傳輸效率绍赛,TCP可能會(huì)將這些不同作用的小的數(shù)據(jù)放到同一個(gè)TCP包中。在服務(wù)器端接收的過程中也是一次收取這個(gè)TCP包中的所有數(shù)據(jù)辑畦,然后由應(yīng)用程序本身來進(jìn)行TCP包中底層數(shù)據(jù)的拆分吗蚌。

對(duì)于SCTP包來說,一個(gè)SCTP包中可以包含多個(gè)data chunks纯出,不同的data chunks可以包含不同用戶的不同消息蚯妇,因?yàn)镾CTP包已經(jīng)對(duì)不同的消息進(jìn)行了區(qū)分敷燎,所以對(duì)于服務(wù)器端的讀取來說就相對(duì)容易很多。

下面是一個(gè)SCTP包的基本結(jié)構(gòu):

[圖片上傳失敗...(image-fa768c-1652684823265)]

從上圖可以看出箩言,前面的藍(lán)色部分的12個(gè)字節(jié)是SCTP包的包頭硬贯,其中前面的兩個(gè)字節(jié)是源端口號(hào),接著的兩個(gè)字節(jié)是目標(biāo)端口號(hào)陨收,然后4個(gè)字節(jié)是驗(yàn)證標(biāo)記饭豹,最后的4個(gè)直接是校驗(yàn)位,總共12個(gè)字節(jié)务漩。

header后面就是data chunks,也就是數(shù)據(jù)塊拄衰,每個(gè)chunk都包含一個(gè)類型位,flags位和長(zhǎng)度位饵骨,后面跟著的是chunk的具體數(shù)據(jù)肾砂。

SCTP的另外一個(gè)特點(diǎn)就是multi-streaming,多流指的是SCTP能夠并行傳輸多個(gè)獨(dú)立的數(shù)據(jù)流,比如在訪問網(wǎng)頁的時(shí)候可以同時(shí)傳輸網(wǎng)頁中的圖像和網(wǎng)頁的文本宏悦。

為什么可以這樣操作呢镐确?這也是由SCTP數(shù)據(jù)包的結(jié)構(gòu)來決定的,我們可以看到SCTP的數(shù)據(jù)包中可以包含多個(gè)data chunks,這些data chunks可以包含不同的數(shù)據(jù)流過來的數(shù)據(jù)饼煞,所以面向消息的SCTP可以實(shí)現(xiàn)并行傳輸不同數(shù)據(jù)源數(shù)據(jù)的功能源葫。

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

這是什么意思呢息堂?

我們知道對(duì)于TCP協(xié)議來說,客戶端和服務(wù)器端都只有一個(gè)块促,屬于一對(duì)一進(jìn)行連接的情況荣堰,如果這個(gè)連接兩端的而任何一個(gè)IP或者端口不可以,那么整個(gè)TCP的連接就崩潰了竭翠。

那么TCP可不可以發(fā)展為類似LSB負(fù)載均衡的模式呢振坚?如果一個(gè)IP不可以,自動(dòng)重連到備用的IP地址斋扰。

SCTP就是TCP協(xié)議的升級(jí)版本渡八,它在增強(qiáng)可靠性方面做了優(yōu)化。

具體而言传货,每個(gè)SCTP的節(jié)點(diǎn)都會(huì)使用心跳的機(jī)制定時(shí)檢查遠(yuǎn)程節(jié)點(diǎn)的主IP地址和備用的冗余IP地址的可達(dá)性屎鳍。在SCTP中一個(gè)節(jié)點(diǎn)可以綁定多個(gè)IP地址。

SCTP節(jié)點(diǎn)將會(huì)根據(jù)收到的遠(yuǎn)程節(jié)點(diǎn)的心跳返回值來確認(rèn)具體的訪問信息问裕。

因?yàn)榭蛻舳斯?jié)點(diǎn)和服務(wù)器端節(jié)點(diǎn)的個(gè)數(shù)可能是不同的逮壁,所以SCTP可以分為對(duì)稱的multihoming和非對(duì)稱的multihoming。

下面三個(gè)圖分別是對(duì)稱multihoming和兩個(gè)非對(duì)稱multihoming的情況:

[圖片上傳失敗...(image-93f144-1652684823265)]

[圖片上傳失敗...(image-9702bd-1652684823265)]

[圖片上傳失敗...(image-928db9-1652684823265)]

最后粮宛,SCTP的安全性也有所提升窥淆。相較于TCP的三次握手相比卖宠,SCTP具有四次握手。

TCP的三次握手可能導(dǎo)致SYN攻擊祖乳。

什么是SYN攻擊呢逗堵?我們回顧一下TCP的三次握手流程,首先客戶端發(fā)送一個(gè)SYN A請(qǐng)求給服務(wù)器端眷昆,服務(wù)器端在收到這個(gè)SYN請(qǐng)求之后蜒秤,會(huì)將SYN請(qǐng)求緩存起來,然后向客戶端返回SYN B亚斋,ACK A+1, 客戶端在收到回復(fù)之后作媚,校驗(yàn)ACK的值,然后再次發(fā)送ACK B+1到服務(wù)器端帅刊。服務(wù)器端收到B+1請(qǐng)求之后纸泡,最終確認(rèn)客戶端的身份,連接建立完成赖瞒。

上面的流程中因?yàn)榉?wù)器端需要緩存TCP客戶端的SYN消息女揭,所以如果服務(wù)器收到大量SYN消息的話,就造成了SYN攻擊栏饮。

相較而言吧兔,SCTP在收到客戶端的連接請(qǐng)求之后,并不會(huì)立即分配內(nèi)存緩存起來袍嬉,而是返回一個(gè)COOKIE給客戶端境蔼。客戶端再次請(qǐng)求的時(shí)候伺通,需要帶上這個(gè)COOKIE信息箍土,服務(wù)器端通過COOKIE校驗(yàn),確認(rèn)客戶端的身份之后,才會(huì)最終建立連接罐监。從而避免TCP的SYN攻擊吴藻。

總結(jié)

綜上所述,SCTP可以保證有序和無數(shù)數(shù)據(jù)流的可靠傳輸笑诅,可以支持Multihoming调缨,每個(gè)節(jié)點(diǎn)都可以包含多個(gè)IP地址,從而實(shí)現(xiàn)冗余網(wǎng)絡(luò)路徑之間的透明故障轉(zhuǎn)移吆你。并提升了驗(yàn)證和確認(rèn)機(jī)制,可以防止SYN攻擊俊犯。

SCTP是一個(gè)非常優(yōu)秀的協(xié)議妇多。對(duì)于常用的操作系統(tǒng)而言,在特定的版本也提供了對(duì)SCTP的支持燕侠。比如在linux中者祖,內(nèi)核2.4版本之上都支持SCTP協(xié)議立莉。

如果在windows或者M(jìn)AC上,需要額外安裝第三方驅(qū)動(dòng)七问,其中windows的驅(qū)動(dòng)叫做SctpDrv kernel driver,MAC上的驅(qū)動(dòng)叫做SCTP Network Kernel Extension for Mac OS X蜓耻。

本文已收錄于 http://www.flydean.com/21-sctp/

最通俗的解讀躏敢,最深刻的干貨客峭,最簡(jiǎn)潔的教程蝙寨,眾多你不知道的小技巧等你來發(fā)現(xiàn)述寡!

歡迎關(guān)注我的公眾號(hào):「程序那些事」,懂技術(shù)告丢,更懂你岂膳!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末修肠,一起剝皮案震驚了整個(gè)濱河市林说,隨后出現(xiàn)的幾起案子古程,更是在濱河造成了極大的恐慌蔼卡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣磨,死亡現(xiàn)場(chǎng)離奇詭異雇逞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茁裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門塘砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呜达,你說我怎么就攤上這事谣蠢。” “怎么了查近?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵眉踱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我霜威,道長(zhǎng)谈喳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任戈泼,我火速辦了婚禮婿禽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大猛。我一直安慰自己扭倾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布挽绩。 她就那樣靜靜地躺著膛壹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上模聋,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天肩民,我揣著相機(jī)與錄音,去河邊找鬼链方。 笑死持痰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祟蚀。 我是一名探鬼主播工窍,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暂题!你這毒婦竟也來了移剪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤薪者,失蹤者是張志新(化名)和其女友劉穎纵苛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體言津,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攻人,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悬槽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀吻。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖初婆,靈堂內(nèi)的尸體忽然破棺而出蓬坡,到底是詐尸還是另有隱情,我是刑警寧澤磅叛,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布屑咳,位于F島的核電站,受9級(jí)特大地震影響弊琴,放射性物質(zhì)發(fā)生泄漏兆龙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一敲董、第九天 我趴在偏房一處隱蔽的房頂上張望紫皇。 院中可真熱鬧,春花似錦腋寨、人聲如沸聪铺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽计寇。三九已至,卻和暖如春脂倦,著一層夾襖步出監(jiān)牢的瞬間番宁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工赖阻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝶押,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓火欧,卻偏偏與公主長(zhǎng)得像棋电,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苇侵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容