在計(jì)算機(jī)網(wǎng)絡(luò)通信運(yùn)輸層扮演的角色就是保證數(shù)據(jù)包的可靠性愉豺,即數(shù)據(jù)包的完整性及數(shù)據(jù)的發(fā)送順序性
網(wǎng)絡(luò)層與運(yùn)輸層的關(guān)系與差異
網(wǎng)絡(luò)層
在五層模型中網(wǎng)絡(luò)層位于運(yùn)輸層之下篓吁,它提供的是不同鏈路的主機(jī)與主機(jī)之間交付數(shù)據(jù)的IP服務(wù),IP是不可靠的服務(wù)蚪拦,即不保證數(shù)據(jù)的完整性和有序性杖剪,只負(fù)責(zé)主機(jī)和主機(jī)之間的數(shù)據(jù)傳輸,在網(wǎng)絡(luò)層傳輸?shù)臄?shù)據(jù)稱之為數(shù)據(jù)報(bào)驰贷。IP地址是網(wǎng)絡(luò)層主機(jī)的唯一標(biāo)識(shí)盛嘿,網(wǎng)絡(luò)層能夠跨越不同的數(shù)據(jù)鏈路,在不同的數(shù)據(jù)鏈路之間實(shí)現(xiàn)IP數(shù)據(jù)包的傳遞括袒,這一跨越數(shù)據(jù)鏈路的過(guò)程主要依靠路由控制實(shí)現(xiàn)次兆,而路由控制通過(guò)對(duì)IP的多跳路由將數(shù)據(jù)包跳到相應(yīng)被轉(zhuǎn)發(fā)的路徑,經(jīng)過(guò)多次路由跳到達(dá)目的地锹锰,這個(gè)過(guò)程又要依賴路由器的路由表芥炭,它記錄了下一步IP數(shù)據(jù)該轉(zhuǎn)發(fā)給哪個(gè)路由器運(yùn)輸層
運(yùn)輸層主要負(fù)責(zé)從網(wǎng)絡(luò)層接收?qǐng)?bào)文段實(shí)現(xiàn)不同主機(jī)上的進(jìn)程之間的通信痢士。
在發(fā)送端彪薛,它將應(yīng)用程序進(jìn)程接收的報(bào)文轉(zhuǎn)換成運(yùn)輸層分組,運(yùn)輸層分組簡(jiǎn)稱報(bào)文段良瞧,實(shí)現(xiàn)方法是將應(yīng)用報(bào)文切分成小塊并加上運(yùn)輸層首部就生成了運(yùn)輸層報(bào)文段陪汽。然后將報(bào)文段傳遞給網(wǎng)絡(luò)層。
在接收端褥蚯,網(wǎng)絡(luò)層將數(shù)據(jù)包提取運(yùn)輸層報(bào)文段挚冤,將其交給運(yùn)輸層,運(yùn)輸層再將其發(fā)送給應(yīng)用進(jìn)程使用赞庶。
在運(yùn)輸層主要依賴的兩種協(xié)議分別是UDP和TCP,兩種協(xié)議的最基本任務(wù)就是將主機(jī)端的IP交付服務(wù)擴(kuò)展為進(jìn)程間的交付服務(wù)训挡,這種擴(kuò)展就是運(yùn)輸層的多路復(fù)用和多路分解
多路復(fù)用和多路分解
套接字:一個(gè)進(jìn)程有一個(gè)或者多個(gè)套接字用于接收和發(fā)送數(shù)據(jù)包
多路復(fù)用:多路復(fù)用主要是收集各個(gè)進(jìn)程的套接字中產(chǎn)生的數(shù)據(jù)塊澳骤,并且為每個(gè)數(shù)據(jù)塊加上首部信息形成報(bào)文段,然后將其傳遞到網(wǎng)絡(luò)層中澜薄。
多路分解:多路分解主要是負(fù)責(zé)將運(yùn)輸層的數(shù)據(jù)交付到正確的進(jìn)程套接字中
無(wú)連接運(yùn)輸:UDP
UDP是面向無(wú)連接为肮,不可靠的運(yùn)輸協(xié)議,除了最基本的多路復(fù)用肤京、多路分解及差錯(cuò)檢測(cè)外颊艳,幾乎沒(méi)有對(duì)IP數(shù)據(jù)包增加別的東西。UDP從應(yīng)用程序得到數(shù)據(jù)后忘分,附加上多路復(fù)用和多路分解的源端口號(hào)和目的端口號(hào)后形成報(bào)文段交給網(wǎng)絡(luò)層棋枕,網(wǎng)絡(luò)再將其封裝到IP數(shù)據(jù)報(bào)中,將其發(fā)送給接收的主機(jī)妒峦,達(dá)到主機(jī)后UDP使用報(bào)文段中的端口號(hào)將其交付給相應(yīng)的應(yīng)用進(jìn)程重斑,使用UDP的過(guò)程沒(méi)有經(jīng)過(guò)任何的握手,因此UDP是無(wú)連接的肯骇。DNS就是典型的UDP協(xié)議的應(yīng)用窥浪,還有實(shí)時(shí)視頻,網(wǎng)絡(luò)語(yǔ)言電話等流式多媒體音頻應(yīng)用也是使用UDP,原因在于UDP性能較高笛丙,并且這類應(yīng)用能容忍少量的數(shù)據(jù)包丟失漾脂。面向連接運(yùn)輸:TCP
TCP是面向連接的可靠的傳輸協(xié)議,即保證數(shù)據(jù)不會(huì)受到損壞或者丟失胚鸯,并且能按照發(fā)送順序交付符相,它主要通過(guò)三次握手、重傳控制蠢琳、擁塞控制、滑動(dòng)窗口等機(jī)制保證數(shù)據(jù)傳輸?shù)目煽啃?/p>
三次握手
理解三次握手先需要明白TCP報(bào)文段各個(gè)字段的含義:- 源端口和目的端口:寫(xiě)入源和發(fā)送目的地的應(yīng)用程序端口號(hào)
- 序號(hào)(Seq):TCP連接中傳送的字節(jié)流中的字節(jié)都是按照順序去編號(hào)的镜豹,報(bào)文段中Seq是這個(gè)報(bào)文段的字節(jié)流的首個(gè)字節(jié)編號(hào)
- 數(shù)據(jù)偏移:首部長(zhǎng)度實(shí)際上指示了數(shù)據(jù)區(qū)在報(bào)文段中的起始偏移值
- 確認(rèn)號(hào)(ack):期望收到下一個(gè)報(bào)文的數(shù)據(jù)流的首個(gè)字節(jié)編號(hào)傲须。
- 窗口:告知接收端的緩存大小,以此控制發(fā)送端的發(fā)送速率趟脂,達(dá)到控制流量的效果
- 檢驗(yàn)和:奇偶檢驗(yàn)和泰讽,校驗(yàn)包是否有誤
- TCP flags每一個(gè)標(biāo)志位表示一個(gè)控制功能:
- URG: 緊急指針標(biāo)志 1->有效 0->忽略
- ACK:確認(rèn)號(hào)標(biāo)志 1->有效 0->報(bào)文不含確認(rèn)號(hào)信息,忽略確認(rèn)號(hào)
- PSH:push標(biāo)志 1->push標(biāo)志有效昔期,表面接收方接收后應(yīng)對(duì)盡快交給應(yīng)用程序 0->忽略
- RST:重置連接標(biāo)志
- SYN:同步序號(hào)已卸,用于建立連接過(guò)程,syn=1->建立請(qǐng)求或接受請(qǐng)求:syn=1并且ack=0時(shí)建立連接請(qǐng)求,SYN=1并且ACK=1時(shí)雙方接受連接(這里畫(huà)重點(diǎn)硼一,下面TCP三次握手會(huì)多次使用)
- FIN:釋放連接 1->發(fā)送方已經(jīng)沒(méi)有數(shù)據(jù)可發(fā)送累澡,關(guān)閉本方數(shù)據(jù)流 0->連接仍然存在
TCP連接的建立時(shí),雙方需要經(jīng)過(guò)三次握手般贼,具體過(guò)程如下:
(1)第一次握手:Client進(jìn)入SYN_SENT狀態(tài)愧哟,發(fā)送一個(gè)的報(bào)文段中SYN=1表示請(qǐng)求建立連接奥吩,seq=x表示本次發(fā)送的字節(jié)流中首個(gè)字節(jié)的編號(hào),第一次握手是不攜帶數(shù)據(jù)的蕊梧,所以服務(wù)端下次肯定會(huì)響應(yīng)ack=x+1
(2)第二次握手:Server端在收到SYN幀之后霞赫,會(huì)進(jìn)入SYN_RCVD狀態(tài),同時(shí)響應(yīng)報(bào)文段中 ack=x+1表示希望下次收到x+1的首字節(jié)編號(hào)的報(bào)文段,服務(wù)端的報(bào)文段中字節(jié)流中首個(gè)字節(jié)的編號(hào) seq=y,ACK=1表示本次響應(yīng)是有效應(yīng)答,本次為響應(yīng)連接請(qǐng)求所以SYN=1
(3)第三次握手:Client在收到Server的第二次握手SYN+ACK確認(rèn)幀之后肥矢,首先將自己的狀態(tài)會(huì)從SYN_SENT變成ESTABLISHED端衰,表示自己方向的連接通道已經(jīng)建立成功,Client可以發(fā)送數(shù)據(jù)給Server端了甘改。然后旅东,Client響應(yīng)報(bào)文段中第一次握手發(fā)送報(bào)文段已經(jīng)消耗了一個(gè)字節(jié)所以 seq=x+1,第二次握手中客戶端已經(jīng)收到了y編號(hào)的字節(jié)下次希望接收y+1的首字節(jié)編號(hào)的報(bào)文段所以ack=y+1,ACK=1表示有效應(yīng)答
(4)Server端在收到Client的ACK幀之后,會(huì)從SYN_RCVD狀態(tài)會(huì)進(jìn)入ESTABLISHED狀態(tài)楼誓,至此玉锌,Server方向的通道連接建立成功,Server可以發(fā)送數(shù)據(jù)給Client疟羹,TCP的全雙工連接建立完成主守。
報(bào)文段的長(zhǎng)度MSS
MSS報(bào)文段的最大消息長(zhǎng)度,在三次握手時(shí)兩端會(huì)將自己能接收的MSS寫(xiě)進(jìn)TCP報(bào)文段首部中榄融,兩者之間選擇最小的参淫,建立連接后傳輸?shù)臄?shù)據(jù)會(huì)以MSS進(jìn)行分割發(fā)送
重傳控制
正常情況接收端會(huì)按照發(fā)送端發(fā)送報(bào)文段的序列號(hào)和數(shù)據(jù)長(zhǎng)度,響應(yīng)ack的報(bào)文段愧杯,確認(rèn)應(yīng)答號(hào)(ack)=系列號(hào)(seq)+數(shù)據(jù)長(zhǎng)度(MSS)對(duì)于消息丟失有以下幾種措施
1力九、超時(shí)重傳與超時(shí)間隔加倍
發(fā)送端在特定時(shí)間內(nèi)沒(méi)有收到接收端響應(yīng)則會(huì)進(jìn)行重發(fā)耍铜,這個(gè)特定時(shí)間在不同的網(wǎng)絡(luò)環(huán)境會(huì)有所不同,如果發(fā)送端重發(fā)了報(bào)文段跌前,依舊沒(méi)有收到響應(yīng)棕兼,接收端會(huì)將超時(shí)時(shí)間加倍,每一次重傳都會(huì)將超時(shí)間加倍抵乓,直至超過(guò)一定的次數(shù)還未收到響應(yīng)就會(huì)將連接斷開(kāi)
2伴挚、高速重傳
在重傳的過(guò)程中接收到會(huì)多次接收到相同的報(bào)文段,接收端會(huì)根據(jù)序列號(hào)判斷是否需要接收該報(bào)文段灾炭,避免重發(fā)接收導(dǎo)致的丟棄動(dòng)作
流量控制
窗口控制
TCP發(fā)送端每發(fā)一個(gè)報(bào)文段茎芋,就要等待確認(rèn)接收端的響應(yīng),這樣的效率比較低下蜈出,為了解決這個(gè)問(wèn)題引進(jìn)了窗口的概念田弥。在窗口大小內(nèi),發(fā)送端無(wú)須等待確認(rèn)接收端的響應(yīng)滑動(dòng)窗口
滑動(dòng)窗口內(nèi)的數(shù)據(jù)都是未被響應(yīng)的數(shù)據(jù)煤杀,滑動(dòng)窗口以外是為發(fā)送或者已被響應(yīng)的數(shù)據(jù),下面是具體滑動(dòng)窗口的控制詳細(xì)圖:窗口控制下的重傳機(jī)制
假設(shè)發(fā)送端發(fā)送了1,2,3這三個(gè)報(bào)文段沪哺,接收端響應(yīng)時(shí)1,2的響應(yīng)報(bào)文段都丟失了沈自,而3響應(yīng)到達(dá)了發(fā)送端,那么也發(fā)送端知道接收已經(jīng)積累了1,2,3的報(bào)文段辜妓,就無(wú)須重發(fā)1,2的報(bào)文段了枯途,這種方式叫累計(jì)確認(rèn)或累計(jì)應(yīng)答。擁塞控制
慢啟動(dòng)
有了窗口籍滴,收發(fā)主機(jī)之間可以連續(xù)發(fā)送大量的數(shù)據(jù)酪夷,但是有些時(shí)候網(wǎng)絡(luò)會(huì)成為收發(fā)數(shù)據(jù)的瓶頸,因?yàn)楦鞣N原因網(wǎng)絡(luò)不好而出現(xiàn)擁塞孽惰,這時(shí)如果還大量的發(fā)送數(shù)據(jù)可能會(huì)造成網(wǎng)絡(luò)癱瘓晚岭,TCP使用慢啟動(dòng)去控制發(fā)送數(shù)量
在建立連接后擁塞窗口cwnd的值被設(shè)置為1,代表著每次只能發(fā)一個(gè)報(bào)文段勋功,每次成收到一次確認(rèn)應(yīng)答后坦报,cwnd都會(huì)加1,每次發(fā)送報(bào)文段時(shí)將會(huì)與接收端的滑動(dòng)窗口大小做比較,選擇較小的作為發(fā)送窗口狂鞋。隨著包的往返片择,窗口將會(huì)以1,2,4,8...成倍的增加TCP以這種方式,讓通信開(kāi)始時(shí)網(wǎng)絡(luò)吞吐量能逐漸上升祭刚,遇到網(wǎng)絡(luò)擁塞時(shí)又能逐漸下降牌捷,而后又逐漸上升,TCP吞吐量能逐漸占據(jù)寬帶