1. ARQ自動重傳協(xié)議
自動重傳請求(Automatic Repeat-reQuest),通過使用確認(rèn)和超時這兩個機制,在不可靠服務(wù)的基礎(chǔ)上實現(xiàn)可靠的信息傳輸,其中包括停止等待ARQ協(xié)議和連續(xù)ARQ協(xié)議
1.1 停止等待ARQ
發(fā)送窗口大小為1,接收窗口大小也為1
發(fā)送方每發(fā)送一個數(shù)據(jù)包,就要等待接收方返回ack包,如果在定時時間內(nèi)沒收到ack包,則需要重新發(fā)送,而這個超時時間,是需要經(jīng)過RTT往返時延(從發(fā)送方發(fā)送數(shù)據(jù)開始,到發(fā)送方接收到來自接收方的確認(rèn)消息)來計算出來的。
當(dāng)數(shù)據(jù)正常傳輸時,發(fā)送完M1數(shù)據(jù)包后,等待接收方的M1數(shù)據(jù)包ACK,收到后繼續(xù)發(fā)送M2數(shù)據(jù)包并等待ACK
當(dāng)數(shù)據(jù)傳輸出錯時,假設(shè)數(shù)據(jù)包M1丟失,則一定超時時間后,進行一次重傳。
1.2 連續(xù)ARQ
連續(xù)ARQ發(fā)送方可連續(xù)發(fā)送多個分組的數(shù)據(jù),而不需要像停止等待ARQ一樣,等到應(yīng)答再進行發(fā)送,大大提升帶寬的利用率。
1)滑動窗口概念
滑動窗口協(xié)議在發(fā)送方和接收方之間各自維持一個滑動窗口,兩個窗口大小不一定相同。
主要提供TCP的可靠性(基于確認(rèn)重傳機制)以及TCP的流控特性(控制網(wǎng)絡(luò)傳輸時的流量,避免擁塞發(fā)生)。
滑動窗口其實類似一個收費站,收費站也就是窗口的位置是不變的,數(shù)據(jù)不停的在進行滑動。
2)滑動窗口重發(fā)機制
發(fā)送端維護一個窗口,窗口內(nèi)有多個分組,分組個數(shù)等于窗口的大小,窗口內(nèi)的分組可以直接連續(xù)發(fā)送數(shù)據(jù),不需要等待接收端返回的ACK,這樣可以提升對信道的利用率。
TCP協(xié)議提供兩種滑動窗口協(xié)議:回退(Go-Back-N)以及選擇重傳(Selective Repeat來解決連續(xù)ARQ模式下傳輸數(shù)據(jù)出錯的問題。
1)回退(Go-Back-N)協(xié)議
發(fā)送窗口大小 n > 1,接收窗口 = 1,當(dāng)發(fā)生數(shù)據(jù)丟失時,會重傳所有大于最后一個ACK的包
在這種模式下,發(fā)送端會維護一塊發(fā)送端的數(shù)據(jù)緩存,當(dāng)需要重發(fā)窗口中的分組報文,便會從緩存里讀取數(shù)據(jù)發(fā)送。
這里采用的是累計確認(rèn)的形式,不像停止等待ARQ,現(xiàn)在不需要對數(shù)據(jù)幀進行逐個的確認(rèn),而是對按序到達的最后一個分組進行確認(rèn),假設(shè)發(fā)送方發(fā)送了5個包,但是第三個包丟失,則接收方只返回前兩個包的ACK,此時發(fā)送方因為不知道后面的三個包有沒有發(fā)送成功,只能選擇這三個包進行重傳。
2)選擇重傳(Selective Repeat)協(xié)議
發(fā)送窗口大小 > 1,接收窗口大小 > 1,當(dāng)發(fā)生數(shù)據(jù)丟失,只重傳丟失的數(shù)據(jù)包。
此時已經(jīng)無法依賴ACK包去做選擇重傳了,因為ACK只能表示收到了哪些包,但中間的包丟失時,則無法表示。
所以在這里引入了SACK**(Selective Acknowledgement)**,存儲在TCP頭部的可變選項中,記錄接收窗口緩存中還未收到的數(shù)據(jù)包信息。
具體例子如下:
1.3 總結(jié)
協(xié)議 | 窗口大小 | 是否有序接收 | 具體做法 |
---|---|---|---|
停止等待ARQ | 發(fā)送=1, 接收=1 | 有序 | 發(fā)送窗口每次只能發(fā)送一個數(shù)據(jù)包,然后就停止等待ack包。接收窗口有序的接收數(shù)據(jù)包,接收成功后發(fā)送ack包給發(fā)送窗口,如果收到的數(shù)據(jù)包是無序的,就直接丟棄 |
連續(xù)ARQ-回退協(xié)議 | 發(fā)送 = N,接收 = 1 | 有序 | 發(fā)送窗口每次最多一次性發(fā)送n個數(shù)據(jù)包,接收窗口有序的接收數(shù)據(jù)包,當(dāng)接收到有序的數(shù)據(jù)包后,發(fā)送ack包給發(fā)送窗口,如果收到的數(shù)據(jù)包時無序的,就直接丟棄。當(dāng)數(shù)據(jù)包丟失的時候,會將發(fā)送窗口中的后面的所有數(shù)據(jù)包都重新發(fā)送 |
連續(xù)ARQ-選擇重傳協(xié)議 | 發(fā)送 = N,接收 = N | 無序 | 發(fā)送窗口每次最多一次性發(fā)送n個數(shù)據(jù)包,接收窗口無序的接收數(shù)據(jù)包,當(dāng)接收到數(shù)據(jù)包后,發(fā)送ack包給發(fā)送窗口,ack中會攜帶SACK信息,也就是接收窗口中的緩存信息。發(fā)送端會根據(jù)SACK信息來只重傳丟失的數(shù)據(jù)包 |
2. TCP的流量控制
目的:防止分組丟失進而觸發(fā)自動重傳機制,造成網(wǎng)絡(luò)流量的浪費。
原理:如果發(fā)送者發(fā)送數(shù)據(jù)過快,接收者來不及接收,那么就會有數(shù)據(jù)分組丟失。為了避免這種分組丟失,接收端會通知發(fā)送端它的接收窗口大?。═CP首部中有一個窗口大小值),此時發(fā)送者也將發(fā)送窗口大小更改為這個值,讓接收者來得及接收。
具體案例:假設(shè)一開始主機A和B的窗口都是400,那么在發(fā)送時,主機A會連續(xù)發(fā)送400個字節(jié)的數(shù)據(jù),如果201~300號意外丟失了,主機B會返回響應(yīng)ACK=1,ack=201,rwnd=300,這表示主機B已接收到201號之前的數(shù)據(jù),并將自己的接收窗口設(shè)置為300。此時A收到后將發(fā)送窗口大小也設(shè)置為300,達到流量控制的目的。
3. TCP的擁塞控制
目的:防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,避免出現(xiàn)網(wǎng)絡(luò)負(fù)載過大的情況,常用的算法就是:
慢開始、擁塞避免、快重傳、快恢復(fù)
原理:發(fā)送方維持一個擁塞窗口cwnd(congestion window)的狀態(tài)變量,擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動態(tài)地在變化。另外考慮到接受方的接收能力 發(fā)送方的發(fā)送窗口小于或等于擁塞窗口
3.1 慢開始算法
原理:一開始不發(fā)送大量的數(shù)據(jù),防止網(wǎng)絡(luò)負(fù)載過大,由小到大逐漸增加擁塞窗口的大小,來探測網(wǎng)絡(luò)的擁塞程度
具體案例:發(fā)送方每次經(jīng)過一個傳輸輪次之后,擁塞窗口cwnd就直接加倍,這樣比直接一下把許多報文注入網(wǎng)絡(luò)要慢的多。
3.2 擁塞避免算法
原理:當(dāng)擁塞窗口cwnd到達慢開始門限ssthresh后,讓擁塞窗口緩慢增長,每經(jīng)過一個傳輸輪次后,將cwnd值加一,而不是直接加倍。使cwnd已經(jīng)到達一定值的情況下,網(wǎng)絡(luò)不容易出現(xiàn)阻塞。
慢開始門限ssthresh與擁塞窗口cwnd的關(guān)系:
當(dāng)cwnd<ssthresh時,使用慢開始算法
當(dāng)cwnd>ssthresh時,改用擁塞避免算法
當(dāng)cwnd=ssthresh時,慢開始與擁塞避免算法任意
具體案例:擁塞窗口cwnd初始值為1,慢開始門限ssthresh初始值是16
1)在cwnd<ssthresh,執(zhí)行慢開始算法,cwnd的值在經(jīng)過一個輪次傳輸后值翻倍
2)當(dāng)cwnd>ssthresh,執(zhí)行擁塞避免算法,每一個輪次,cwnd的值只加1
3)當(dāng)cmnd = 24時,假設(shè)發(fā)生網(wǎng)絡(luò)阻塞,將進行”乘法減小“,ssthresh = cwnd / 2,cwnd為0,重新開始慢開始算法
3.3 快重傳算法
原理:快速進行重傳,當(dāng)接收方在收到一個失序的報文段后就立即發(fā)出重復(fù)確認(rèn),發(fā)送方只要一連收到三個重復(fù)確認(rèn)就認(rèn)為是網(wǎng)絡(luò)阻塞,立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設(shè)置的重傳計時器時間到期。(提高網(wǎng)絡(luò)吞吐量百分之20左右)
具體案例:
3.4 快恢復(fù)算法
原理:快速恢復(fù)傳輸,和快重傳搭配使用,當(dāng)發(fā)生快重傳時,進行”乘法減小“算法,此時不會再進行慢開始算法,而是執(zhí)行快恢復(fù)算法,直接將cwnd設(shè)置為ssthresh減半后的值。
具體案例:cwnd為24時,收到三個重復(fù)確認(rèn),則進行快重傳,此時執(zhí)行”乘法減小“算法,ssthresh = cwnd/2,cwnd = ssthresh,直接便開始了擁塞避免算法。文章來源:http://www.zghlxwxcb.cn/news/detail-859018.html
注意:在TCP Reno版本采用快恢復(fù)算法時,慢開始算法只是在TCP連接建立時和網(wǎng)絡(luò)出現(xiàn)超時時才使用,其他例如收到三個重復(fù)的確認(rèn),則會執(zhí)行快恢復(fù)算法。文章來源地址http://www.zghlxwxcb.cn/news/detail-859018.html
到了這里,關(guān)于網(wǎng)絡(luò)編程——TCP的特性之自動重傳/流量控制/擁塞控制,一篇說清楚的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!