TCP和UDP的優(yōu)點(diǎn)和缺點(diǎn)都很明顯,總之是:各有千秋、旗鼓相當(dāng)、難分軒輊、互有短長(zhǎng)。
聰明的粉絲是善于思考和發(fā)問(wèn)的:有沒(méi)有一種協(xié)議,可以將TCP和UDP的優(yōu)點(diǎn)集于一身?
來(lái)吧,今天文檔君就和大家一起了解一下SCTP,解答各位粉絲的疑問(wèn)吧!
Part1 什么是SCTP?
SCTP(Stream Control Transmission Protocol,流控傳輸協(xié)議)的出現(xiàn),并不是萬(wàn)丈高樓平地起,而是站在TCP這個(gè)巨人肩膀上,讓數(shù)據(jù)傳輸從“可靠”變得“更快更安全”。
假設(shè)有2個(gè)主機(jī)(Host)之間想要通過(guò)IP通信,SCTP在TCP的基礎(chǔ)上,進(jìn)行了下面的一系列改造:
端點(diǎn) 端點(diǎn)位于主機(jī)上,是一個(gè)邏輯實(shí)體。簡(jiǎn)單來(lái)說(shuō),2個(gè)主機(jī)之間進(jìn)行數(shù)據(jù)傳輸?shù)脑?,端點(diǎn)可以看作是“起點(diǎn)”和“終點(diǎn)”。 1個(gè)主機(jī)可以有多個(gè)IP地址和多個(gè)開(kāi)放端口,IP地址+端口號(hào)的組合,稱為傳送地址。 一個(gè)傳送地址,例如:100.100.10.1:1000,可以唯一標(biāo)識(shí)一個(gè)端點(diǎn)。一個(gè)端點(diǎn),可以擁有多個(gè)不同的傳送地址。例如:端點(diǎn)A可以使用的傳送地址包括100.100.10.1:1000、100.100.10.2:1000、100.100.10.1:1001。端點(diǎn)B可以使用的傳送地址包括200.200.20.1:2000、200.200.20.2:2000。那么端點(diǎn)A可以使用傳送地址100.100.10.1:1000、100.100.10.2:1000,與端點(diǎn)B進(jìn)行數(shù)據(jù)傳輸。 細(xì)心的粉絲應(yīng)該也發(fā)現(xiàn)了,對(duì)于同1個(gè)目的端點(diǎn),起始端點(diǎn)的多個(gè)傳送地址之間,端口號(hào)可以相同,IP地址必須不相同。
如果將網(wǎng)絡(luò)世界比作是海洋,主機(jī)可以看做是港口,端點(diǎn)就是港口中專營(yíng)數(shù)據(jù)進(jìn)出口的商家,傳送地址就是港口中的一個(gè)個(gè)碼頭,海量的數(shù)據(jù)通過(guò)碼頭完成了裝載出發(fā)和到達(dá)卸載。 偶聯(lián)(Association) 2個(gè)端點(diǎn)之間,通過(guò)四步握手機(jī)制建立的邏輯聯(lián)系或者通道,叫做偶聯(lián)。
SCTP規(guī)定:在任何時(shí)刻的2個(gè)端點(diǎn)之間,最多只能建立1個(gè)偶聯(lián)。 港口A中的本端端點(diǎn)(商家A),要想與港口B中的對(duì)端端點(diǎn)(商家B)進(jìn)行數(shù)據(jù)傳輸,必須握手四次,成功達(dá)成共識(shí),相當(dāng)于簽訂了一個(gè)進(jìn)行數(shù)據(jù)傳輸?shù)暮贤?只有成功建立偶聯(lián)(簽訂合同)后,2個(gè)端點(diǎn)之間才可以進(jìn)行數(shù)據(jù)的傳輸。
流(Stream)
流是SCTP協(xié)議中的一個(gè)特殊術(shù)語(yǔ),主要用來(lái)指明數(shù)據(jù)的序列:1個(gè)流中包含了多個(gè)消息,而且消息之間是有先后順序的。
在1個(gè)偶聯(lián)中,包含了多個(gè)流,每個(gè)流,都是從1個(gè)端點(diǎn)到另外1個(gè)端點(diǎn)的單向邏輯通道。
每個(gè)流都有自己專屬的流ID,不同流之間是相互獨(dú)立的,每個(gè)流可以單獨(dú)發(fā)送數(shù)據(jù)而不受其他流的影響。
數(shù)據(jù)是如何從一個(gè)碼頭傳輸?shù)搅硗庖粋€(gè)碼頭的?
TCP和SCTP各有自己的方式:SCTP采用了流,流中的數(shù)據(jù)是以塊為基本單位;TCP采用了包,包中的數(shù)據(jù)以字節(jié)為基本單位。
相當(dāng)于TCP在傳輸數(shù)據(jù)的時(shí)候,一艘貨船上只裝載1件貨物。而STCP在傳輸數(shù)據(jù)的時(shí)候,將多件貨物打包成集裝箱,一艘貨船上可以裝載N多個(gè)集裝箱,而且集裝箱之間是有編號(hào)的,是順序排列的。
通路(Path) 通路是在一個(gè)偶聯(lián)中,數(shù)據(jù)在傳輸過(guò)程中所經(jīng)過(guò)的路徑。這個(gè)路徑,是可以多條的。通路的數(shù)量,取決于一個(gè)偶聯(lián)中的起始端點(diǎn)、目的端點(diǎn)中使用的傳送地址的數(shù)量。 簡(jiǎn)單來(lái)說(shuō),本端端點(diǎn)(商家A)擁有2個(gè)碼頭,對(duì)端端點(diǎn)(商家B)也擁有2個(gè)碼頭,那數(shù)據(jù)要裝船啟航,就有4條不同的航線可以選擇。
Path0:本端傳送地址1(100.100.10.1:1000)發(fā)送SCTP分組到對(duì)端傳送地 址1(200.200.20.1:2000)。
Path1:本端傳送地址2(100.100.10.2:1000)發(fā)送SCTP分組到對(duì)端傳送地 址1(200.200.20.1:2000)。
Path2:本端傳送地址1(100.100.10.1:1000)發(fā)送SCTP分組到對(duì)端傳送地 址2(200.200.20.2:2000)。
Path3:本端傳送地址2(100.100.10.2:1000)發(fā)送SCTP分組到對(duì)端傳送地 址2(200.200.20.2:2000)。
一般情況下,兩個(gè)端點(diǎn)之間會(huì)選擇一條航線,作為首選通路。一旦首選通路出現(xiàn)故障,SCTP可以將航線自動(dòng)切換到其他備用的通路上。
Part2 SCTP如何加快數(shù)據(jù)傳輸?
在上述改進(jìn)的基礎(chǔ)上,SCTP的數(shù)據(jù)傳輸效率有了飛躍。 SCTP的基本工作步驟如下:
建立偶聯(lián):握手四次,成功達(dá)成共識(shí)。
打開(kāi)數(shù)據(jù)流:在建立偶聯(lián)后,發(fā)送OPEN消息來(lái)打開(kāi)1個(gè)新的數(shù)據(jù)流。OPEN消息中包含了流的ID、優(yōu)先級(jí)和其他參數(shù)。
發(fā)送數(shù)據(jù):一旦數(shù)據(jù)流打開(kāi),就可以在這個(gè)流上發(fā)送數(shù)據(jù),通過(guò)發(fā)送USER消息來(lái)完成。USER消息中包含了流ID和要發(fā)送的數(shù)據(jù)。
關(guān)閉數(shù)據(jù)流:數(shù)據(jù)都已經(jīng)傳輸完畢,發(fā)送1個(gè)CLOSE消息來(lái)關(guān)閉數(shù)據(jù)流。CLOSE消息中包含了流ID和其他參數(shù)。
關(guān)閉偶聯(lián):發(fā)送1個(gè)SHUTDOWN消息來(lái)關(guān)閉偶聯(lián)。SHUTDOWN消息中包含了關(guān)閉連接的原因和其他參數(shù)。
在發(fā)送數(shù)據(jù)的環(huán)節(jié)上,SCTP擁有一些獨(dú)特的辦法:
首先,SCTP是面向消息的傳輸,將上層應(yīng)用傳遞下來(lái)的用戶數(shù)據(jù)以消息的形式傳輸,SCTP提供消息的拆分、綁定、重組功能。
在傳輸側(cè),將用戶數(shù)據(jù)裝入一個(gè)集裝箱,這個(gè)集裝箱叫做SCTP分組。 每個(gè)SCTP分組包括一個(gè)公共頭和多個(gè)塊,塊分為控制塊和數(shù)據(jù)塊,控制塊用于SCTP的連接控制,包括連接的建立、關(guān)閉、傳輸路徑的維護(hù)等;數(shù)據(jù)塊包含了應(yīng)用層的用戶數(shù)據(jù)。
而且如果某個(gè)用戶數(shù)據(jù)的長(zhǎng)度很短,裝在一個(gè)集裝箱內(nèi)會(huì)很浪費(fèi)空間。SCTP可以將多個(gè)用戶數(shù)據(jù)綁定在一起,裝在同一個(gè)集裝箱的數(shù)據(jù)塊中,大大提高了利用率。
在接收側(cè),SCTP將一個(gè)集裝箱的內(nèi)用戶數(shù)據(jù),重新組裝成完整的用戶數(shù)據(jù),傳遞給上層應(yīng)用。
其次,SCTP支持多路復(fù)用,即允許在1個(gè)偶聯(lián)中發(fā)送多個(gè)流。每個(gè)流,都是一艘艘裝載滿數(shù)據(jù)的貨船,每個(gè)貨船都有自己獨(dú)特的ID,相互之間互不影響。
Part3 SCTP如何讓數(shù)據(jù)傳輸更安全?
SCTP在以下幾個(gè)方面,對(duì)數(shù)據(jù)傳輸?shù)陌踩?、穩(wěn)定性進(jìn)行了有效的保障。
只是因?yàn)榻⑦B接時(shí),多握了一次手
SCTP的四次握手流程如下:
本端端點(diǎn)(商家A)發(fā)送INIT消息到對(duì)端端點(diǎn)(商家B),向?qū)Χ硕它c(diǎn)(商家B)通知本端端點(diǎn)(商家A)的接收窗口大小、地址列表、初始標(biāo)記及發(fā)送的第一個(gè)DATA包的發(fā)送序號(hào)。
對(duì)端端點(diǎn)(商家B)收到INIT消息后,回送INIT ACK消息給本端端點(diǎn)。INIT ACK消息中除了攜帶著與INIT消息相同的自己的連接信息外,還攜帶有狀態(tài)的COOKIE信息。
本端端點(diǎn)(商家A)收到INIT ACK消息后。利用消息中的STATE COOKIE生成COOKIE ECHO消息,將COOKIE ECHO消息發(fā)到對(duì)端端點(diǎn)(商家B),告訴對(duì)端端點(diǎn)(商家B)已收到消息。
對(duì)端端點(diǎn)(商家B)在收到合法的COOKIE ECHO后,開(kāi)始進(jìn)行創(chuàng)建連接TCB(傳輸控制塊)和申請(qǐng)資源的工作,發(fā)送COOKIE ACK消息給本端端點(diǎn),并進(jìn)入ESTABLISH狀態(tài)。對(duì)端端點(diǎn)(商家B)在收到COOKIE ACK后,狀態(tài)變?yōu)镋STABLISH,至此完成連接建立工作。
與TCP的三次握手流程對(duì)比,SCTP在第2步和第3步中使用了COOKIE ECHO和INIT ACK消息,這2個(gè)消息都包含了對(duì)端端點(diǎn)(商家B)的參數(shù)信息和Cookie值。 這些參數(shù)信息和Cookie值用于驗(yàn)證對(duì)端端點(diǎn)(商家B)的身份,保證連接的安全性。 還因?yàn)樵趥鬏敂?shù)據(jù)時(shí),多了身份的認(rèn)證。 SCTP提供了無(wú)差錯(cuò)的傳輸服務(wù),靠的是在集裝箱公共分組頭里面,包含了一個(gè)驗(yàn)證標(biāo)簽(VerificATIon Tag)和一個(gè)可選的32位校驗(yàn)碼(Checksum)。
驗(yàn)證標(biāo)簽的值,在建立偶聯(lián)(簽訂合同)時(shí),由本端端點(diǎn)(商家A)和對(duì)端端點(diǎn)(商家B)共同設(shè)置的。 如果收到的集裝箱公共分組頭中如果沒(méi)有期望的驗(yàn)證標(biāo)簽值,對(duì)端端點(diǎn)(商家B)會(huì)認(rèn)為這個(gè)集裝箱是危險(xiǎn)的或者無(wú)效的,將丟棄這個(gè)集裝箱。
集裝箱中的校驗(yàn)碼,是通過(guò)ADLER-32算法在數(shù)據(jù)塊的基礎(chǔ)上計(jì)算出來(lái)的32位字符串。本端端點(diǎn)(商家A)把計(jì)算后的校驗(yàn)碼放在集裝箱中,是為了給數(shù)據(jù)塊的一個(gè)額外保護(hù),用來(lái)避免由網(wǎng)絡(luò)造成的數(shù)據(jù)差錯(cuò)。
對(duì)端端點(diǎn)(商家B)收到集裝箱,也通過(guò)ADLER-32算法在數(shù)據(jù)塊基礎(chǔ)上計(jì)算出來(lái)1個(gè)校驗(yàn)碼,如果和集裝箱里已有的32位校驗(yàn)碼一致,說(shuō)明數(shù)據(jù)塊是沒(méi)有差錯(cuò)的。 如果兩個(gè)校驗(yàn)碼不一致,說(shuō)明數(shù)據(jù)塊出錯(cuò)了,對(duì)端端點(diǎn)(商家B)也會(huì)丟棄這個(gè)集裝箱。
也因?yàn)樵谕房臻e時(shí),多了心跳的檢測(cè)。
SCTP通過(guò)心跳檢測(cè)功能,定期檢查連接的健康狀況,從而及時(shí)發(fā)現(xiàn)和修復(fù)連接問(wèn)題。
當(dāng)某條通路空閑時(shí),本端端點(diǎn)(商家A)會(huì)要求SCTP生成相應(yīng)的心跳消息,并通過(guò)該通路發(fā)送到對(duì)端端點(diǎn)(商家B),而對(duì)端端點(diǎn)(商家B)必須立即發(fā)回對(duì)應(yīng)的心跳確認(rèn)消息。
通過(guò)這樣的方式,SCTP精確測(cè)量回路時(shí)延RTT(Round Trip Time),達(dá)到監(jiān)控偶聯(lián)的可用情況和保持SCTP 偶聯(lián)的激活狀態(tài)的目的。
Part4 SCTP的發(fā)展趨勢(shì)如何?
前面講過(guò),SCTP是在TCP的基礎(chǔ)上進(jìn)行了一些改進(jìn)。
這是因?yàn)門CP在處理多媒體應(yīng)用時(shí),存在擁塞控制問(wèn)題和可靠傳輸問(wèn)題。
所以早在1990年代中期,人們就開(kāi)始研究SCTP協(xié)議,并先后發(fā)布了多個(gè)版本。
每個(gè)新版本,都是對(duì)前一個(gè)版本的改進(jìn),并在2000 年成為 RFC 2960,相關(guān)的RFC 3286是介紹性的文檔、RFC 4960(2007)是RFC 2960的替代協(xié)議。
為了適應(yīng)不斷發(fā)展變化的網(wǎng)絡(luò)標(biāo)準(zhǔn),SCTP也在不斷進(jìn)化,比如:增加了端到端的認(rèn)證功能、改進(jìn)了心跳機(jī)制,優(yōu)化了調(diào)度算法。
TCP/UDP有其先發(fā)優(yōu)勢(shì),已經(jīng)廣泛應(yīng)用在網(wǎng)絡(luò)的各種場(chǎng)景中。
SCTP作為后來(lái)者,目前的應(yīng)用范圍有限,卻也在越來(lái)越多的場(chǎng)景中得到應(yīng)用,比如:多媒體會(huì)議、視頻會(huì)議。
Part5 今天大家學(xué)到了什么?
文檔君為大家總結(jié)了一下,你學(xué)會(huì)了嗎?
站在TCP的肩膀上,SCTP有一些自己的特點(diǎn),比如:端點(diǎn)、偶聯(lián)、流、通路。
消息傳輸、多路復(fù)用,讓數(shù)據(jù)傳輸更加有效率。
多一次握手,驗(yàn)證標(biāo)簽和驗(yàn)證碼,檢測(cè)心跳,SCTP就想給數(shù)據(jù)一些穩(wěn)穩(wěn)的安全感。
一項(xiàng)技術(shù)都是早早出現(xiàn)、慢慢改進(jìn)、逐步應(yīng)用,需要經(jīng)過(guò)時(shí)間的檢驗(yàn)。
審核編輯:劉清
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1792瀏覽量
64411 -
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17060 -
SCTP
+關(guān)注
關(guān)注
0文章
7瀏覽量
8129
原文標(biāo)題:讓“可靠”變得“更快更安全”的數(shù)據(jù)傳輸協(xié)議:SCTP
文章出處:【微信號(hào):ztedoc,微信公眾號(hào):中興文檔】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論