UNIX 網(wǎng)絡(luò)編程(第2章) - 傳輸層:TCP、UDP和SCTP

用戶數(shù)據(jù)報(bào)協(xié)議(UDP)

UDP是一個(gè)簡單的傳輸層協(xié)議。UDP不保證UDP數(shù)據(jù)報(bào)會(huì)到達(dá)其最終目的地,不保證各個(gè)數(shù)據(jù)報(bào)的先后順序跨網(wǎng)絡(luò)后保持不變,也不保證每個(gè)數(shù)據(jù)報(bào)只到達(dá)一次。

每個(gè)UDP數(shù)據(jù)報(bào)都有一個(gè)長度。

我們也說UDP提供無連接的(connectionless)服務(wù),因?yàn)閁DP客戶和服務(wù)器之間不必存在任何長期的關(guān)系。舉例來說,一個(gè)UDP客戶可以創(chuàng)建一個(gè)套接字并發(fā)送一個(gè)數(shù)據(jù)報(bào)給一個(gè)給定的服務(wù)器,然后立即用同一個(gè)套接字發(fā)送另一個(gè)數(shù)據(jù)報(bào)給另一個(gè)服務(wù)器。同樣的,一個(gè)UDP服務(wù)器也可以用同一個(gè)UDP套接字從若干個(gè)不同的客戶端接收數(shù)據(jù)報(bào),每個(gè)客戶一個(gè)數(shù)據(jù)報(bào)。

傳輸控制協(xié)議(TCP)

TCP提供客戶和服務(wù)器之間的連接(connection)。TCP客戶先與某個(gè)給定服務(wù)器建立一個(gè)連接,再跨該連接與那個(gè)服務(wù)器交換數(shù)據(jù),然后終止這個(gè)連接。

TCP不能被描述成是100%可靠的協(xié)議,它提供的是數(shù)據(jù)的可靠遞送或故障的可靠通知。

TCP含有用于動(dòng)態(tài)估算客戶和服務(wù)器之間的往返時(shí)間(round-trip time, RTT)的算法,以便它知道等待一個(gè)確認(rèn)需要多少時(shí)間。

TCP通過給其中每個(gè)字節(jié)關(guān)聯(lián)一個(gè)序列號對所發(fā)送的數(shù)據(jù)進(jìn)行排序(sequencing)

TCP提供流量控制(flow control)。TCP總是告知對端在任何時(shí)刻它一次能夠從對端接收多少字節(jié)的數(shù)據(jù),這稱為通告窗口(advertised window)。在任何時(shí)刻,該窗口指出接收緩沖區(qū)中當(dāng)前可用的空間量,從而確保發(fā)送端發(fā)送的數(shù)據(jù)不會(huì)使接收緩沖區(qū)溢出。該窗口時(shí)刻動(dòng)態(tài)變化。

TCP連接是全雙工的(full-duplex)。建立一個(gè)全雙工連接后,需要的話可以把它轉(zhuǎn)換為一個(gè)單工連接。

流傳輸控制協(xié)議(SCTP)

SCTP在客戶和服務(wù)器之間提供關(guān)聯(lián)(association)。并像TCP那樣給應(yīng)用提供可靠性、排序、流量控制以及全雙工的數(shù)據(jù)傳送。SCTP支持多宿而涉及不止兩個(gè)地址。

與TCP不同的是,SCTP是面向消息的(message-oriented)。它提供各個(gè)記錄的按序遞送服務(wù),與UDP一樣,由發(fā)送端寫入的每條記錄的長度隨數(shù)據(jù)一道傳遞給接收端應(yīng)用。

SCTP能夠在所連接的斷點(diǎn)之間提供多個(gè)流,每個(gè)流各自可靠地按序遞送消息。一個(gè)流上某個(gè)消息的丟失不會(huì)阻塞同一關(guān)聯(lián)其他流上消息的投遞。

SCTP還提供多宿特性,使得單個(gè)SCTP端點(diǎn)能夠支持多個(gè)IP地址。該特性可以增強(qiáng)應(yīng)對網(wǎng)絡(luò)故障的健壯性。

三路握手

TCP 選項(xiàng)

  • MSS選項(xiàng) 發(fā)送SYN的TCP一端使用本選項(xiàng)通告對端它的最大分節(jié)大小(maximum segment size)即MSS,也就是它在本連接的每個(gè)TCP分節(jié)中愿意接受的最大數(shù)據(jù)量。
  • 窗口規(guī)模選項(xiàng)
  • 時(shí)間戳選項(xiàng) 作為網(wǎng)絡(luò)編程選項(xiàng),我們無需考慮這個(gè)選項(xiàng)。

TCP連接終止

當(dāng)一個(gè)Unix進(jìn)程無論自愿地(調(diào)用exit或從main函數(shù)返回)還是非自愿地(收到一個(gè)終止本進(jìn)程的信號)終止時(shí),所有打開的描述符都被關(guān)閉,這也導(dǎo)致仍然打開的任何TCP連接上也發(fā)出一個(gè)FIN。

TCP狀態(tài)轉(zhuǎn)換圖

這些狀態(tài)可以使用netstat顯示。

觀察分組

注意,服務(wù)器對客戶請求的確認(rèn)是伴隨其應(yīng)答發(fā)送的,這種做法稱為捎帶(piggybacking),它通常在服務(wù)器處理請求并產(chǎn)生應(yīng)答的時(shí)間少于200ms時(shí)發(fā)生。如果服務(wù)器好用更長時(shí)間,譬如1s,那么我們將看到先是確認(rèn)后是應(yīng)答。

許多網(wǎng)絡(luò)應(yīng)用仍然使用UDP構(gòu)建的,因?yàn)樗鼈冃枰粨Q的數(shù)據(jù)量較少,而UDP避免了TCP連接建立和終止所需的開銷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 18.1 引言 TCP是一個(gè)面向連接的協(xié)議。無論哪一方向另一方發(fā)送數(shù)據(jù)之前,都必須先在雙方之間建立一條連接。本章將...
    張芳濤閱讀 3,529評論 0 13
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對這部分知識做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,380評論 6 174
  • 26.1 引言 遠(yuǎn)程登錄(Remote Login)是Internet上最廣泛的應(yīng)用之一。我們可以先登錄(即注冊)...
    張芳濤閱讀 4,285評論 0 6
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,196評論 0 8
  • 周六,三十度,我頂著烈日坐了兩個(gè)半小時(shí)的公交車去報(bào)名繳費(fèi)。我打算讀一個(gè)企業(yè)培訓(xùn)師,可是南橋并沒有合適的機(jī)構(gòu)可以選擇...
    小怪是只貓咪閱讀 442評論 1 3

友情鏈接更多精彩內(nèi)容