TCP的计时器
TCP在建立連接后會(huì)啟動(dòng)四個(gè)定時(shí)器:
重傳計(jì)時(shí)器:Retransmission Timer?
堅(jiān)持計(jì)時(shí)器:Persistent Timer?
保活計(jì)時(shí)器:Keeplive Timer?
2MSL定時(shí)器:Time_Wait Timer
1、重傳計(jì)時(shí)器?
TCP的發(fā)送方?jīng)]有在規(guī)定的時(shí)間內(nèi)收到確認(rèn)就要重傳已發(fā)送的報(bào)文段。這種重傳概念很容易理解,但重傳時(shí)間的選擇卻不簡(jiǎn)單。?
如果吧超時(shí)重傳的時(shí)間這是的太短,就會(huì)引起很多報(bào)文段不必要的重傳,是網(wǎng)絡(luò)負(fù)荷量增加。但若設(shè)置的太長(zhǎng),使網(wǎng)絡(luò)的空閑時(shí)間增大,降低了傳輸效率。?
TCP采用了一種自適應(yīng)算法,它記錄每一個(gè)報(bào)文段發(fā)出的時(shí)間,以及收到相應(yīng)的確認(rèn)的時(shí)間,這兩個(gè)時(shí)間差就是豹紋的往返時(shí)間RTT。?
重傳時(shí)間 = 2*RTT;?
RTT是動(dòng)態(tài)計(jì)算的:?
RTT=舊的 RTT*i + (1-i)*當(dāng)前RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上當(dāng)前RTT值的10%?
Kam算法:在計(jì)算加權(quán)平均RTTs時(shí),只要報(bào)文重傳了,就不在采用其往返時(shí)間樣本。?
2、堅(jiān)持計(jì)時(shí)器?
堅(jiān)持定時(shí)器是使用在一方滑動(dòng)窗口為0之后,另外一方停止傳輸數(shù)據(jù),進(jìn)入堅(jiān)持定時(shí)器的輪詢,直到滑動(dòng)窗口不再為0了。?
首先是滑動(dòng)窗口,可以簡(jiǎn)單理解為緩沖區(qū)剩余空間大小。不管是寫(xiě)緩沖還是讀緩沖,一旦一方通告了自己的滑動(dòng)窗口大小,另外一方就會(huì)根據(jù)滑動(dòng)窗口大小傳遞窗口大小的數(shù)據(jù)了。但是,當(dāng)被通告,一方的滑動(dòng)窗口大小為0的時(shí)候,另外一方就會(huì)啟動(dòng)堅(jiān)持定時(shí)器,基本也是使用TCP指數(shù)退避方法,第一次1.5秒,第二次1.5x2秒,第三次1.5x4…?
其次是糊涂窗口綜合癥。這個(gè)癥狀是滑動(dòng)窗口引起的。病因是發(fā)送方和接收方在一個(gè)很小的滑動(dòng)窗口的時(shí)候就開(kāi)始數(shù)據(jù)傳輸,傳輸結(jié)束之后,讀寫(xiě)的消費(fèi)速度也并沒(méi)有那么快,導(dǎo)致下次傳輸?shù)臅r(shí)候,滑動(dòng)窗口還是那么小。然后現(xiàn)象就是每次傳輸?shù)臄?shù)據(jù)都非常小。就好比每次開(kāi)出去的火車(chē)載貨量只有一節(jié)車(chē)廂,其實(shí)我們是希望能攢夠n節(jié)車(chē)廂才開(kāi)始傳輸。?
糊涂窗口綜合癥有解決辦法,還不止一種,在接收方或者發(fā)送方都可以解決。大致就是如果接收方解決,那么接收方在接收窗口小于一定大小的時(shí)候,對(duì)所有的接收請(qǐng)求都返回窗口為0的包,來(lái)觸發(fā)另外一方的堅(jiān)持定時(shí)器。同樣發(fā)送方也是,在可以發(fā)送的數(shù)據(jù)大于一定窗口的時(shí)候才發(fā)送。
3、保活計(jì)時(shí)器?
每當(dāng)服務(wù)器收到客戶的信息,就將keeplive timer復(fù)位,超時(shí)通常設(shè)置2小時(shí),若服務(wù)器超過(guò)2小時(shí)還沒(méi)有收到來(lái)自客戶的信息,就發(fā)送探測(cè)報(bào)文段,若發(fā)送了10個(gè)探測(cè)報(bào)文段(每75秒發(fā)送一個(gè))還沒(méi)收到響應(yīng),則終止連接。
4、2MSL定時(shí)器?
MSL是報(bào)文段最大生存時(shí)間(Maximum Segment Lifetime),設(shè)置這個(gè)定時(shí)器有兩個(gè)目的其一是為了測(cè)量連接處于TIME_WAIT狀態(tài)的時(shí)間.這樣可以讓TCP再次發(fā)送最后的ACK以防止這個(gè)ACK丟失(如果丟失,另一端會(huì)重傳FIN)。其二,為允許老的重復(fù)分節(jié)在網(wǎng)絡(luò)中消逝。具體可以解釋為,如果一個(gè)TCP連接在斷開(kāi)之前有迷途分節(jié)尚未消逝,在斷開(kāi)該TCP連接之后立刻重啟一個(gè)同樣的連接(雙方的IP地址和端口port相同),這時(shí)之前的迷途的老分節(jié)可能對(duì)新的新的TCP連接接收,從而造成未定義的錯(cuò)誤。為了避免這種情況,TCP規(guī)定在TIME_WAIT狀態(tài),不能啟動(dòng)一個(gè)連接的化身。既然TIME_WAIT狀態(tài)維持2MSL,這就保證了一個(gè)連接上的分組及其應(yīng)該在2MSL內(nèi)都會(huì)消失。
總結(jié)
- 上一篇: 端口的分类
- 下一篇: URG与PSH的联系和区别