TCP通過在發(fā)送時(shí)設(shè)置一個(gè)定時(shí)器來解決數(shù)據(jù)和確認(rèn)可能丟失的情況俱两。如果定時(shí)器溢出時(shí)還沒有收到確認(rèn),那么它就重傳該數(shù)據(jù)曹步。
對(duì)于每個(gè)連接宪彩,TCP管理4個(gè)不同的定時(shí)器:
- 重傳定時(shí)器用于當(dāng)希望收到另一端的確認(rèn)。
- 堅(jiān)持定時(shí)器使窗口大小信息保持不斷流動(dòng)讲婚。
- 蹦蚩祝活定時(shí)器檢測到一個(gè)空閑連接的另一端何時(shí)崩潰或重啟。
- 2MSL定時(shí)器測量一個(gè)連接處于TIME_WAIT狀態(tài)的時(shí)間。
擁塞避免算法
慢啟動(dòng)算法是在一個(gè)連接上發(fā)起數(shù)據(jù)流的方法活合,但有時(shí)我們會(huì)到達(dá)中間路由器的極限雏婶,此時(shí)分組就被丟棄。需要擁塞避免算法來處理丟棄分組芜辕。
該算法假定由于分組受到損壞引起的丟失是非常少的尚骄,因此分組丟失就意味著在某處網(wǎng)絡(luò)上發(fā)送了擁塞:發(fā)生超時(shí)和接收到重復(fù)的確認(rèn)。
擁塞避免算法和慢啟動(dòng)算法需要對(duì)每個(gè)連接維持兩個(gè)變量:一個(gè)擁塞窗口cwnd侵续,一個(gè)慢啟動(dòng)門限ssthresh倔丈。
- 對(duì)一個(gè)連接,初始化cwnd為1個(gè)報(bào)文段状蜗,ssthresh為65535個(gè)字節(jié)需五。
- 當(dāng)擁塞發(fā)生時(shí),ssthresh被設(shè)置為當(dāng)前窗口大小的一半(cwnd和通告窗口大小之間的最小值的一半)轧坎。若是超時(shí)引起了擁塞宏邮,則cwnd被設(shè)置為1個(gè)報(bào)文段。
- 當(dāng)新的數(shù)據(jù)被對(duì)方確認(rèn)后缸血,就增加cwnd蜜氨,增加的方法取決于我們是否正在進(jìn)行慢啟動(dòng)或擁塞避免。如果cwnd小于等于ssthresh捎泻,則正在進(jìn)行慢啟動(dòng)飒炎,否則就正在進(jìn)行擁塞避免。慢啟動(dòng)算法初始化cwnd為1個(gè)報(bào)文段笆豁,之后每收到一個(gè)確認(rèn)就加1.擁塞避免算法要求每收到一個(gè)確認(rèn)把cwnd增加1/cwnd
快速重傳和快速恢復(fù)算法
快速重傳算法:如果一連串收到3個(gè)或3個(gè)以上的重復(fù)ACK郎汪,就非常可能是一個(gè)報(bào)文段丟失了闯狱。于是就重傳丟失的數(shù)據(jù)報(bào)文段煞赢,而無需等待超時(shí)定時(shí)器溢出。
當(dāng)收到第3個(gè)重復(fù)的ACK時(shí)哄孤,將ssthresh設(shè)置為當(dāng)前擁塞窗口cwnd的一半照筑。重傳丟失的報(bào)文段。設(shè)置cwnd為ssthresh+3倍報(bào)文段大小瘦陈。
每次收到另一個(gè)重復(fù)的ACK時(shí)朦肘,cwnd增加1個(gè)報(bào)文段大小并發(fā)送1個(gè)分組。
當(dāng)下一個(gè)確認(rèn)新數(shù)據(jù)的ACK到達(dá)時(shí)双饥,設(shè)置cwnd為ssthresh。
當(dāng)TCP超時(shí)重傳時(shí)弟断,它不一定要重傳同樣的報(bào)文段咏花,TCP允許進(jìn)行重新分組而發(fā)送一個(gè)較大的報(bào)文段。