TCP要解決一個很大的事,那就是要在一個網(wǎng)絡(luò)根據(jù)不同的情況來動態(tài)調(diào)整自己的發(fā)包的速度希柿,小則讓自己的連接更穩(wěn)定呀袱,大則讓整個網(wǎng)絡(luò)更穩(wěn)定。
TCP的RTT算法
從前面的TCP重傳機(jī)制我們知道Timeout的設(shè)置對于重傳非常重要炎码。
- 設(shè)長了,重發(fā)就慢秋泳,丟了老半天才重發(fā)潦闲,沒有效率,性能差迫皱;
- 設(shè)短了歉闰,會導(dǎo)致可能并沒有丟就重發(fā)。于是重發(fā)的就快卓起,會增加網(wǎng)絡(luò)擁塞和敬,導(dǎo)致更多的超時,更多的超時導(dǎo)致更多的重發(fā)戏阅。
而且昼弟,這個超時時間在不同的網(wǎng)絡(luò)的情況下,根本沒有辦法設(shè)置一個死的值奕筐。只能動態(tài)地設(shè)置舱痘。 為了動態(tài)地設(shè)置,TCP引入了RTT——Round Trip Time离赫,也就是一個數(shù)據(jù)包從發(fā)出去到回來的時間芭逝。這樣發(fā)送端就大約知道需要多少的時間,從而可以方便地設(shè)置Timeout——RTO(Retransmission TimeOut)渊胸,以讓我們的重傳機(jī)制更高效旬盯。 聽起來似乎很簡單,好像就是在發(fā)送端發(fā)包時記下t0,然后接收端再把這個ack回來時再記一個t1胖翰,于是RTT = t1 – t0频丘。沒那么簡單,這只是一個采樣泡态,不能代表普遍情況搂漠。
TCP滑動窗口
需要說明一下,如果你不了解TCP的滑動窗口這個事某弦,你等于不了解TCP協(xié)議桐汤。我們都知道,TCP必需要解決的可靠傳輸以及包亂序(reordering)的問題靶壮,所以怔毛,TCP必需要知道網(wǎng)絡(luò)實(shí)際的數(shù)據(jù)處理帶寬或是數(shù)據(jù)處理速度,這樣才不會引起網(wǎng)絡(luò)擁塞腾降,導(dǎo)致丟包拣度。
所以,TCP引入了一些技術(shù)和設(shè)計來做網(wǎng)絡(luò)流控螃壤,Sliding Window是其中一個技術(shù)抗果。 前面我們說過,
**TCP頭里有一個字段叫Window奸晴,又叫Advertised-Window冤馏,這個字段是接收端告訴發(fā)送端自己還有多少緩沖區(qū)可以接收數(shù)據(jù)。于是發(fā)送端就可以根據(jù)這個接收端的處理能力來發(fā)送數(shù)據(jù)寄啼,而不會導(dǎo)致接收端處理不過來逮光。 **
TCP的擁塞處理 – Congestion Handling
擁塞控制主要是四個算法:
- 1)慢啟動,
- 2)擁塞避免墩划,
- 3)擁塞發(fā)生涕刚,
- 4)快速恢復(fù)。