SCTP程式設計

2021-05-27 01:11:57 字數 1581 閱讀 8581

原文**:

sctp協議在unp第2版中還未提及,是在第3版中新增加的,在第9、10、23章介紹sctp。

sctp就好象是tcp和udp的綜合體,既可以單播也能多播,而且連線建立過程使用4次握手而不是tcp的3次握手,在相當程度上防止了類似tcp中的syn flood的攻擊方法。

sctp是面向訊息而不是面向連線的,而且是用關聯(associate)代替連線的概念,關聯即可以是一對一的,也可以是一對多的。 sctp提供可靠性,排序和流量控制等功能,但不是象tcp那樣嚴格防止資料丟失情況,而是允許丟失訊息而不阻塞,這個特性使得sctp更適合於多**資料的傳輸,本來sctp最初就是為ip**設計的。目前linux 2.6核心中已經增加了對sctp協議的支援。

sctp的套介面兩類:一對一(類似tcp)和一對多(類似udp)。

一對一方式的sctp的程式設計基本和tcp類似,只是開啟的socket是sctp協議的流介面:

socket(af_inet, sock_sream, ipproto_sctp)

然後客戶端可以用connect()連線伺服器, write(), read()讀寫,close()關閉套介面

伺服器端用 bind()繫結埠,listen()監聽,accept()接受連線,write()/read()讀寫,close()關閉,這和普通tcp程式是相同的。由於sctp是面向訊息的,因此這種情況下仍和udp一樣,一方發幾個訊息,對方就會收幾個訊息,而不是象tcp那樣可能會進行資料合併。

注意sctp不提供tcp那樣的半關閉,每一方呼叫shutdown()後都會關閉sctp關聯而不是象tcp那樣半連線。

一對多方式的sctp程式設計和udp類似,開啟的是sctp的有序分組介面:

socket(af_inet, sock_seqpacket, ipproto_sctp)

用的socket(), bin(), listen(), close()等函式和原來一樣,但傳送接收資料是用sctp_sendto(),sctp_sendmsg()和sctp_recvmsg()這些sctp專用函式。

sctp可用sctp_bindx()繫結到一組位址而不是單個或全部位址;用sctp_connectx()連線多個位址。

sctp使用通知(notification)來跟蹤關聯的狀態,通知也是通過recvmsg()或sctp_recvmsg()函式得到的,和網路資料混雜,函式返回的標誌msg_flags中有標誌表示是資料還是通知,這是和tcp、udp程式設計不同的。

sctp支援自動關閉功能,相當於tcp中的超時斷開,當關聯在任何方向都沒有資料超過一定時間後自動關閉,這通過setsockopt()函式設定sctp_autoclose屬性來實現。

sctp在傳輸大資料時可能因為資源不夠而採取部分抵送方式傳送資料,接收方相應要檢查相應接收標誌以保證能正確完整接收。

sctp可以無序傳送資料, 在sctp_sendmsg()函式中設定msg_unordered標誌即可,這時sctp資料中不帶序列號。

sctp和tcp一樣支援心跳保活機制,也有很多定時器檢測關聯是否失效。

sctp最大的特點就是同時處理多個位址的通訊的能力,tcp就只能是一對一,udp雖然可以實現多播和廣播,但那也是對某些位址賦予了多播或廣播的屬性,本質還是處理乙個位址。

UNIX網路程式設計 TCP UDP和SCTP介紹

一 傳輸層協議工作機制 傳輸層的主要協議為tcp udp和sctp stream control transmission protocol,流控制傳輸協議 絕大多數客戶 伺服器網路應用使用tcp或udp。sctp是乙個較新的協議。udp是乙個簡單的 不可靠的資料報協議。tcp是乙個複雜 可靠的位元...

基本SCTP套接字程式設計常用函式

include 若成功返回0,出錯返回 1 int sctp bindx int sockfd,const struct sockaddr addrs,int addrcnt,int flags include 若成功返回0,出錯返回 1 int sctp connectx int sockfd,c...

SCTP防止SYN Flooding攻擊的原理

1.tcp中的 syn flooding 攻擊原理 要明白這種攻擊的基本原理,還是要從 tcp連線建立的過程開始說起。由於 tcp基於連線的,為了在服務端和客戶端之間傳送 tcp資料,必須先建立乙個虛擬電路,也就是 tcp連線,建立 tcp連線的過程也就是我們熟悉的 三次握手 過程 首先,請求端 客...