用戶數(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連接建立和終止所需的開銷。