0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SCTP流控制傳輸協(xié)議簡(jiǎn)析

SDNLAB ? 來(lái)源:云物互聯(lián) ? 2023-07-25 10:02 ? 次閱讀

SCTP

SCTP(Stream Control Transmission Protocol,流控制傳輸協(xié)議,RFC 2960、RFC 3286、RFC 3309)是一個(gè) IP 協(xié)議之上的、可靠的、面向控制信令的、傳輸層協(xié)議。SCTP 可以在 “盡力而為(無(wú)連接、不可靠)” 的 IP 網(wǎng)絡(luò)之上為電信級(jí)信令傳輸提供高效、可靠的信令傳輸服務(wù),例如 5GC 中的 N2 接口就使用了 SCTP 協(xié)議。 SCTP 的誕生是為了彌補(bǔ) TCP/UDP 在電信網(wǎng)絡(luò)控制信令傳輸場(chǎng)景中的不足,它們都難以完全滿足在電信網(wǎng)絡(luò)中信令承載的要求。包括:

UDP 是一種無(wú)連接的不可靠傳輸協(xié)議,自然無(wú)法滿足信令對(duì)傳輸質(zhì)量的要求。

TCP 雖然是一種基于連接的可靠傳輸協(xié)議,但同時(shí)也具有隊(duì)頭阻塞、實(shí)時(shí)性差、支持多歸屬困難、易受 DDOS(拒絕服務(wù))攻擊的缺陷。

為了解決 TCP/UDP 協(xié)議在傳輸實(shí)時(shí)信令時(shí)所面臨的不可靠傳輸和時(shí)延等問(wèn)題,SCTP 協(xié)議設(shè)計(jì)了以下的核心特性,包括:

適當(dāng)?shù)膿砣刂疲?/p>

防止泛濫和偽裝攻擊;

更優(yōu)的實(shí)時(shí)性能;

多屬主(Multi-homing)特性支持;

多流(Multi-streaming)特性支持;

等等。

676ff96e-2a10-11ee-a368-dac502259ad0.png

SCTP 與 TCP 的區(qū)別

和 TCP 類(lèi)似,SCTP 是面向連接、端到端、全雙工、帶有流量和擁塞控制的可靠傳輸協(xié)議。數(shù)據(jù)可靠傳輸都是通過(guò)確認(rèn)機(jī)制來(lái)實(shí)現(xiàn)的,與 TCP 的區(qū)別是:

TCP 是以字節(jié)為單位傳輸?shù)?,SCTP 是以數(shù)據(jù)塊為單位傳輸?shù)摹?/p>

TCP 通常是單路徑傳輸,SCTP 可以多路徑傳輸。

TCP 的兩端都只能用一個(gè) IP 來(lái)建立連接,連接建立之后就只能用這一對(duì) IP 來(lái)相互收發(fā)消息。如果這一對(duì) IP 之間的路徑出了問(wèn)題,那這條 TCP 連接就不可用了;而 SCTP 的兩端都可以綁定到多個(gè) IP 上,只要有其中一對(duì) IP 能通,這條 SCTP 連接就還可以用。這就是 SCTP 的多宿主機(jī)制。

TCP 是單流的有序傳輸,SCTP 可以多流獨(dú)立有序/無(wú)序傳輸。這就是 SCTP 的多流機(jī)制。

TCP 連接的建立過(guò)程需要三步握手,SCTP 連接的建立過(guò)程需要四步握手。

SCTP 有 Heartbeat(心跳)機(jī)制來(lái)管理路徑的可用性。

SCTP 與 QUIC 的區(qū)別

SCTP 在 WebRTC 上已有基于 UDP 的實(shí)現(xiàn),但 SCTP/UDP 與 QUIC/UDP 相比還不夠好:

沒(méi)有解決數(shù)據(jù)流的隊(duì)頭阻塞問(wèn)題。

連接建立時(shí)需要決定數(shù)據(jù)流的數(shù)量。

沒(méi)有穩(wěn)固的 TLS 安全性支持。

建立連接時(shí)候需要 4 次握手,而 QUIC 一次都不用(0-RTT)。

QUIC 是類(lèi) TCP 的字節(jié)流,而 SCTP 是信息流(message-based)。

QUIC 連接支持 IP 地址遷移,SCTP 不行。

SCTP 的基本概念

主機(jī)(Host)和端點(diǎn)(Endpoint)

主機(jī)(Host)就是具有一個(gè)或多個(gè) IP 地址的計(jì)算機(jī),是一個(gè)物理概念;

端點(diǎn)(Endpoint)就是一個(gè) SCTP Endpoint,是一個(gè)邏輯概念,作為 SCTP 協(xié)議收/發(fā)的兩端。

SCTP Endpoint 有一個(gè) L4 傳輸層端口號(hào)(Port)和若干個(gè) L3 網(wǎng)絡(luò)層 IP 地址組成(通常是 2 個(gè) IP 地址),但一個(gè) SCTP Endpoint 所含有的若干個(gè) IP 地址必須使用同一個(gè)相同的 Port。

678f8bee-2a10-11ee-a368-dac502259ad0.png

多宿主(Multi-homing)

SCTP Endpoint(具有多個(gè) IP 地址)是 SCTP 多宿主特性的基礎(chǔ),一個(gè) SCTP Endpoint 可能有多個(gè)冗余的 IP 網(wǎng)絡(luò)連接。當(dāng)不同 Hosts 之間的 SCTP Endpoint 建立了一個(gè)偶聯(lián)之后,如果它的某個(gè) IP 網(wǎng)絡(luò)連接發(fā)生故障了,SCTP 就可以通過(guò)切換到另一個(gè) IP 地址來(lái)避免業(yè)務(wù)中斷。是一種類(lèi)似于主備的高可用思想。 如下圖所示,我們可以配置 “雙宿主” 模式。

67cc3738-2a10-11ee-a368-dac502259ad0.png

通路(Path)和首選通路(Primary Path)

多宿主特性提高了網(wǎng)絡(luò)的容錯(cuò)能力,這也引出了另一對(duì)概念:通路(Path)和首選通路(Primary Path)。 如果 Receiver 是多宿主的,那么對(duì)于 Sender 來(lái)說(shuō)每一個(gè) Receiver 的 IP 地址就代表著一條通往對(duì)端的 Path,這樣 Sender 可以選擇任一條 Path 來(lái)發(fā)送數(shù)據(jù)。

SCTP 規(guī)定任何時(shí)間都有一條路徑作為 Primary Path 來(lái)發(fā)送數(shù)據(jù),其他路徑作為 Backup Path。如果 Primary Path 因接口故障或者網(wǎng)絡(luò)擁塞等原因而失效,SCTP 可以自動(dòng)切換到另外一條 Path 來(lái)發(fā)送,避免單點(diǎn)失效,從而提高整個(gè)關(guān)聯(lián)的容錯(cuò)能力。

6813e9ca-2a10-11ee-a368-dac502259ad0.png

偶聯(lián)(Association)

SCTP 使用 “偶聯(lián)” 一詞替代 TCP 的 “連接” 是為了避免內(nèi)涵的混淆:一個(gè)連接只涉及兩個(gè) IP 地址間的通信。 SCTP 協(xié)議規(guī)定在任何時(shí)刻,2 個(gè) SCTP Endpoint 之間能且僅能建立一個(gè)偶聯(lián),它可能因?yàn)?SCTP 的多宿主特性而涉及若干個(gè) IP 地址。

SCTP 支持多種網(wǎng)絡(luò)協(xié)議,當(dāng) SCTP 在 IP 網(wǎng)絡(luò)上運(yùn)行時(shí),Local IP 地址、Local SCTP Port 號(hào)、Remote IP 地址、Remote SCTP Port 號(hào)等 4 個(gè)參數(shù),可以唯一標(biāo)識(shí)一個(gè) SCTP 偶聯(lián)。 SCTP 的偶聯(lián)需要通過(guò) 4 次握手建立。相對(duì)于 TCP 的 3 次握手建立連接,SCTP 的偶聯(lián)能夠抵御 DoS 攻擊,從而提高了安全性。數(shù)據(jù)只有在建立偶聯(lián)之后與關(guān)閉偶聯(lián)之前才可發(fā)送。SCTP 偶聯(lián)通過(guò) 3 次握手關(guān)閉,不支持類(lèi)似 TCP 的半關(guān)閉連接。也就是在任何一方關(guān)閉偶聯(lián)后,對(duì)方即不再發(fā)送數(shù)據(jù)。

683b7c6a-2a10-11ee-a368-dac502259ad0.png

傳輸控制塊(TCB)

TCB(Transmission Control Block,傳輸控制塊)是 SCTP 內(nèi)部的數(shù)據(jù)結(jié)構(gòu),是一個(gè) SCTP Endpoint 為其他 Endpoint 之間已經(jīng)建立的每 個(gè)偶聯(lián)生成的。TCB 包括 Endpoint 的所有狀態(tài)、操作信息,便于維護(hù)和管理相應(yīng)的偶聯(lián)。

多流(Multi-streaming)

一個(gè) SCTP 偶聯(lián)中的 Stream(流)用來(lái)表示需要按順序遞交到高層協(xié)議的用戶(hù)消息序列,在同一個(gè) Stream 中的 Msg 需要按照其順序進(jìn)行遞交。嚴(yán)格地說(shuō),Stream 就是一個(gè) SCTP 偶聯(lián)中,從一個(gè) Endpoint 到另一個(gè) Endpoint 的單向邏輯通道。一個(gè)偶聯(lián)是由多個(gè)單向的 Stream 組成的。

Multi-streaming 是 SCTP 協(xié)議的另一個(gè)關(guān)鍵特性,主要解決了 TCP 隊(duì)頭擁塞的問(wèn)題。在一個(gè) SCTP 偶聯(lián)中,各個(gè) Stream 之間相對(duì)獨(dú)立,使用 Stream ID 進(jìn)行標(biāo)識(shí)。在同一 Stream 內(nèi)發(fā)送的消息有序,而不同 Stream 之間的消息無(wú)序,因此不同 Stream 之間的消息傳輸是相對(duì)獨(dú)立的,每個(gè) Stream 可以單獨(dú)發(fā)送數(shù)據(jù)而不受其他流的影響。

一個(gè) SCTP 偶聯(lián)中可用的 Stream 的數(shù)量是在建立 SCTP 偶聯(lián)時(shí)由雙方端點(diǎn)協(xié)商決定的,但一個(gè) Stream 只能屬于一個(gè) SCTP 偶聯(lián)。SCTP 報(bào)文會(huì)在不同的 Stream 內(nèi)發(fā)送,這也是 “流控制傳輸協(xié)議“ 名稱(chēng)的由來(lái)。

68636d4c-2a10-11ee-a368-dac502259ad0.png ?

每個(gè) Stream 上某個(gè) Msg 的丟失不會(huì)阻塞同一關(guān)聯(lián)其他 Stream 上消息的投遞。這種做法正好與 TCP 相反,就 TCP 而言,在單一字節(jié)流中任何位置的字節(jié)丟失都將在阻塞該連接上其后所有數(shù)據(jù)的遞送,直到該丟失被修復(fù)為止。SCTP 在某一個(gè) Stream 內(nèi)由于數(shù)據(jù)傳輸失敗而引起的阻塞不會(huì)影響其他 Stream 的消息遞交,多流特性可以幫助解決 TCP 中的隊(duì)頭阻塞(HOL)問(wèn)題。

這一點(diǎn)與 HTTP/2 協(xié)議非常類(lèi)型。因?yàn)?TCP 傳輸是按字節(jié)嚴(yán)格有序的,先行傳送的字節(jié)如果丟失或損壞,即使后續(xù)的字節(jié)正確地被接收到也不能向上層遞交,必須在接收端緩沖起來(lái),直到先行字節(jié)由于重傳而全部正確接收到后才可以提交,并且釋放緩沖區(qū)。

傳輸順序號(hào)(TSN)和流順序號(hào)(SSN)

TSN(Transmission Sequence Number):SCTP 使用 TSN 機(jī)制實(shí)現(xiàn)數(shù)據(jù)的確認(rèn)傳輸。一個(gè)偶聯(lián)的發(fā)送端為發(fā)送的每個(gè)數(shù)據(jù)塊順序分配一個(gè)基于初始 TSN 的 32 位順序號(hào),以便接收端進(jìn)行確認(rèn)。TSN 是基于偶聯(lián)進(jìn)行維護(hù)的。

SSN(Stream Sequence Number):SCTP 為一個(gè)偶聯(lián)的發(fā)送端中的一個(gè)流中發(fā)送的每個(gè)數(shù)據(jù)塊順序分配一個(gè) 16 位 SSN,以便保證流 內(nèi)的順序傳遞。在偶聯(lián)建立時(shí),所有流中的 SSN 都是從 0 開(kāi)始。當(dāng) SSN 到達(dá) 65535 后,則接下來(lái)的 SSN 為 0。

TSN 和 SSN 的分配是相互獨(dú)立的。此外,SCTP 還定義了無(wú)序消息。如果消息帶有無(wú)序標(biāo)志,則不論它在哪個(gè)流中(在具體實(shí)現(xiàn)中,數(shù)據(jù)塊中的 Steam ID 不被解析),只要被正確接收,都提交給 ULP,從而實(shí)現(xiàn)和流無(wú)關(guān)的無(wú)序遞交,具有更好的靈活性。

SCTP 的報(bào)文格式

一個(gè) SCTP 報(bào)文包含了一個(gè) Common Header(公共報(bào)頭)和若干個(gè) Chunk(數(shù)據(jù)塊),每 個(gè)數(shù)據(jù)塊中既可以包含控制信息,也可以包含用戶(hù)數(shù)據(jù)。

68821364-2a10-11ee-a368-dac502259ad0.png

INIT 數(shù)據(jù)塊的報(bào)文中必須為 0。

含 SHUTDOWN-COMPLETE 數(shù)據(jù)塊且設(shè)置了 T 比特的報(bào)文中,驗(yàn)證標(biāo)簽必須要從包含 SHUTDOWN-ACK 數(shù)據(jù)塊的報(bào)文中復(fù)制。

含 ABORT 數(shù)據(jù)塊的報(bào)文中,驗(yàn)證標(biāo)簽必須要從觸發(fā)這個(gè) ABORT 發(fā)送的報(bào)文中復(fù)制。

0:凈荷數(shù)據(jù)(DATA)

1:?jiǎn)?dòng)(INIT)

2:?jiǎn)?dòng)證實(shí)(INIT ACK)

3:選擇證實(shí)(SACK)

4:Heartbeat 請(qǐng)求(HEARTBEAT)

5:Heartbeat 證實(shí)(HEARTBEAT ACK)

6:中止(ABORT)

7:關(guān)閉(SHUTDOWN)

8:關(guān)閉證實(shí)(SHUTDOWN ACK)

9:操作差錯(cuò)(ERROR)

10:狀態(tài) Cookie(COOKIE ECHO)

11:Cookie 證實(shí)(COOKIE ACK)

12:為明確擁塞通知響應(yīng)(ECNE)預(yù)留

13:為降低擁塞窗口(CWR)預(yù)留

14:關(guān)閉完成(SHUTDOWN COMPLETE)

15-62:IETF 預(yù)留

63:IETF 定義的數(shù)據(jù)塊擴(kuò)展

64-126:IETF 預(yù)留

127:IETF 定義的數(shù)據(jù)塊擴(kuò)展

128-190:IETF 預(yù)留

191:IETF 定義的數(shù)據(jù)塊擴(kuò)展

192-254:IETF 預(yù)留

255:IETF 定義的數(shù)據(jù)塊擴(kuò)展

Source Port Number(源端口號(hào)):接收方可以使用源端口號(hào)、源 IP 地址、目的端口號(hào)和目的 IP 地址標(biāo)識(shí)該 SCTP 報(bào)文所屬的偶聯(lián)。

Destination Port Number(目的端口號(hào)):接收方可以使用目的端口號(hào)將 SCTP 報(bào)文復(fù)用到正確的端點(diǎn)或應(yīng)用中。

Verification Tag(驗(yàn)證標(biāo)簽):偶聯(lián)建立時(shí),本端端點(diǎn)為這個(gè)偶聯(lián)生成一個(gè)隨機(jī)標(biāo)識(shí)。偶聯(lián)建立過(guò)程中,雙方會(huì)交換這個(gè) Tag,到了數(shù)據(jù)傳遞時(shí),發(fā)送端必須在 Common Header 中帶上對(duì)端的這個(gè) Tag,以備校驗(yàn)。

Checksum:SCTP 通過(guò)對(duì)用戶(hù)數(shù)據(jù)使用 ADLER-32 算法,計(jì)算出一個(gè) 32 位的校驗(yàn)碼,帶在數(shù)據(jù)報(bào)文中,在接收端進(jìn)行同樣的運(yùn)算,通過(guò)檢查校驗(yàn)碼是否相等來(lái)驗(yàn)證用戶(hù)數(shù)據(jù)是否遭到破壞。

Chunk Type:定義塊值(Chunk Value)中消息所屬的類(lèi)型。包括:INIT、INIT ACK、 SACK、ABORT、ERROR、SHUTDOWN、COOKIE ACK 等 13 種數(shù)據(jù)塊類(lèi)型。該參數(shù)的取值范圍為 0~254,255 留作今后的擴(kuò)展。數(shù)據(jù)塊類(lèi)型字段的編碼分配如下:

另外,Chunk type 的高兩位 bit 指示了接收端不認(rèn)識(shí)對(duì)應(yīng)的 Chunk type 的處理原則:

00:停止處理數(shù)據(jù)報(bào)并丟棄,不再處理報(bào)中的其他 Chunk。

01:與 00 相同處理外,還要在 ERROR 或 INIT ACK 中上報(bào),原因?yàn)椴徽J(rèn)識(shí)的參數(shù)類(lèi)型。

10:忽略該 Chunk,繼續(xù)處理數(shù)據(jù)報(bào)中的其他 Chunk。

11:同 10 相同處理外,還要在 ERROR 中上報(bào),原因?yàn)椴徽J(rèn)識(shí)的 Chunk 類(lèi)型。

SCTP 的數(shù)據(jù)傳輸方式

從 SCTP 的報(bào)文格式可以看出 SCTP 是通過(guò)傳輸 Chunk 來(lái)傳輸數(shù)據(jù)的。對(duì)比 TCP 傳輸?shù)臄?shù)據(jù)方式:TCP 接收端確認(rèn)的是收到的字節(jié)數(shù)(TCP 基于數(shù)據(jù)流進(jìn)行數(shù)據(jù)傳輸),SCTP 接收端確認(rèn)的是接收到的數(shù)據(jù)塊(SCTP 基于數(shù)據(jù)塊進(jìn)行數(shù)據(jù)傳輸)。

SCTP 的數(shù)據(jù)塊(Data Chunk)通常會(huì)攜帶應(yīng)用的一個(gè)數(shù)據(jù)報(bào)文,或者說(shuō)是應(yīng)用要發(fā)送的一個(gè)消息(Message)。 在實(shí)際的應(yīng)用中,TCP 發(fā)送方的可以將應(yīng)用程序需要發(fā)送的多個(gè)消息打包到一個(gè) TCP 數(shù)據(jù)報(bào)文中發(fā)出。比如,應(yīng)用程序連續(xù)調(diào)用兩次 send() 向?qū)Χ税l(fā)送兩條消息,TCP 協(xié)議可能把這兩條消息都打包放在同一個(gè) TCP 數(shù)據(jù)報(bào)文中。接收端在收到這個(gè) TCP 報(bào)文時(shí),回給對(duì)端的 ACK 只是表明自己接收到了多少個(gè)字節(jié),TCP 協(xié)議本身并不會(huì)把收到的數(shù)據(jù)重新拆散分成兩條應(yīng)用層消息并通知應(yīng)用程序去接收。

事實(shí)上,應(yīng)用程序可能只需要調(diào)用一次 receive(),就會(huì)把兩條消息都收上來(lái)了,然后應(yīng)用需要根據(jù)應(yīng)用程序自己定義的格式去拆成兩條消息。 與 TCP 不同,SCTP 是將應(yīng)用程序每次調(diào)用 sendmsg() 發(fā)送的數(shù)據(jù)當(dāng)作一個(gè)整體,放到一個(gè) Data Chunk,接收端也是以 Data Chunk 為單位接收數(shù)據(jù),并重新組包,通知應(yīng)用程序接收。

通常,應(yīng)用程序每次調(diào)用 recvmesg() 都會(huì)收到一條完整的消息。在 SCTP 的發(fā)送端,多條短的應(yīng)用層消息可以被 SCTP 協(xié)議打包放在同一個(gè) SCTP 報(bào)文中,此時(shí)在 SCTP 包中可以看到多個(gè) Data Chunk。另一方面,一條太長(zhǎng)(比如,超過(guò)了路徑 MTU)的應(yīng)用層消息也可能被 SCTP 協(xié)議拆分成多個(gè)片段,分別放在多個(gè) Data Chunk 并通過(guò)不同的 SCTP 報(bào)文發(fā)送給對(duì)端。這兩種情況下,SCTP 的接收端都能重新組包,并通知應(yīng)用程序去接收。

數(shù)據(jù)庫(kù)(Data Chunk)格式

68a458e8-2a10-11ee-a368-dac502259ad0.png ?

這里重點(diǎn)關(guān)注 Chunk Type=0 的數(shù)據(jù)塊:

Reserved:預(yù)留,應(yīng)當(dāng)設(shè)置為全 0,在接收方忽略。

U(比特):非順序比特。如果該比特設(shè)置為 1,則指示這是一個(gè)非順序的數(shù)據(jù)塊,不需要給該數(shù)據(jù)塊分配流順序號(hào)碼,所有接收方必須忽略流順序號(hào)碼。在重新組裝完成后(如果需要),非順序的數(shù)據(jù)塊不需要嘗試任何重新排序的過(guò)程,可以由接收方直接遞交到高層;如果一個(gè)非順序的用戶(hù)消息被分段,則消息的每個(gè)分段中的 U 比特必須被設(shè)置為 1。

B(比特):分段開(kāi)始比特。如果該比特被設(shè)置,則表示這是用戶(hù)消息的第一個(gè)分段。

E(比特):分段結(jié)束比特。如果該比特被設(shè)置,則指示這是用戶(hù)消息的最后一個(gè)分段。一個(gè)未分段的用戶(hù)消息應(yīng)當(dāng)把所有的 B 和 E 比特設(shè)置為 1。如果 B 和 E 比特都設(shè)置為 0,則表明這是一個(gè)分段的用戶(hù)消息的一個(gè)中間分段。當(dāng)用戶(hù)消息被分段到多個(gè)數(shù)據(jù)塊中,接收方需要使用 TSN 對(duì)消息進(jìn)行重組,這意味著給分段的用戶(hù)消息的每個(gè)分段都必須要使用連續(xù)的 TSN。

B、E 比特的取值含義如下:

0 表示高層未對(duì)該協(xié)議凈荷規(guī)定應(yīng)用標(biāo)識(shí)符。

M2UA 協(xié)議凈荷使用編碼 2。

M3UA 協(xié)議凈荷使用編碼 3。

SUA 協(xié)議凈荷使用編碼 4。

M2PA 協(xié)議凈荷使用的編碼待定。

B=1、E=0:用戶(hù)消息的第 1 個(gè)分片。

B=0、E=0:用戶(hù)消息的中間分片。

B=0、E=1:用戶(hù)消息的最后一個(gè)分片。

B=1、E=1:未分片的消息。

Length:表示數(shù)據(jù)塊從類(lèi)型字段開(kāi)始到用戶(hù)數(shù)據(jù)字段結(jié)束之間的字節(jié)數(shù),但不包含任何填充字節(jié),如果數(shù)據(jù)塊的用戶(hù)數(shù)據(jù)字段為 0,則長(zhǎng)度字段設(shè)為 16。

TSN:TSN 的值達(dá)到 4294967295 后將回轉(zhuǎn)到 0。

Stream Identifier S:表示用戶(hù)數(shù)據(jù)屬于的流。

Stream Sequence Number n:表示所在流中的用戶(hù)數(shù)據(jù)的順序號(hào)碼。有效值為 0~65535。當(dāng)一個(gè)用戶(hù)消息被 SCTP 分段后,則必須在消息的每個(gè)分段中都帶有相同的流順序號(hào)碼。

Payload Protocol Identifier:表示一個(gè)應(yīng)用(或上層協(xié)議)特定的協(xié)議標(biāo)識(shí)符。這個(gè)值由高層協(xié)議傳遞到 SCTP,并發(fā)送到對(duì)端。這個(gè)標(biāo)識(shí)符不由 SCTP 使用,但卻可以由特定的網(wǎng)絡(luò)實(shí)體或?qū)Φ鹊膽?yīng)用來(lái)識(shí)別在數(shù)據(jù)塊中攜帶的信息類(lèi)型。甚至在每個(gè)分段的數(shù)據(jù)塊中也應(yīng)包含該字段(以確保對(duì)網(wǎng)絡(luò)中間的代理可用)。

User Data:用來(lái)攜帶用戶(hù)數(shù)據(jù)凈荷。該字段必須被填充為 4 字節(jié)的整數(shù),發(fā)送方填充的字節(jié)數(shù)應(yīng)不超過(guò) 3 個(gè)字節(jié),接收方忽略所有的填充字節(jié)。

68cdc728-2a10-11ee-a368-dac502259ad0.png ?

在實(shí)際開(kāi)發(fā)時(shí),需要注意在同一 SCTP 報(bào)文中對(duì)多個(gè) DATA CHUNK 的處理。例如:如果為每個(gè)長(zhǎng)度很短的用戶(hù)數(shù)據(jù)都帶上一個(gè)很大 SCTP Header,其傳遞效率比如會(huì)很低。因此,SCTP 協(xié)議至此將幾個(gè)用戶(hù)數(shù)據(jù)(容量足夠的前提下)捆綁到一個(gè) SCTP 報(bào)文里面?zhèn)鬏?,以提高帶寬的利用率。這就是所謂的用戶(hù)消息捆綁。

SCTP 用戶(hù)能夠可選地使用捆綁功能,決定是否將多個(gè)用戶(hù)數(shù)據(jù)報(bào)捆綁在一個(gè) SCTP 分組中。但為提高效率,在擁塞/重發(fā)時(shí),捆綁功能可能仍被執(zhí)行,即使用戶(hù)已經(jīng)禁止捆綁了。這是開(kāi)發(fā)時(shí)需要注意的地方,稍不留神就可能漏掉了用戶(hù)數(shù)據(jù)。

SCTP 基本信令流程

偶聯(lián)的建立和發(fā)送流程

6913c2c8-2a10-11ee-a368-dac502259ad0.png ?

上圖為 SCTP EndpointA 啟動(dòng)建立偶聯(lián),并向 EndpointB 發(fā)送一個(gè)用戶(hù)消息,隨后 EndpointB 向 EndpointA 發(fā)送 兩個(gè)用戶(hù)消息的信令流程(假定這些消息沒(méi)有捆綁和分段)。

啟動(dòng)標(biāo)簽(nitiate Tag):對(duì)端驗(yàn)證標(biāo)簽,如設(shè)為 Tag_A。Tag_A 是從 1 到 4294967295 中的一個(gè)隨機(jī)數(shù)。

輸出流數(shù)量(OS):本端點(diǎn)期望的最大出局流的數(shù)量。

輸入流數(shù)量(MIS):本端點(diǎn)允許入局流的最大數(shù)量。

目的地 IP 地址:設(shè)置成 INIT 數(shù)據(jù)塊的起源 IP 地址。

啟動(dòng)標(biāo)簽(Initiate Tag):設(shè)置成 Tag_B。

狀態(tài) COOKIE(STATE COOKIE):根據(jù)偶聯(lián)的基本信息生成一個(gè) TCB,不過(guò)這個(gè) TCB 是一個(gè)臨時(shí) TCB。這個(gè) TCB 生成以后,將其中的必要信息(包含一個(gè) COOKIE 生成的時(shí)間戳、COOKIE 的生命期)和一個(gè)本端的密鑰通過(guò) RFC2401 描述的算法計(jì)算成一個(gè)32 位 的摘要 MAC(這種計(jì)算是不可逆的)。必要信息和 MAC 組合成 STATE COOKIE 參數(shù)。

本端點(diǎn)傳送地址。

最大入局流的數(shù)量。

最大出局流的數(shù)量。

TSN:DATA 數(shù)據(jù)塊的初始 TSN。流標(biāo)識(shí)符(Stream Identifier):用戶(hù)數(shù)據(jù)屬于的流,假設(shè)流標(biāo)識(shí)符為 0。流順序碼(Stream Sequence Number):所在流中的用戶(hù)數(shù)據(jù)的順序號(hào)碼。該字段從 0 到 65535。用戶(hù)數(shù)據(jù)(User Data):攜帶用戶(hù)數(shù)據(jù)凈荷。

累積證實(shí) TSN 標(biāo)簽(Cumulative TSN Ack):EndpointA 的初始 TSN。間隔塊(Gap Ack Block):此值為 0。EndpointA 收到 SACK 數(shù)據(jù)塊后,停止 T3-RTX 定時(shí)器

TSN:EndpointB 發(fā)出 DATA 數(shù)據(jù)塊的初始 TSN。

流標(biāo)識(shí)符(Stream Identifier):用戶(hù)數(shù)據(jù)屬于的流,假設(shè)流標(biāo)識(shí)符為 0。

流順序碼(Stream Sequence Number):所在流中的用戶(hù)數(shù)據(jù)的順序號(hào)碼。假設(shè)流 順序碼為 0。

用戶(hù)數(shù)據(jù)(User Data):攜帶用戶(hù)數(shù)據(jù)凈荷。

TSN:EndpointB 發(fā)出 DATA 數(shù)據(jù)塊的初始 TSN+1。

流標(biāo)識(shí)符(Stream Identifier):用戶(hù)數(shù)據(jù)屬于的流,假設(shè)流標(biāo)識(shí)符為 0。

流順序碼(Stream Sequence Number):所在流中的用戶(hù)數(shù)據(jù)的順序號(hào)碼。此時(shí)流順序碼為 1。

用戶(hù)數(shù)據(jù)(User Data):攜帶用戶(hù)數(shù)據(jù)凈荷。

累積證實(shí) TSN 標(biāo)簽(Cumulative TSN Ack):EndpointB 的初始 TSN。

間隔塊(Gap Ack Block)此值為 0。

EndpointA 創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu) TCB(傳輸控制塊)來(lái)描述即將發(fā)起的這個(gè)偶聯(lián)(包含偶聯(lián)的基本信息),然后向 EndpointB 發(fā)送 INIT 數(shù)據(jù)塊。INIT 數(shù)據(jù)塊中主要包括如下參數(shù):

EndpointB 收到 INIT 消息后,立即用 INIT ACK 數(shù)據(jù)塊響應(yīng)。INIT ACK 數(shù)據(jù)塊中必須帶有如下參數(shù):

EndpointA 收到 INIT ACK 后,首先停止 INIT,離開(kāi) COOKIE-WAIT 狀態(tài), 然后發(fā)送 COOKIE ECHO 數(shù)據(jù)塊,將收到 INIT ACK 數(shù)據(jù)塊中的 STATE COOKIE 參數(shù)原封帶回。最后 EndpointA 啟動(dòng) COOKIE 定時(shí)器并進(jìn)入 COOKIE-ECHOED 狀態(tài)。

EndpointB 收到 COOKIE ECHO 數(shù)據(jù)塊后,進(jìn)行 COOKIE 驗(yàn)證。將 STATE COOKIE 中的 TCB 部分和本端密鑰根據(jù) RFC2401 的 MAC 算法進(jìn)行計(jì)算,得出的 MAC 和 STATE COOKIE 中攜帶的 MAC 進(jìn)行比較。如果不同則丟棄這個(gè)消息;如果相同,則取出 TCB 部分的時(shí)間 戳,和當(dāng)前時(shí)間比較,看時(shí)間是否已經(jīng)超過(guò) 了COOKIE 的生命期。如果是,同樣丟棄;否則根據(jù) TCB 中的信息建立一個(gè)和 EndpointA 的偶聯(lián)。EndpointB 將狀態(tài)遷入 ESTABLISHED,并發(fā)出 COOKIE ACK 數(shù)據(jù)塊。EndpointB 向 SCTP 用戶(hù)發(fā)送 SCOMMUNCIATION UP 通知。

EndpointA 向 EndpointB 發(fā)送一個(gè) DATA 數(shù)據(jù)塊,啟動(dòng) T3-RTS 定時(shí)器。DATA 數(shù)據(jù)塊中必須帶 有如下參數(shù):

EndpointB 收到 DATA 數(shù)據(jù)塊后,返回 SACK 數(shù)據(jù)塊。SACK 數(shù)據(jù)塊中必須帶有如下參數(shù):

EndpointB 向 EndpointA 發(fā)送第一個(gè) DATA 數(shù)據(jù)塊。DATA 數(shù)據(jù)塊中必須帶有如下參數(shù):

EndpointB 向 EndpointA 發(fā)送第二個(gè) DATA 數(shù)據(jù)塊。DATA 數(shù)據(jù)塊中必須帶有如下參數(shù):

EndpointA 收到 DATA 數(shù)據(jù)塊后,返回 SACK 數(shù)據(jù)塊。SACK 數(shù)據(jù)塊中必須帶有如下參數(shù):

偶聯(lián)關(guān)閉流程

當(dāng)一個(gè) Endpoint 退出服務(wù)時(shí),需要停止它的偶聯(lián)。偶聯(lián)的停止使用兩種流程:

偶聯(lián)的中止流程(非正常關(guān)閉):可以在任何未完成期間進(jìn)行,偶聯(lián)的兩端都舍棄數(shù)據(jù)并且不提交到對(duì)端。此種方法不考慮數(shù)據(jù)的安全。偶聯(lián)的中止步驟比較簡(jiǎn)單:發(fā)起端點(diǎn)向?qū)Χ硕它c(diǎn)發(fā)送 ABORT 數(shù)據(jù)塊,發(fā)送的 SCTP 分組中必須填上對(duì)端端點(diǎn)的驗(yàn)證標(biāo)簽,而且不在 ABORT 數(shù)據(jù)塊中捆綁任何 DATA 數(shù)據(jù);接收端點(diǎn)收到 ABORT 數(shù)據(jù)塊后,進(jìn)行驗(yàn)證標(biāo)簽的檢查。如果驗(yàn)證標(biāo)簽與本端驗(yàn)證標(biāo)簽相同,接收端點(diǎn)從記錄上清除該偶聯(lián),并向 SCTP 用戶(hù)報(bào)告偶聯(lián)的停止。

偶聯(lián)的正常關(guān)閉流程:任何一個(gè)端點(diǎn)執(zhí)行正常關(guān)閉程序時(shí),偶聯(lián)的兩端將停止接受從其 SCTP 用戶(hù)層發(fā)來(lái)的新數(shù)據(jù),并且在發(fā)送或接收到 SHUTDOWN 數(shù)據(jù)塊時(shí),把分組中的數(shù)據(jù)遞交給 SCTP 用戶(hù)。偶聯(lián)的關(guān)閉可以保證所有兩端的未發(fā)送、發(fā)送未證實(shí)數(shù)據(jù)得到發(fā)送和證實(shí)后再終止偶聯(lián)。

6971bd60-2a10-11ee-a368-dac502259ad0.png ?

偶聯(lián)的正常關(guān)閉步驟如下:

偶聯(lián)關(guān)閉發(fā)起 EndpointA 的 SCTP 用戶(hù)層向 SCTP 發(fā)送請(qǐng)求 SHUTDOWN 原因。SCTP 偶聯(lián)從 ESTABLISHED 狀態(tài)遷入 SHUTDOWN-PENDING 狀態(tài)。在這個(gè)狀態(tài),SCTP 不接受 SCTP 用戶(hù)在這個(gè)偶聯(lián)上的任何數(shù)據(jù)發(fā)送請(qǐng)求。同時(shí)等待 EndpointA 所有發(fā)送未證實(shí)的數(shù)據(jù)得到 EndpointB 的證實(shí)。當(dāng)所有 EndpointA 發(fā)送未證實(shí)數(shù)據(jù)得到證實(shí),則向 EndpointB 發(fā)送 SHUTDOWN 數(shù)據(jù)塊。EndpointA 啟動(dòng) T2-shutdown 定時(shí)器進(jìn)入 SHUTDOWN-SENT 狀態(tài)。啟動(dòng) T2-shutdown 定時(shí)器的目的是等待 EndpointB 發(fā)回的 SHUTDOWN-ACK 數(shù)據(jù)塊,如果定時(shí)器超時(shí),則 EndpointA 必須重新發(fā)送 SHUTDOWN 數(shù)據(jù)塊。

EndpointB 收到 SHUTDOWN 消息后,進(jìn)入 SHOUTDOWN-RECEIVED 狀態(tài),不再接收從 SCTP 用戶(hù)發(fā)來(lái)的的新數(shù)據(jù),并且檢查數(shù)據(jù)塊的累積 TSN ACK 字段,驗(yàn)證所有未完成的 DATA 數(shù)據(jù)塊已經(jīng)被 SHUTDOWN 的發(fā)送方接收。當(dāng) EndpointB 所有未發(fā)送數(shù)據(jù)和發(fā)送未證實(shí) 數(shù)據(jù)得到發(fā)送和證實(shí)后, 發(fā)送 SHUTDOWN ACK 數(shù)據(jù)塊并啟動(dòng)本端 T2-SHUTDOWN 定時(shí)器,并且進(jìn)入 SHUTDOWN-ACK-SENT 狀態(tài)。如果定時(shí)器超時(shí)了,EndpointB 則重新發(fā)送 SHUTDOWN ACK 數(shù)據(jù)塊。

EndpointA 收到 SHUTDOWN ACK 消息后,停止 T2-shutdown 定時(shí)器,并且向 EndpointB 發(fā)送 SHUTDOWN COMPLETE 數(shù)據(jù)塊,并清除偶聯(lián)的所有記錄。EndpointB 收到 SHUTDOWN COMPLETE 數(shù)據(jù)塊后, 驗(yàn)證是否處于 SHUTDOWN-ACK-SENT 狀態(tài)。如果不是處于該狀態(tài),則丟棄該數(shù)據(jù)塊;如果端點(diǎn)處于 SHUTDOWN-ACK-SENT 狀態(tài),EndpointB 則停止 T2- shutdown 定時(shí)器并清除偶聯(lián)的所有記錄,進(jìn)入 CLOSED 狀態(tài)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1158

    瀏覽量

    53169
  • ACK
    ACK
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    11111
  • SCTP協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6660
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4184
  • TLS
    TLS
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    4209

原文標(biāo)題:網(wǎng)絡(luò)協(xié)議: SCTP 流控制傳輸協(xié)議

文章出處:【微信號(hào):SDNLAB,微信公眾號(hào):SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TCP和UDP協(xié)議簡(jiǎn)

    。二、TCP編程模型傳輸控制協(xié)議TCP (Transmission Control Protocol)是一種面向連接、可靠的協(xié)議。建立一個(gè)TCP連接,需要服務(wù)器和客戶(hù)機(jī)進(jìn)行3次握手。而
    發(fā)表于 12-15 08:13

    APB接口協(xié)議的讀寫(xiě)傳輸及工作流程簡(jiǎn)

    查閱APB協(xié)議官方文檔該APB slave模塊只是對(duì)一些控制和狀態(tài)寄存器進(jìn)行讀寫(xiě),無(wú)等待傳輸同時(shí)不生成傳輸錯(cuò)誤信號(hào)。
    發(fā)表于 04-07 10:18

    Linux內(nèi)核網(wǎng)絡(luò)之網(wǎng)絡(luò)層發(fā)送消息之IP分片簡(jiǎn)

    1、Linux內(nèi)核網(wǎng)絡(luò)之網(wǎng)絡(luò)層發(fā)送消息之IP分片簡(jiǎn)本文分析下ip的分片。行 IP 分片。IP分片通常發(fā)生在網(wǎng)絡(luò)環(huán)境中,比如1個(gè)B環(huán)境中的MTU為500B,若的數(shù)據(jù)長(zhǎng)度超過(guò)
    發(fā)表于 07-20 15:34

    基于SCTP 協(xié)議的偶聯(lián)管理系統(tǒng)設(shè)計(jì)

    在通信網(wǎng)絡(luò)一切基于IP 的驅(qū)動(dòng)下,SCTP傳輸協(xié)議)在通信控制領(lǐng)域的應(yīng)用變得越來(lái)越廣泛,保證SCT
    發(fā)表于 08-31 10:24 ?20次下載

    SigTran在3G組網(wǎng)中的應(yīng)用

    【摘要】信令傳輸(SigTran)協(xié)議簇是由IETF的SigTran工作組制定的一系列協(xié)議,包括控制
    發(fā)表于 10-22 10:40 ?15次下載

    基于ATM理念的UTRAN傳輸架構(gòu)簡(jiǎn)

    基于ATM理念的UTRAN傳輸架構(gòu)簡(jiǎn):UTRAN(UMTS無(wú)線接入網(wǎng))系統(tǒng)傳輸網(wǎng)承載其內(nèi)部業(yè)務(wù)傳送及至CN(核心網(wǎng))側(cè)的業(yè)務(wù)匯聚功能,考慮3G網(wǎng)絡(luò)內(nèi),話音、媒體
    發(fā)表于 10-22 10:49 ?15次下載

    基于SCTP協(xié)議的偶聯(lián)管理系統(tǒng)設(shè)計(jì)

    在通信網(wǎng)絡(luò)一切基于IP 的驅(qū)動(dòng)下,SCTP傳輸協(xié)議)在通信控制領(lǐng)域的應(yīng)用變得越來(lái)越廣泛,保證SCT
    發(fā)表于 12-30 14:28 ?5次下載

    控制傳輸協(xié)議(SCTP),SCTP的結(jié)構(gòu)和內(nèi)容是什么?

    控制傳輸協(xié)議(SCTP),SCTP的結(jié)構(gòu)和內(nèi)容是什么? 隨著IP網(wǎng)向多業(yè)務(wù)網(wǎng)的發(fā)展,尤其是近
    發(fā)表于 03-20 15:08 ?7131次閱讀

    簡(jiǎn)BGA封裝技術(shù)與質(zhì)量控制

    簡(jiǎn)BGA封裝技術(shù)與質(zhì)量控制  ?。樱停裕⊿urface Mount Technology)表面安裝技術(shù)順應(yīng)了電子產(chǎn)品小型化、輕型化的潮流趨勢(shì),為實(shí)現(xiàn)電子
    發(fā)表于 03-30 16:49 ?1431次閱讀

    傳輸控制協(xié)議(TCP)/網(wǎng)絡(luò)層協(xié)議是什么意思

    傳輸控制協(xié)議(TCP)/網(wǎng)絡(luò)層協(xié)議是什么意思 傳輸控制協(xié)議
    發(fā)表于 04-06 16:44 ?2739次閱讀

    SCTP在軍事通信網(wǎng)絡(luò)中的應(yīng)用研究

    SCTP是INTERNET標(biāo)準(zhǔn)化組織提出的一個(gè)新的傳輸協(xié)議,是新一代構(gòu)架于IP層之上的提供可靠傳輸的通用IP傳輸
    發(fā)表于 03-15 22:26 ?15次下載

    鼠標(biāo)HID例程(中)簡(jiǎn)

    鼠標(biāo) HID 例程簡(jiǎn) 緊接《鼠標(biāo) HID 例程簡(jiǎn)(上)》一文,繼續(xù)向大家介紹鼠 標(biāo) HID 例程的未完的內(nèi)容。
    發(fā)表于 07-26 15:18 ?0次下載

    5G AAU 功放控制和監(jiān)測(cè)模塊簡(jiǎn)

    5G AAU 功放控制和監(jiān)測(cè)模塊簡(jiǎn)
    發(fā)表于 10-28 12:00 ?2次下載
    5G AAU 功放<b class='flag-5'>控制</b>和監(jiān)測(cè)模塊<b class='flag-5'>簡(jiǎn)</b><b class='flag-5'>析</b>

    AFE8092幀同步特性簡(jiǎn)

    AFE8092幀同步特性簡(jiǎn)
    的頭像 發(fā)表于 08-24 13:37 ?558次閱讀
    AFE8092幀同步特性<b class='flag-5'>簡(jiǎn)</b><b class='flag-5'>析</b>

    讓“可靠”變得“更快更安全”的數(shù)據(jù)傳輸協(xié)議SCTP

    SCTP(Stream Control Transmission Protocol,傳輸協(xié)議)的出現(xiàn),并不是萬(wàn)丈高樓平地起,而是站在TCP這個(gè)巨人肩膀上,讓數(shù)據(jù)
    的頭像 發(fā)表于 12-28 17:25 ?1153次閱讀
    讓“可靠”變得“更快更安全”的數(shù)據(jù)<b class='flag-5'>傳輸</b><b class='flag-5'>協(xié)議</b>:<b class='flag-5'>SCTP</b>