TCP協(xié)議作為一個(gè)可靠的面向流的傳輸協(xié)議雅潭,其可靠性和流量控制由滑動(dòng)窗口協(xié)議保證鸽凶,而擁塞控制則由控制窗口結(jié)合一系列的控制算法實(shí)現(xiàn)笤休。
一奏甫、滑動(dòng)窗口協(xié)議
關(guān)于這部分自己不曉得怎么敘述才好戈轿,因?yàn)槔斫獾牟糠指啵旅婢陀米约旱睦斫鈦斫榻B下TCP的精髓:滑動(dòng)窗口協(xié)議阵子。 所謂滑動(dòng)窗口協(xié)議思杯,自己理解有兩點(diǎn):1. “窗口”對(duì)應(yīng)的是一段可以被發(fā)送者發(fā)送的字節(jié)序列,其連續(xù)的范圍稱之為“窗口”挠进;2. “滑動(dòng)”則是指這段“允許發(fā)送的范圍”是可以隨著發(fā)送的過程而變化的色乾,方式就是按順序“滑動(dòng)”。在引入一個(gè)例子來說這個(gè)協(xié)議之前领突,我覺得很有必要先了解以下前提:-1. TCP協(xié)議的兩端分別為發(fā)送者A和接收者B暖璧,由于是全雙工協(xié)議,因此A和B應(yīng)該分別維護(hù)著一個(gè)獨(dú)立的發(fā)送緩沖區(qū)和接收緩沖區(qū)君旦,由于對(duì)等性(A發(fā)B收和B發(fā)A收)澎办,我們以A發(fā)送B接收的情況作為例子;-2. 發(fā)送窗口是發(fā)送緩存中的一部分金砍,是可以被TCP協(xié)議發(fā)送的那部分局蚀,其實(shí)應(yīng)用層需要發(fā)送的所有數(shù)據(jù)都被放進(jìn)了發(fā)送者的發(fā)送緩沖區(qū);-3. 發(fā)送窗口中相關(guān)的有四個(gè)概念:已發(fā)送并收到確認(rèn)的數(shù)據(jù)(不再發(fā)送窗口和發(fā)送緩沖區(qū)之內(nèi))捞魁、已發(fā)送但未收到確認(rèn)的數(shù)據(jù)(位于發(fā)送窗口之中)至会、允許發(fā)送但尚未發(fā)送的數(shù)據(jù)以及發(fā)送窗口外發(fā)送緩沖區(qū)內(nèi)暫時(shí)不允許發(fā)送的數(shù)據(jù);-4. 每次成功發(fā)送數(shù)據(jù)之后谱俭,發(fā)送窗口就會(huì)在發(fā)送緩沖區(qū)中按順序移動(dòng),將新的數(shù)據(jù)包含到窗口中準(zhǔn)備發(fā)送宵蛀; TCP建立連接的初始昆著,B會(huì)告訴A自己的接收窗口大小,比如為‘20’: 字節(jié)31-50為發(fā)送窗口
**二脓豪、流量控制 **
流量控制方面主要有兩個(gè)要點(diǎn)需要掌握巷帝。一是TCP利用滑動(dòng)窗口實(shí)現(xiàn)流量控制的機(jī)制;二是如何考慮流量控制中的傳輸效率扫夜。
- 流量控制
所謂流量控制楞泼,主要是接收方傳遞信息給發(fā)送方,使其不要發(fā)送數(shù)據(jù)太快笤闯,是一種端到端的控制堕阔。主要的方式就是返回的ACK中會(huì)包含自己的接收窗口的大小,并且利用大小來控制發(fā)送方的數(shù)據(jù)發(fā)送: - 傳遞效率
一個(gè)顯而易見的問題是:單個(gè)發(fā)送字節(jié)單個(gè)確認(rèn),和窗口有一個(gè)空余即通知發(fā)送方發(fā)送一個(gè)字節(jié)辫封,無疑增加了網(wǎng)絡(luò)中的許多不必要的報(bào)文(請(qǐng)想想為了一個(gè)字節(jié)數(shù)據(jù)而添加的40字節(jié)頭部吧O跬鳌),所以我們的原則是盡可能一次多發(fā)送幾個(gè)字節(jié)倦微,或者窗口空余較多的時(shí)候通知發(fā)送方一次發(fā)送多個(gè)字節(jié)妻味。對(duì)于前者我們廣泛使用Nagle算法,即:1. 若發(fā)送應(yīng)用進(jìn)程要把發(fā)送的數(shù)據(jù)逐個(gè)字節(jié)地送到TCP的發(fā)送緩存欣福,則發(fā)送方就把第一個(gè)數(shù)據(jù)字節(jié)先發(fā)送出去责球,把后面的字節(jié)先緩存起來;2. 當(dāng)發(fā)送方收到第一個(gè)字節(jié)的確認(rèn)后(也得到了網(wǎng)絡(luò)情況和對(duì)方的接收窗口大小)雏逾,再把緩沖區(qū)的剩余字節(jié)組成合適大小的報(bào)文發(fā)送出去嘉裤;*3. 當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到發(fā)送窗口大小的一半或以達(dá)到報(bào)文段的最大長度時(shí),就立即發(fā)送一個(gè)報(bào)文段栖博; 對(duì)于后者我們往往的做法是讓接收方等待一段時(shí)間屑宠,或者接收方獲得足夠的空間容納一個(gè)報(bào)文段或者等到接受緩存有一半空閑的時(shí)候,再通知發(fā)送方發(fā)送數(shù)據(jù)笛匙。三侨把、擁塞控制 網(wǎng)絡(luò)中的鏈路容量和交換結(jié)點(diǎn)中的緩存和處理機(jī)都有著工作的極限,當(dāng)網(wǎng)絡(luò)的需求超過它們的工作極限時(shí)妹孙,就出現(xiàn)了擁塞秋柄。擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載蠢正。
常用的方法就是:1. 慢開始骇笔、擁塞控制 2. 快重傳、快恢復(fù) 一切的基礎(chǔ)還是慢開始嚣崭,這種方法的思路是這樣的:-1. 發(fā)送方維持一個(gè)叫做“擁塞窗口”的變量笨触,該變量和接收端口共同決定了發(fā)送者的發(fā)送窗口;-2. 當(dāng)主機(jī)開始發(fā)送數(shù)據(jù)時(shí)雹舀,避免一下子將大量字節(jié)注入到網(wǎng)絡(luò)芦劣,造成或者增加擁塞,選擇發(fā)送一個(gè)1字節(jié)的試探報(bào)文说榆;-3. 當(dāng)收到第一個(gè)字節(jié)的數(shù)據(jù)的確認(rèn)后虚吟,就發(fā)送2個(gè)字節(jié)的報(bào)文;-4. 若再次收到2個(gè)字節(jié)的確認(rèn)签财,則發(fā)送4個(gè)字節(jié)串慰,依次遞增2的指數(shù)級(jí);-5. 最后會(huì)達(dá)到一個(gè)提前預(yù)設(shè)的“慢開始門限”唱蒸,比如24邦鲫,即一次發(fā)送了24個(gè)分組,此時(shí)遵循下面的條件判定:1. cwnd < ssthresh神汹, 繼續(xù)使用慢開始算法庆捺;2. cwnd > ssthresh,停止使用慢開始算法屁魏,改用擁塞避免算法疼燥;3. cwnd = ssthresh,既可以使用慢開始算法蚁堤,也可以使用擁塞避免算法;-6. 所謂擁塞避免算法就是:每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口+1,即讓擁塞窗口緩慢地增大披诗,按照線性規(guī)律增長撬即;-7. 當(dāng)出現(xiàn)網(wǎng)絡(luò)擁塞,比如丟包時(shí)呈队,將慢開始門限設(shè)為原先的一半剥槐,然后將cwnd設(shè)為1,執(zhí)行慢開始算法(較低的起點(diǎn)宪摧,指數(shù)級(jí)增長)粒竖;
上述方法的目的是在擁塞發(fā)生時(shí)循序減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠的時(shí)間把隊(duì)列中積壓的分組處理完畢几于。慢開始和擁塞控制算法常常作為一個(gè)整體使用蕊苗,而快重傳和快恢復(fù)則是為了減少因?yàn)閾砣麑?dǎo)致的數(shù)據(jù)包丟失帶來的重傳時(shí)間,從而避免傳遞無用的數(shù)據(jù)到網(wǎng)絡(luò)沿彭⌒嗯椋快重傳的機(jī)制是:-1. 接收方建立這樣的機(jī)制,如果一個(gè)包丟失喉刘,則對(duì)后續(xù)的包繼續(xù)發(fā)送針對(duì)該包的重傳請(qǐng)求瞧柔;-2. 一旦發(fā)送方接收到三個(gè)一樣的確認(rèn),就知道該包之后出現(xiàn)了錯(cuò)誤睦裳,立刻重傳該包造锅;-3. 此時(shí)發(fā)送方開始執(zhí)行“快恢復(fù)”算法:1. 慢開始門限減半;2. cwnd設(shè)為慢開始門限減半后的數(shù)值廉邑;3. 執(zhí)行擁塞避免算法(高起點(diǎn)哥蔚,線性增長);