一、基礎(chǔ)概念
- 服務(wù)對(duì)象:進(jìn)程
- 功能:邏輯通訊
- 載體:報(bào)文段
- 工作環(huán)境:端系統(tǒng)
- 運(yùn)輸層協(xié)議
??TCP:為進(jìn)程提供可靠的、面向連接的服務(wù)
??UDP:為進(jìn)程提供不可靠的、無(wú)連接的服務(wù)
二、多路分解與多路復(fù)用
- 多路分解:將運(yùn)輸層報(bào)文中的數(shù)據(jù)交付到正確的套接字(socket)上工作
- 多路復(fù)用:在原主機(jī)從不用套接字中收集數(shù)據(jù)塊,并為每個(gè)數(shù)據(jù)塊封裝上首部信息,從而生成報(bào)文段,然后將報(bào)文段傳遞到網(wǎng)絡(luò)層。
- 運(yùn)輸層多路復(fù)用要求:
??a. 套接字有唯一標(biāo)識(shí)符
??b. 每個(gè)報(bào)文段有特殊字段(源端口號(hào)字段、目的端口號(hào)字段)來(lái)指示改報(bào)文段所要交付到的套接字 - 運(yùn)輸層分解服務(wù)實(shí)現(xiàn):
??在主機(jī)上的每個(gè)套接字能夠分配一個(gè)端口號(hào),當(dāng)報(bào)文段到達(dá)主機(jī)時(shí),運(yùn)輸層檢查報(bào)文段中的目的端口號(hào),并將其定向到相應(yīng)的套接字
??UDP套接字由一個(gè)二元組(目的IP地址,目的端口號(hào))來(lái)標(biāo)識(shí)
??TCP套接字由一個(gè)四元組(源IP地址,源端口號(hào),目的IP地址,目的端口號(hào))來(lái)標(biāo)識(shí)
三、可靠數(shù)據(jù)傳輸
- 可靠數(shù)據(jù)傳輸協(xié)議的要點(diǎn):檢驗(yàn)和、序號(hào)、定時(shí)器、肯定和否定確認(rèn)分組
| 機(jī)制 | 用途和說(shuō)明 |
|---|---|
| 檢驗(yàn)和 | 用于檢測(cè)在一個(gè)傳輸分組中的比特錯(cuò)誤 |
| 定時(shí)器 | 用于超時(shí)/重傳一個(gè)分組,可能該分組(或其ACK)在信道中丟失 |
| 序號(hào) | 用于為從發(fā)送方流向接收放的數(shù)據(jù)分組按順序編號(hào) |
| 確認(rèn) | 接收方用于告訴發(fā)送方一個(gè)分組或一組分組已被正確接收到 |
| 否定確認(rèn) | 接收方用于告訴發(fā)送方一個(gè)分組或一組分組未被正確接收到 |
流水線技術(shù)
?1) 含義:不使用停等方式運(yùn)行,允許發(fā)送方發(fā)送多個(gè)分組而無(wú)需等待確認(rèn)
?2) 對(duì)可靠數(shù)據(jù)傳輸協(xié)議帶來(lái)的影響:
??a. 必須增加序號(hào)范圍,因?yàn)槊總€(gè)輸送中的分組(不計(jì)算重傳的)必須有一個(gè)唯一的序號(hào),而且也許有多個(gè)在輸送中未確認(rèn)的報(bào)文;
??b. 協(xié)議的發(fā)送方和接收方兩端也許必須緩存多個(gè)分組;
??c. 所需序號(hào)范圍和對(duì)緩沖的要求取決于數(shù)據(jù)傳輸協(xié)議如何處理丟失。損壞及延時(shí)過(guò)大的分組。
?3) 解決流水線的差錯(cuò)恢復(fù)的兩種基本方法:回退N步 (GBN) 和選擇重傳 (SR)回退N步 (GNB)
? 1) 定義:允許發(fā)送放發(fā)送多個(gè)分組而不需要等待確認(rèn),但在流水線中未確認(rèn)的分組數(shù)不得超過(guò)窗口長(zhǎng)度N,隨著協(xié)議運(yùn)行,該窗口的序號(hào)空間在向前滑動(dòng),所以GBN協(xié)議也被稱為滑動(dòng)窗口協(xié)議
? 2) 發(fā)送方采用動(dòng)作:
?? a. 上層的調(diào)用。發(fā)送方檢查發(fā)送窗口是否已滿,如果未滿則產(chǎn)生分組將其發(fā)送;如果已滿則緩存等待或者通過(guò)同步機(jī)制運(yùn)行上層僅當(dāng)窗口不滿時(shí)才被調(diào)用。
?? b. 收到一個(gè)ACK。GBN采用累積確認(rèn),表明接收方已經(jīng)收到序號(hào)n以及n以前的所有分組。
?? c. 超時(shí)事件。發(fā)送方重傳所有已發(fā)送但未被確認(rèn)過(guò)的分組,如果接收到一個(gè)ACK,但仍有已發(fā)送但未被確認(rèn)的分組,則定時(shí)器重新啟動(dòng)。
? 3) 接收方采用動(dòng)作:如果序號(hào)為n的分組被正確收到,兵器按序,則接收方為分組n發(fā)送一個(gè)ACK,并將分組中的數(shù)據(jù)交付到上層;其他情況,接收方丟棄該分組,并為最近按序接收的分組重新發(fā)送ACK。
? 4) 丟棄未按序分組帶來(lái)的優(yōu)缺點(diǎn)
?? a. 優(yōu)點(diǎn):接收緩存簡(jiǎn)單,即接收方不需要緩存失序分組
?? b. 缺點(diǎn):隨后對(duì)該分組的重傳也許會(huì)丟失或出錯(cuò),因此需要更多的重傳選擇重傳(SR)
? 1) 定義:允許發(fā)送放發(fā)送多個(gè)分組而不需要等待確認(rèn),發(fā)送方僅重傳那些他懷疑接收方出錯(cuò)的分組而避免面不必要的重傳。
? 2) 發(fā)送方采用動(dòng)作:
?? a. 上層的調(diào)用。發(fā)送方檢查發(fā)送窗口是否已滿,如果未滿則產(chǎn)生分組將其發(fā)送;如果已滿則緩存等待或者通過(guò)同步機(jī)制運(yùn)行上層僅當(dāng)窗口不滿時(shí)才被調(diào)用。
?? b. 超時(shí)。每個(gè)分組都有一個(gè)自己的邏輯定時(shí)器,發(fā)生超時(shí)只能發(fā)送一個(gè)分組。
?? c. 收到ACK。如果ACK確認(rèn)的序號(hào)等于窗口最左端序號(hào),則窗口向右移動(dòng),否則標(biāo)記該組為已收到。
? 3) 接收方采用動(dòng)作
?? a. 序號(hào)在窗口內(nèi)。發(fā)送ACK,如果第一次接收則緩存(窗口左端如果緩存了則向上交付)
?? b. 序號(hào)在窗口-N內(nèi)。立刻發(fā)送ACK。
?? c. 其它情況。忽略分組
四、面向連接的運(yùn)輸:TCP
-
TCP報(bào)文結(jié)構(gòu)
TCP連接管理
三次握手
??(1) 第一次握手:建立連接時(shí),客戶端A發(fā)送SYN包[SYN=1,seq=x]到服務(wù)器B,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器B確認(rèn)。
??(2) 第二次握手:服務(wù)器B收到SYN包,必須確認(rèn)客戶A的SYN,同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN+ACK包[SYN=1,ACK=1,seq=y,ack=x+1],此時(shí)服務(wù)器B進(jìn)入SYN_RECV狀態(tài)。
??(3) 第三次握手:客戶端A收到服務(wù)器B的SYN+ACK包,向服務(wù)器B發(fā)送確認(rèn)包ACK[ACK=1,seq=x+1,ack=y+1],此包發(fā)送完畢,客戶端A和服務(wù)器B進(jìn)入ESTABLISHED狀態(tài),完成三次握手。 第三次握手可在報(bào)文段負(fù)載中攜帶客戶到服務(wù)器的數(shù)據(jù)。三次握手后客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。四次揮手
??(1) 首先A B端的TCP進(jìn)程都處于ESTABLISHED狀態(tài), 當(dāng)A的應(yīng)用程序傳送完報(bào)文段,就會(huì)去主動(dòng)關(guān)閉連接。A會(huì)停止發(fā)送報(bào)文段(但是還會(huì)接收),并向B發(fā)送[FIN = 1,seq=u]數(shù)據(jù),之后進(jìn)入FIN-WAIT-1狀態(tài);
??(2) B接收到A發(fā)送的請(qǐng)求之后,會(huì)通知應(yīng)用進(jìn)程,A已經(jīng)不再發(fā)送數(shù)據(jù),同時(shí)B會(huì)向A發(fā)送ACK確認(rèn)數(shù)據(jù)[ACK=1,seq=v,ack=u+1 ],B進(jìn)入CLOSE-WAIT狀態(tài),A接收到B發(fā)送的數(shù)據(jù)之后,A進(jìn)入FIN-WAIT-2狀態(tài);此時(shí)A到B方的連接已經(jīng)關(guān)閉了(即半連接狀態(tài))。
??(3) 當(dāng)B的應(yīng)用進(jìn)程發(fā)現(xiàn)自己也沒(méi)有數(shù)據(jù)需要傳送,B應(yīng)用進(jìn)程就會(huì)發(fā)出被動(dòng)關(guān)閉的請(qǐng)求,B此時(shí)向A發(fā)送[FIN=1,ACK=1,seq=w,ack=u+1]數(shù)據(jù),并且進(jìn)入LAST-ACK狀態(tài);
??(4) A接收到B發(fā)送的數(shù)據(jù)之后,向B發(fā)送ACK確認(rèn)數(shù)據(jù)[ACK =1,seq=u+1,ack=w+1],進(jìn)入TIME-WAIT狀態(tài),等待2MSL之后正常關(guān)閉連接進(jìn)入CLOSED狀態(tài);B接收到A發(fā)送的確認(rèn)之后進(jìn)入CLOSED狀態(tài)。B到A方的連接關(guān)閉!至此,TCP連接才真正全部關(guān)閉!為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
??這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到客戶端的SYN報(bào)文的建立連接請(qǐng)求后,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一個(gè)報(bào)文里來(lái)發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文通知時(shí),它僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以未必會(huì)馬上會(huì)關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對(duì)方之后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報(bào)文和FIN報(bào)文多數(shù)情況下都是分開(kāi)發(fā)送的。為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)?
??這是因?yàn)殡m然雙方都同意關(guān)閉連接了,而且握手的4個(gè)報(bào)文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到CLOSED狀態(tài)(就好比從SYN_SEND狀態(tài)到 ESTABLISH狀態(tài)那樣);但是因?yàn)槲覀儽仨氁傧刖W(wǎng)絡(luò)是不可靠的,你無(wú)法保證你最后發(fā)送的ACK報(bào)文會(huì)一定被對(duì)方收到,因此對(duì)方處于 LAST_ACK狀態(tài)下的SOCKET可能會(huì)因?yàn)槌瑫r(shí)未收到ACK報(bào)文,而重發(fā)FIN報(bào)文,所以這個(gè)TIME_WAIT狀態(tài)的作用就是用來(lái)重發(fā)可能丟失的 ACK報(bào)文。
- TCP可靠數(shù)據(jù)傳輸
(1) 上層調(diào)用
??TCP從應(yīng)用程序接收數(shù)據(jù),將數(shù)據(jù)封裝到一個(gè)報(bào)文段中,并將改報(bào)文段交給IP(每個(gè)報(bào)文段都包含一個(gè)序號(hào))
(2) 超時(shí)
??TCP通過(guò)重傳引起超時(shí)的報(bào)文段來(lái)相應(yīng)超時(shí)時(shí)間,然后TCP重啟定時(shí)器。
(3) 收到ACK
??TCP采用累計(jì)確認(rèn)策略。確認(rèn)序號(hào)表示序號(hào)前的所有字節(jié)都已經(jīng)正確且按序接收。
超時(shí)間隔設(shè)定
??每次TCP重傳時(shí)都會(huì)將下一次的超時(shí)間隔設(shè)定為先前值的兩倍,這種修改提供了一個(gè)形式受限的擁塞控制(在擁塞的時(shí)候,如果源持續(xù)重傳分組,會(huì)使擁塞更加嚴(yán)重)快速重傳
??如果TCP發(fā)送方接收到對(duì)相同數(shù)據(jù)的3個(gè)冗余ACK(3個(gè)冗余ACK = 1個(gè)正常ACK + 3 個(gè)重復(fù)ACK),它把著當(dāng)作一種指示,說(shuō)明跟在這個(gè)已被確認(rèn)過(guò)3次的報(bào)文段之后的報(bào)文段已經(jīng)丟失,TCP就執(zhí)行快速重傳,即在改報(bào)文段的定時(shí)器過(guò)期之前重傳丟失的報(bào)文。TCP 差錯(cuò)恢復(fù)機(jī)制
??雖然TCP采用累計(jì)確認(rèn),但是TCP發(fā)生超時(shí)事件時(shí)重傳至多一個(gè)報(bào)文段。此外,如果對(duì)報(bào)文段 n+1 的確認(rèn)報(bào)文在報(bào)文段 n 超時(shí)前到達(dá),TCP不會(huì)重傳報(bào)文段 n。因此,TCP的差錯(cuò)恢復(fù)機(jī)制是GBN和SR協(xié)議的混合體。TCP超時(shí)重傳舉例
??(1) 如果主機(jī) A 向主機(jī) B 發(fā)送一個(gè)報(bào)文段,當(dāng)超時(shí)事件發(fā)生時(shí),A 會(huì)重傳相同的報(bào)文段
??(2) 如果主機(jī) A 向主機(jī) B 發(fā)送兩個(gè)報(bào)文段,當(dāng)超時(shí)事件發(fā)生時(shí)(沒(méi)有一個(gè)確認(rèn)報(bào)文到達(dá) A),A 只會(huì)重傳第一個(gè)報(bào)文段,并啟動(dòng)定時(shí)器,如果第二個(gè)報(bào)文段的ACK在新的超時(shí)發(fā)生前到達(dá),則第二報(bào)文段不會(huì)被重傳。
??(3) 如果主機(jī) A 向主機(jī) B 發(fā)送兩個(gè)報(bào)文段,如果第一個(gè)報(bào)文段的ACK在網(wǎng)絡(luò)丟失,但在超時(shí)前接收到第二個(gè)報(bào)文段的確認(rèn)報(bào)文,由于TCP采用累積確認(rèn),所以不會(huì)發(fā)生重傳。流量控制
??TCP的流量控制是一個(gè)速度匹配服務(wù)。通過(guò)發(fā)送方維護(hù)一個(gè)接收窗口(接收方還有多少緩存空間)的變量來(lái)提供流量控制。接收窗口大小 = 接收緩存空間大小 - 緩存中的TCP數(shù)據(jù)大小。
??當(dāng)主機(jī)的接收窗口為0時(shí),發(fā)送方會(huì)繼續(xù)發(fā)送只有一個(gè)字節(jié)數(shù)據(jù)的報(bào)文。為什么當(dāng)接收窗口為0時(shí),發(fā)送方仍然繼續(xù)發(fā)送報(bào)文?
??TCP當(dāng)且僅當(dāng)有數(shù)據(jù)或有確認(rèn)要發(fā)時(shí)才會(huì)發(fā)送報(bào)文段。
??A為發(fā)送方,B為接收方。假設(shè)B告知A接收窗口大小為0,且B沒(méi)任何數(shù)據(jù)發(fā)送給A。當(dāng)B上的應(yīng)用進(jìn)程將緩存清空,因?yàn)锽沒(méi)有數(shù)據(jù)或者確認(rèn)向A發(fā)送報(bào)文段,所以TCP并不會(huì)向A發(fā)送帶有接收窗口大小的新報(bào)文,導(dǎo)致A不可能知道B中有新的空間,即A被阻塞而不能再發(fā)送給數(shù)據(jù)。
五、TCP擁塞控制
TCP采用的方法:讓每一個(gè)發(fā)送方根據(jù)所感知到的網(wǎng)絡(luò)擁塞程度來(lái)限制其能向鏈接發(fā)送流量的速率。
TCP發(fā)送方如何限制它發(fā)送流量的速率?
??運(yùn)行在發(fā)送方的TCP擁塞控制機(jī)制跟蹤一個(gè)額外的變量——擁塞窗口,在發(fā)送方未確認(rèn)的數(shù)據(jù)量不得超過(guò)擁塞窗口與接收窗口的最小值(間接地限制發(fā)送方的發(fā)送速率)。
??發(fā)送速率 = 發(fā)送數(shù)據(jù)量(未確認(rèn)數(shù)據(jù)流) / 往返時(shí)間,通過(guò)調(diào)節(jié)擁塞窗口可以達(dá)到調(diào)整發(fā)送方發(fā)送數(shù)據(jù)的速率。TCP如何感知它到目的地之間的路徑是否擁塞?
??TCP發(fā)送方的“丟包事件”定義為:要么出現(xiàn)超時(shí),要么收到來(lái)自接收方的3個(gè)冗余ACK。當(dāng)出現(xiàn)過(guò)度的擁塞時(shí),在沿著這條路徑上的一臺(tái)或多臺(tái)路由器的緩存會(huì)溢出,引起數(shù)據(jù)包(含TCP報(bào)文段)被丟棄。被丟棄的數(shù)據(jù)包會(huì)引發(fā)發(fā)送方的丟包時(shí)間(超時(shí)或者收到3個(gè)冗余ACK),發(fā)送方就會(huì)認(rèn)為在發(fā)送方到接收方的路徑上出現(xiàn)了擁塞的指示。TCP發(fā)送方如何確定發(fā)送速率?
??(1) 當(dāng)發(fā)生丟失報(bào)文段時(shí)應(yīng)當(dāng)降低TCP發(fā)送方的速率(減少擁塞窗口的長(zhǎng)度)
??(2) 當(dāng)對(duì)先前未確認(rèn)報(bào)文段的確認(rèn)到達(dá)時(shí),增加發(fā)送方速率(增加擁塞窗口的長(zhǎng)度)
??(3) 帶寬探測(cè)。TCP擁塞控制算法
慢啟動(dòng)算法
??1) 連接建好的開(kāi)始先初始化擁塞窗口cwnd大小為1,表明可以傳一個(gè)MSS大小的數(shù)據(jù)。
??2) 每當(dāng)收到一個(gè)ACK,cwnd大小加一,呈線性上升。
??3) 每當(dāng)過(guò)了一個(gè)往返延遲時(shí)間RTT(Round-Trip Time),cwnd大小直接翻倍,乘以2,呈指數(shù)讓升。
??4) 還有一個(gè)ssthresh(slow start threshold),是一個(gè)上限,當(dāng)cwnd >= ssthresh時(shí),就會(huì)進(jìn)入“擁塞避免算法”
擁塞避免算法
??1) 收到一個(gè)ACK,則cwnd = cwnd + 1 / cwnd
??2) 每當(dāng)過(guò)了一個(gè)往返延遲時(shí)間RTT,cwnd大小加一。
擁塞狀態(tài)時(shí)的算法
??1) 更改cwnd和ssthresh為原有cwnd的一半
??2) 然后進(jìn)入快速恢復(fù)算法Fast Recovery。
快速恢復(fù)
??1) cwnd = cwnd + 3 * MSS,加3 * MSS的原因是因?yàn)槭盏?個(gè)重復(fù)的ACK。
??2) 重傳DACKs指定的數(shù)據(jù)包。
??3) 如果再收到DACKs,那么cwnd大小增加一。
??4) 如果收到新的ACK,表明重傳的包成功了,那么退出快速恢復(fù)算法。將cwnd設(shè)置為ssthresh,然后進(jìn)入擁塞避免算法。
六、無(wú)連接的服務(wù)UDP
定義:在IP協(xié)議上,添加復(fù)用/分解功能以及少量的差錯(cuò)檢測(cè)。發(fā)送放和接收方的運(yùn)輸層實(shí)體之間沒(méi)有握手,所以被稱為是無(wú)連接的。
使用UDP優(yōu)勢(shì)
??1) 能夠?yàn)閼?yīng)用層更精細(xì)控制(時(shí)間及數(shù)據(jù)類型)。只要應(yīng)用進(jìn)程將數(shù)據(jù)傳遞給UDP,UDP就會(huì)將數(shù)據(jù)打包進(jìn)UDP報(bào)文段并立刻傳遞給網(wǎng)絡(luò)層。TCP由于可靠傳輸、擁塞控制機(jī)制等,可能會(huì)導(dǎo)致報(bào)文段傳送的延遲。當(dāng)實(shí)時(shí)應(yīng)用要求最小的發(fā)送速率、不希望過(guò)分地延遲報(bào)文段的發(fā)送,且容忍一些數(shù)據(jù)的丟失,UDP更為適用。
??2) 無(wú)需連接建立。UDP不需要任何準(zhǔn)備就能進(jìn)行數(shù)據(jù)傳輸,所以UDP不會(huì)引入建立連接的時(shí)延。
??3) 無(wú)連接狀態(tài)。TCP需要在段端系統(tǒng)中維護(hù)連接狀態(tài)(接收和發(fā)送緩存、擁塞控制參數(shù)以及序號(hào)與確定號(hào)等參數(shù)),由于UDP是無(wú)連接狀態(tài)所以不需要維護(hù)也不需要跟蹤這些參數(shù)。所以在某些專門(mén)應(yīng)用于特定應(yīng)用的服務(wù)器,當(dāng)應(yīng)用程序運(yùn)行在UDP而非TCP上時(shí),能夠支持更多的活躍用戶。
??4) 分組首部開(kāi)銷(xiāo)小。TCP報(bào)文段需要20字節(jié)的首部開(kāi)銷(xiāo),而UDP僅需要8字節(jié)。UDP的弊端
??UDP中缺乏擁塞控制能夠?qū)е耈DP發(fā)送方和接收方之間的高丟包率,并擠垮了TCP會(huì)話,這是一個(gè)潛在的嚴(yán)重問(wèn)題。流行的因特網(wǎng)應(yīng)用及其下面的運(yùn)輸協(xié)議
| 應(yīng)用 | 應(yīng)用層協(xié)議 | 運(yùn)輸層協(xié)議 |
|---|---|---|
| 電子郵件 | SMTP | TCP |
| 遠(yuǎn)程終端訪問(wèn) | Telnet | TCP |
| Web | HTTP | TCP |
| 文件傳輸 | FTP | TCP |
| 遠(yuǎn)程文件服務(wù)器 | NFS | 通常UDP |
| 流式多媒體 | 通常專用 | UDP或TCP |
| 因特網(wǎng)電話 | 通常專用 | UDP或TCP |
| 網(wǎng)絡(luò)管理 | SNMP | 通常UDP |
| 路由選擇協(xié)議 | RIP | 通常UDP |
| 域名轉(zhuǎn)換 | DNS | 通常UDP |
