• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            使用 SCTP 優(yōu)化網(wǎng)絡(luò)

            轉(zhuǎn)載自:http://www.ibm.com/developerworks/cn/linux/l-sctp/

            SCTP 是在 IP 網(wǎng)絡(luò)上使用的一種可靠的通用傳輸層協(xié)議。盡管 SCTP 協(xié)議最初是為發(fā)送電話信號(hào)而設(shè)計(jì)的(RFC 2960),但帶來了一個(gè)意外的收獲:它通過借鑒 UDP 的優(yōu)點(diǎn)解決了 TCP 的某些局限。SCTP 提供的特性使套接字初始化的可用性、可靠性和安全性都得以提高。(圖 1 給出了 IP 堆棧的層次化架構(gòu)。)


            圖 1. IP 棧的層次化架構(gòu)
            IP 棧的層次化架構(gòu) 

            本文簡要介紹了 Linux 2.6 內(nèi)核中 SCTP 的概念,重點(diǎn)介紹了一些高級(jí)特性(例如多宿主和多流),并且給出了服務(wù)器和客戶機(jī)的部分代碼片斷(并給出了一個(gè)可以獲得更多代碼的 URL),從而展示了這種協(xié)議提供多流的能力。

            下面讓我們開始介紹 IP 堆棧的內(nèi)容。

            IP 堆棧

            Internet 協(xié)議套件被劃分成幾層;每層都提供特定功能,如圖 1 所示。

            自下而上:

            • 鏈路層(link layer) 提供了通信介質(zhì)的物理接口(例如以太網(wǎng)設(shè)備)。
            • 網(wǎng)絡(luò)層(network layer) 負(fù)責(zé)管理網(wǎng)絡(luò)中的報(bào)文移動(dòng),具體來說就是確保報(bào)文都到達(dá)自己的目標(biāo)(也稱為路由)。
            • 傳輸層(transport layer) 為應(yīng)用層控制了報(bào)文在兩臺(tái)主機(jī)之間的流動(dòng)。它還代表通信的應(yīng)用程序端點(diǎn),稱為 端口(port)。
            • 最后,應(yīng)用層(application layer) 對(duì)通過套接字傳遞數(shù)據(jù)具有深刻的意義。這些數(shù)據(jù)可能包括通過簡單郵件傳輸協(xié)議(Simple Mail Transport Protocol,SMTP)發(fā)送的 e-mail 消息,或通過超文本傳輸協(xié)議(Hypertext Transport Protocol,HTTP)呈現(xiàn)的 Web 頁面。

            所有應(yīng)用層協(xié)議都使用套接字層作為與傳輸層協(xié)議之間的接口。Sockets API 是由 UC Berkeley 在 BSD UNIX® 操作系統(tǒng)上開發(fā)的。

            在深入鉆研 SCTP 之前,讓我們首先簡單回顧一下傳統(tǒng)的傳輸層協(xié)議。

            傳輸層協(xié)議

            兩種最流行的傳輸層協(xié)議是傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報(bào)協(xié)議(UDP):

            • TCP 是一種可靠的協(xié)議,它可以確保有序地發(fā)送數(shù)據(jù),并管理網(wǎng)絡(luò)中的擁塞問題。
            • UDP 是一種面向消息的協(xié)議,它不能確保有序地發(fā)送數(shù)據(jù),也無法管理網(wǎng)絡(luò)擁塞的問題。

            然而,UDP 是一種快速協(xié)議,可以保護(hù)自己傳輸?shù)南⒌倪吔纭?/p>

            本文引出了另外一個(gè)選擇:SCTP。它提供了像 TCP 一樣可靠、有序地發(fā)送數(shù)據(jù)的功能,但卻以像 UDP 一樣面向消息的方式來進(jìn)行操作,這可以保護(hù)消息邊界。SCTP 還提供了幾個(gè)高級(jí)特性:

            • 多宿主(Multi-homing)
            • 多流(Multi-streaming)
            • 初始化保護(hù)(Initiation protection)
            • 消息分幀(Message framing)
            • 可配置的無序發(fā)送(Configurable unordered delivery)
            • 平滑關(guān)閉(Graceful shutdown)

            SCTP 的關(guān)鍵特性

            SCTP 相對(duì)于傳統(tǒng)的傳輸層協(xié)議來說,兩個(gè)重要的增強(qiáng)是終端主機(jī)的多宿主和多流功能。

            多宿主

            多宿主 為應(yīng)用程序提供了比 TCP 更高的可用性。多宿主主機(jī)就是一臺(tái)具有多個(gè)網(wǎng)絡(luò)接口的主機(jī),因此可以通過多個(gè) IP 地址來訪問這臺(tái)主機(jī)。在 TCP 中,連接(connection) 是指兩個(gè)端點(diǎn)之間的一個(gè)通道(在這種情況下,就是兩臺(tái)主機(jī)的網(wǎng)絡(luò)接口之間的一個(gè)套接字)。SCTP 引入了 聯(lián)合(association) 的概念,它也是存在于兩臺(tái)主機(jī)之間,但可以使用每臺(tái)主機(jī)上的多個(gè)接口進(jìn)行協(xié)作。

            圖 2 闡述了 TCP 連接與 SCTP 聯(lián)合之間的區(qū)別。


            圖 2. TCP 連接與 SCTP 聯(lián)合
            TCP 連接與 SCTP 聯(lián)合 

            該圖的上面部分是 TCP 連接,每個(gè)主機(jī)都只包含一個(gè)網(wǎng)絡(luò)接口;連接是在每個(gè)客戶機(jī)和服務(wù)器之間的單個(gè)接口之間建立的。在建立連接時(shí),就被綁定到了每個(gè)接口上。

            在該圖的下面部分中,您可以看到這樣一個(gè)架構(gòu):每臺(tái)主機(jī)上都包含兩個(gè)網(wǎng)絡(luò)接口。通過獨(dú)立網(wǎng)絡(luò)提供了兩條路徑,一條是從接口 C0 到 S0,另外一條是從接口 C1 到 S1。在 SCTP 中,這兩條路徑可以合并到一個(gè)聯(lián)合中。

            SCTP 負(fù)責(zé)使用內(nèi)嵌的 heartbeat 機(jī)制來監(jiān)視聯(lián)合的路徑;在檢測(cè)到一條路徑失效時(shí),協(xié)議就會(huì)通過另外一條路徑來發(fā)送通信數(shù)據(jù)。應(yīng)用程序甚至都不必知道發(fā)生了故障恢復(fù)。

            故障轉(zhuǎn)移也可以用于維護(hù)網(wǎng)絡(luò)應(yīng)用程序的連通性。例如,讓我們來考慮一臺(tái)包含一個(gè)無線 802.11 接口和一個(gè)以太網(wǎng)接口的筆記本的例子。當(dāng)筆記本放到固定的位置上時(shí),我們傾向于使用高速的以太網(wǎng)接口(在 SCTP 中稱為 主地址(primary address));但是在這個(gè)連接丟失時(shí)(例如離開了固定位置),連接可遷移到無線接口上。在返回固定位置時(shí),以太網(wǎng)連接會(huì)被重新檢測(cè)到,通信就可以在這個(gè)接口上恢復(fù)。這是一種能提供更高的可用性和可靠性的強(qiáng)大機(jī)制。

            多流

            從某種意義上來講,SCTP 連接與 TCP 連接類似,不同之處只是 SCTP 能夠在一個(gè)聯(lián)合中支持多流機(jī)制。一個(gè)聯(lián)合中的所有流都是獨(dú)立的,但均與該聯(lián)合相關(guān)(請(qǐng)參見圖 3)。


            圖 3. SCTP 聯(lián)合與流之間的關(guān)系
            SCTP 聯(lián)合與流之間的關(guān)系 

            每個(gè)流都給定了一個(gè)流編號(hào),它被編碼到 SCTP 報(bào)文中,通過聯(lián)合在網(wǎng)絡(luò)上傳送。多流非常重要,因?yàn)樽枞牧鳎ɡ绲却貍鞯牧鲿?huì)導(dǎo)致報(bào)文的丟失)不會(huì)影響同一聯(lián)合中的其他流。這個(gè)問題統(tǒng)稱為 head-of-line blocking(對(duì)頭阻塞)。TCP 很容易出現(xiàn)這類阻塞問題。

            多流如何在傳輸數(shù)據(jù)時(shí)提供更好的響應(yīng)性呢?例如,HTTP 協(xié)議會(huì)在相同套接字上共享控制和數(shù)據(jù)。Web 客戶機(jī)從服務(wù)器上請(qǐng)求一個(gè)文件,服務(wù)器通過相同的連接將這個(gè)文件發(fā)回給客戶機(jī)。多流的 HTTP 服務(wù)器可以提供更好的交互能力,因?yàn)樵诼?lián)合中各單獨(dú)的流上可以處理多個(gè)請(qǐng)求。這種功能可以并行化響應(yīng),盡管速度不一定會(huì)更快,但可以同時(shí)加載 HTML 和圖像映像,從而表現(xiàn)出更好的響應(yīng)性。

            多流處理是 SCTP 的一個(gè)重要特性,尤其是在協(xié)議的設(shè)計(jì)中考慮一些控制和數(shù)據(jù)的問題時(shí)更是如此。在 TCP 中,控制和數(shù)據(jù)通常都是通過相同的連接進(jìn)行共享的,這可能會(huì)產(chǎn)生問題,因?yàn)榭刂茍?bào)文可能會(huì)在數(shù)據(jù)報(bào)之后延時(shí)。如果控制和數(shù)據(jù)被劃分成單獨(dú)的流,控制數(shù)據(jù)就可以以一種更及時(shí)的方式進(jìn)行處理,從而可以更好地利用可用資源。

            初始化保護(hù)

            TCP 和 SCTP 中對(duì)新連接的初始化是通過報(bào)文握手來完成的。在 TCP 中,這種機(jī)制稱為 三次握手(three-way handshake)。客戶機(jī)向服務(wù)器首先發(fā)送一個(gè) SYN 報(bào)文(Synchronize 的簡寫),服務(wù)器使用一個(gè) SYN-ACK 報(bào)文進(jìn)行響應(yīng)(Synchronize-Acknowledge)。最后,客戶機(jī)使用一個(gè) ACK 報(bào)文確認(rèn)已接收到報(bào)文(請(qǐng)參見圖 4)。


            圖 4. TCP 和 STCP 握手使用的報(bào)文交換
            TCP 和 STCP 握手使用的報(bào)文交換 

            當(dāng)惡意客戶機(jī)使用虛假的源地址來偽造一個(gè) IP 報(bào)文時(shí),TCP 就會(huì)出現(xiàn)問題了,這會(huì)大量 TCP SYN 報(bào)文攻擊服務(wù)器。服務(wù)器在接收SYN 報(bào)文之前,要為連接分配資源,但是在大量產(chǎn)生 SYN 報(bào)文的情況下,最終會(huì)耗盡自己的資源,從而無法處理新的請(qǐng)求。這種情況就稱為 服務(wù)拒絕(Denial of Service)(DoS)攻擊。

            SCTP 可以通過一種 4 次握手的機(jī)制并引入了 cookie 的概念來有效地防止這種攻擊的產(chǎn)生。在 SCTP 中,客戶機(jī)使用一個(gè) INIT 報(bào)文發(fā)起一個(gè)連接。服務(wù)器使用一個(gè) INIT-ACK 報(bào)文進(jìn)行響應(yīng),其中就包括了 cookie(標(biāo)識(shí)這個(gè)連接的惟一上下文)。客戶機(jī)然后就使用一個(gè) COOKIE-ECHO 報(bào)文進(jìn)行響應(yīng),其中包含了服務(wù)器所發(fā)送的 cookie。現(xiàn)在,服務(wù)器要為這個(gè)連接分配資源,并通過向客戶機(jī)發(fā)送一個(gè) COOKIE-ACK 報(bào)文對(duì)其進(jìn)行響應(yīng)。

            要解決使用這種 4 次握手機(jī)制解決延時(shí)數(shù)據(jù)移動(dòng)的問題,SCTP 允許把數(shù)據(jù)包含到 COOKIE-ECHO  COOKIE-ACK 報(bào)文中。

            消息分幀

            使用消息分幀機(jī)制,就可以保護(hù)消息只在一個(gè)邊界內(nèi)通過 socket 進(jìn)行通信;這意味著如果客戶機(jī)向服務(wù)器先發(fā)送 100 個(gè)字節(jié),然后又發(fā)送 50 個(gè)字節(jié)。那么服務(wù)器就會(huì)在兩次讀取操作中分別讀取到 100 個(gè)字節(jié)和 50 個(gè)字節(jié)。UDP 也是這樣進(jìn)行操作,這對(duì)于面向消息的協(xié)議非常有益。

            與此不同,TCP 是按照字節(jié)流的方式進(jìn)行操作。如果沒有分幀機(jī)制,一端接收到的數(shù)據(jù)可能比另外一端發(fā)送的數(shù)據(jù)多或少(這會(huì)將一次寫操作劃分成多次操作,或者將多次寫操作合并到一個(gè)讀操作中)。這種行為需要在 TCP 之上進(jìn)行操作的面向消息的協(xié)議可以在應(yīng)用層中提供數(shù)據(jù)緩沖和消息分幀機(jī)制(這可能是一項(xiàng)復(fù)雜的任務(wù))。

            SCTP 在數(shù)據(jù)傳輸中提供了消息分幀功能。當(dāng)一端對(duì)一個(gè)套接字執(zhí)行寫操作時(shí),可確保對(duì)等端讀出的數(shù)據(jù)大小與此相同(請(qǐng)參見圖 5)。


            圖 5. UDP/SCTP 中的消息分幀與面向字節(jié)流協(xié)議的比較
            UDP/SCTP 中的消息分幀與面向字節(jié)流協(xié)議的比較 

            對(duì)于面向流的數(shù)據(jù)來說,例如音頻和視頻數(shù)據(jù),可以沒有分幀機(jī)制。

            可配置的無序發(fā)送

            SCTP 中的消息的傳輸十分可靠,但未必是按照想要的次序來傳輸?shù)摹CP 可以確保數(shù)據(jù)是按照次序發(fā)送的(考慮到 TCP 是一種流協(xié)議,這是一件好事)。UDP 無法確保有序地發(fā)送數(shù)據(jù)。但是如果需要,您也可以在 SCTP 中配置流來接受無序的消息。

            這種特性在面向消息的協(xié)議中可能非常有用,因?yàn)槠渲械南⒍际仟?dú)立的,次序并不重要。另外,您可以在一個(gè)聯(lián)合中按照逐個(gè)流配置無序發(fā)送。

            平滑關(guān)閉

            TCP 和 SCTP 都是基于連接的協(xié)議,而 UDP 則是一種無連接的協(xié)議。TCP 和 SCTP 都需要在對(duì)等的兩端建立和拆除連接。SCTP 與 TCP 中關(guān)閉連接的不同之處在于 TCP 中連接的刪除是半關(guān)閉(half-close) 的。

            圖 6 給出了 TCP 和 SCTP 的關(guān)閉序列。


            圖 6. TCP 和 SCTP 的連接結(jié)束序列
            TCP 和 SCTP 的連接結(jié)束序列 

            在 TCP 中,一端可以關(guān)閉自己這端的 socket(這樣會(huì)導(dǎo)致發(fā)送一個(gè) FIN 報(bào)文),但是仍然可以繼續(xù)接收數(shù)據(jù)。FIN 說明這個(gè)端點(diǎn)不會(huì)再發(fā)送數(shù)據(jù),但是在這一端關(guān)閉自己這端的套接字之前,它一直可以繼續(xù)傳輸數(shù)據(jù)。應(yīng)用程序很少使用這種半關(guān)閉狀態(tài),因此 SCTP 的設(shè)計(jì)者就選擇放棄這種狀態(tài),并將其替換成了一個(gè)顯式的終結(jié)序列。當(dāng)一端關(guān)閉自己的套接字時(shí)(導(dǎo)致產(chǎn)生一個(gè) SHUTDOWN原語),對(duì)等的兩端全部需要關(guān)閉,將來任何一端都不允許再進(jìn)行數(shù)據(jù)的移動(dòng)了。

            多流的展示

            現(xiàn)在您已經(jīng)了解了 SCTP 的基本特性了,接下來讓我們來看一下使用 C 編程語言編寫的一個(gè)樣例服務(wù)器和客戶機(jī),并展示 SCTP 的多流特性。

            這個(gè)例子開發(fā)了一個(gè)服務(wù)器,它實(shí)現(xiàn)了一種形式的日期查詢協(xié)議。這個(gè)傳統(tǒng)的服務(wù)器會(huì)在連接上來的客戶機(jī)上打印當(dāng)前時(shí)間,但是對(duì)于 SCTP 來說,我們會(huì)在流 0 上打印本地時(shí)間,在流 1 上打印格林威治時(shí)間(GMT)。這個(gè)例子讓我們可以展示如何使用這些 API 來開發(fā)流通信。

            圖 7 對(duì)整個(gè)過程進(jìn)行了歸納,它不但從套接字 API 的角度展示了應(yīng)用程序的流程,而且還從客戶機(jī)和服務(wù)器的角度介紹了它們之間的關(guān)系。


            圖 7. 在多流日期查詢服務(wù)器和客戶機(jī)中使用的套接字函數(shù)
            在多流日期查詢服務(wù)器和客戶機(jī)中使用的套接字函數(shù) 

            這些應(yīng)用程序是在 GNU/Linux 操作系統(tǒng)上開發(fā)的,其內(nèi)核版本是 2.6.11,并且包含了 Linux Kernel SCTP 項(xiàng)目(lksctp)。其中非標(biāo)準(zhǔn)的 socket 函數(shù)是在 lksctp 工具包中提供的,這個(gè)工具包可以從 SourceForge 上獲得。請(qǐng)參看 參考資料 中的鏈接。

            daytime 服務(wù)器

            清單 1 給出了這個(gè)多流 daytime 服務(wù)器的代碼。為了可讀性更好,我們?cè)谇鍐?1 中忽略了所有的錯(cuò)誤檢查,但是 這些展示錯(cuò)誤檢查機(jī)制的代碼 與其他 SCTP 套接字?jǐn)U展一樣都可以通過給出的鏈接下載到。


            清單 1. 使用多流機(jī)制為 SCTP 編寫的日期查詢服務(wù)器
            int main()
            {
              int listenSock, connSock, ret;
              struct sockaddr_in servaddr;
              char buffer[MAX_BUFFER+1];
              time_t currentTime;
              /* Create SCTP TCP-Style Socket */
              listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
              /* Accept connections from any interface */
              bzero( (void *)&servaddr, sizeof(servaddr) );
              servaddr.sin_family = AF_INET;
              servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
              servaddr.sin_port = htons(MY_PORT_NUM);
              /* Bind to the wildcard address (all) and MY_PORT_NUM */
              ret = bind( listenSock,
                           (struct sockaddr *)&servaddr, sizeof(servaddr) );
              /* Place the server socket into the listening state */
              listen( listenSock, 5 );
              /* Server loop... */
              while( 1 ) {
                /* Await a new client connection */
                connSock = accept( listenSock,
                                    (struct sockaddr *)NULL, (int *)NULL );
                /* New client socket has connected */
                /* Grab the current time */
                currentTime = time(NULL);
                /* Send local time on stream 0 (local time stream) */
                snprintf( buffer, MAX_BUFFER, "%s\n", ctime(&currentTime) );
                ret = sctp_sendmsg( connSock,
                                      (void *)buffer, (size_t)strlen(buffer),
                                      NULL, 0, 0, 0, LOCALTIME_STREAM, 0, 0 );
                /* Send GMT on stream 1 (GMT stream) */
                snprintf( buffer, MAX_BUFFER, "%s\n",
                           asctime( gmtime( &currentTime ) ) );
                ret = sctp_sendmsg( connSock,
                                      (void *)buffer, (size_t)strlen(buffer),
                                      NULL, 0, 0, 0, GMT_STREAM, 0, 0 );
                /* Close the client connection */
                close( connSock );
              }
              return 0;
            }
            

            清單 1 中的服務(wù)器首先創(chuàng)建服務(wù)器的套接字(使用 IPPROTO_SCTP 來創(chuàng)建一個(gè) SCTP 的一對(duì)一的套接字)。然后創(chuàng)建一個(gè) sockaddr 結(jié)構(gòu),指定這個(gè)連接可以從任何本地接口上創(chuàng)建(使用通配符地址 INADDR_ANY)。我們使用 bind 調(diào)用將這個(gè) sockaddr 結(jié)構(gòu)綁定到 socket 上,然后將服務(wù)器套接字設(shè)置成監(jiān)聽狀態(tài)。現(xiàn)在就可以接收到達(dá)的連接了。

            注意 SCTP 使用了很多與 TCP 和 UDP 相同的套接字 API。在 lksctp 開發(fā)工具中還提供了其他一些 API 函數(shù)(請(qǐng)參看 參考資料)。

            在服務(wù)器的循環(huán)中,一直等待新客戶機(jī)的連接請(qǐng)求。在從 accept 函數(shù)返回時(shí),會(huì)使用 connSock socket 標(biāo)識(shí)新客戶機(jī)的連接。我們使用 time 函數(shù)來獲取當(dāng)前時(shí)間,然后使用 snprintf 將其轉(zhuǎn)換成字符串。使用 sctp_sendmsg 函數(shù)(一個(gè)非標(biāo)準(zhǔn)的 socket 調(diào)用),可以通過指定特定的流程(LOCALTIME_STREAM,將這個(gè)字符串發(fā)送給客戶機(jī)。當(dāng)發(fā)送本地時(shí)間字符串之后,我們將使用 GMT 表示的當(dāng)前時(shí)間轉(zhuǎn)換成一個(gè)字符串,然后將其發(fā)送到流 GMT_STREAM 上。

            現(xiàn)在,日期查詢服務(wù)器已經(jīng)完成了自己的職責(zé),因此我們就可以關(guān)閉這個(gè) socket,然后等待一個(gè)新的客戶機(jī)連接。一切都非常簡單,對(duì)嗎?現(xiàn)在讓我們來看一下日期查詢客戶機(jī)是如何處理多流的。

            日期查詢客戶機(jī)

            多流客戶機(jī)如清單 2 所示。


            清單 2. 使用多流機(jī)制為 SCTP 編寫的日期查詢客戶機(jī)
            int main()
            {
              int connSock, in, i, flags;
              struct sockaddr_in servaddr;
              struct sctp_sndrcvinfo sndrcvinfo;
              struct sctp_event_subscribe events;
              char buffer[MAX_BUFFER+1];
              /* Create an SCTP TCP-Style Socket */
              connSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
              /* Specify the peer endpoint to which we'll connect */
              bzero( (void *)&servaddr, sizeof(servaddr) );
              servaddr.sin_family = AF_INET;
              servaddr.sin_port = htons(MY_PORT_NUM);
              servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
              /* Connect to the server */
              connect( connSock, (struct sockaddr *)&servaddr, sizeof(servaddr) );
              /* Enable receipt of SCTP Snd/Rcv Data via sctp_recvmsg */
              memset( (void *)&events, 0, sizeof(events) );
              events.sctp_data_io_event = 1;
              setsockopt( connSock, SOL_SCTP, SCTP_EVENTS,
                           (const void *)&events, sizeof(events) );
              /* Expect two messages from the peer */
              for (i = 0 ; i < 2 ; i++) {
                in = sctp_recvmsg( connSock, (void *)buffer, sizeof(buffer),
                                    (struct sockaddr *)NULL, 0,
                                    &sndrcvinfo, &flags );
                /* Null terminate the incoming string */
                buffer[in] = 0;
                if        (sndrcvinfo.sinfo_stream == LOCALTIME_STREAM) {
                  printf("(Local) %s\n", buffer);
                } else if (sndrcvinfo.sinfo_stream == GMT_STREAM) {
                  printf("(GMT  ) %s\n", buffer);
                }
              }
              /* Close our socket and exit */
              close(connSock);
              return 0;
            }
            

            在客戶機(jī)中,我們首先創(chuàng)建了一個(gè) SCTP 套接字,然后創(chuàng)建了一個(gè) sockaddr 結(jié)構(gòu),其中包含了將要連接的端點(diǎn)。connect 函數(shù)然后建立一個(gè)到服務(wù)器的連接。要獲取消息的流編號(hào),SCTP 需要啟用套接字選項(xiàng) sctp_data_io_event

            通過啟用這個(gè)選項(xiàng),我們就可以通過 sctp_recvmsg API 函數(shù)接收一條消息,我們還接收到一個(gè)包含流編號(hào)的 sctp_sndrcvinfo 結(jié)構(gòu)。這個(gè)編號(hào)讓我們可以區(qū)分開流 0(本地時(shí)間)和流 1(GMT)的消息。

            SCTP 的未來發(fā)展

            SCTP 是一個(gè)相當(dāng)新的協(xié)議,它在 2000 年 10 月份才成為一個(gè) RFC 規(guī)范。從那以后,它開始進(jìn)入所有的主流操作系統(tǒng),包括 GNU/Linux、BSD 和 Solaris。在 Microsoft® Windows® 操作系統(tǒng)上也有第三方的商業(yè)包可以使用。

            在獲得高可用性的同時(shí),應(yīng)用程序也已經(jīng)開始使用 SCTP 作為自己的主要傳輸機(jī)制。諸如 FTP 和 HTTP 之類的傳統(tǒng)應(yīng)用程序已經(jīng)在 SCTP 的特性基礎(chǔ)上進(jìn)行了構(gòu)建。其他一些協(xié)議也正在開始使用 SCTP,例如會(huì)話初始化協(xié)議(Session Initiation Protocol,SIP)和通用通道信號(hào)系統(tǒng) 7(SS7)。在商業(yè)領(lǐng)域中,您可以在 Cisco 的 IOS 中找到 SCTP 的影子。

            隨著 SCTP 被吸納到 2.6 版本的 Linux 內(nèi)核中,現(xiàn)在我們可以構(gòu)建并部署高可用性、高可靠性的網(wǎng)絡(luò)應(yīng)用程序。作為一種基于 IP 的協(xié)議,SCTP 不但可以無縫地替換 TCP 和 UDP,而且擴(kuò)展了很多新服務(wù),例如多宿主、多流,并且對(duì)安全性也有了很大的提高。現(xiàn)在您已經(jīng)了解了 SCTP 的一些高級(jí)特性,并且探索了它的一些其他功能。Linux Kernel SCTP 項(xiàng)目(lksctp)提供了可以為您提供輔助的 API 擴(kuò)展和文檔。


            下載

            描述 名字 大小 下載方法
            Multi-streaming demo source code l-sctp-msdemo.zip 74KB HTTP

            關(guān)于下載方法的信息


            參考資料

            學(xué)習(xí)

            獲得產(chǎn)品和技術(shù)

            討論

            關(guān)于作者

            M. Tim Jones

            M. Tim Jones 是一名嵌入式軟件工程師,他是 GNU/Linux Application ProgrammingAI Application Programming BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內(nèi)核開發(fā)到嵌入式架構(gòu)設(shè)計(jì),再到網(wǎng)絡(luò)協(xié)議的開發(fā)。Tim 是 Emulex Corp. 的一名資深軟件工程師。


            posted on 2013-09-02 05:06 楊粼波 閱讀(1058) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            一97日本道伊人久久综合影院| 久久精品国产亚洲av日韩| 久久精品国产亚洲AV大全| 99久久er这里只有精品18| 国产午夜免费高清久久影院| 91精品国产高清久久久久久io| 青青青伊人色综合久久| 久久久久亚洲av成人无码电影| 亚洲国产另类久久久精品黑人| 久久99热国产这有精品| 亚洲精品国产自在久久| 99久久国产热无码精品免费| 婷婷久久综合| 欧美久久精品一级c片片| 一本一本久久a久久综合精品蜜桃| 久久99热狠狠色精品一区| 麻豆av久久av盛宴av| 99久久亚洲综合精品成人| 久久AV高潮AV无码AV| 久久免费大片| 91精品婷婷国产综合久久| 97精品依人久久久大香线蕉97| 久久国产热这里只有精品| 久久精品国产亚洲AV高清热| 国内精品伊人久久久久妇| 狠狠人妻久久久久久综合蜜桃| A狠狠久久蜜臀婷色中文网| 国产精品久久久久免费a∨| 人妻系列无码专区久久五月天| 日本三级久久网| 久久综合久久综合久久综合| 久久精品九九亚洲精品| 久久亚洲欧美国产精品| 亚洲中文字幕无码久久精品1| 亚洲欧美日韩精品久久亚洲区| 国产成人久久久精品二区三区| 女人香蕉久久**毛片精品| 亚洲伊人久久大香线蕉苏妲己| 久久综合综合久久97色| 99久久婷婷国产一区二区| 久久久精品无码专区不卡|