日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【转】TCP/IP协议--TCP的超时和重传

發(fā)布時(shí)間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】TCP/IP协议--TCP的超时和重传 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  TCP是可靠傳輸??煽恐惑w現(xiàn)在收到數(shù)據(jù)后,返回去一個(gè)確認(rèn)。但是不能完全避免的是,數(shù)據(jù)和確認(rèn)都可能丟失。解決這個(gè)辦法就是,提供一個(gè)發(fā)送的重傳定時(shí)器:如果定時(shí)器溢出時(shí)還沒收到確認(rèn),它就重傳這個(gè)報(bào)文段。

想法是完美的,關(guān)鍵之處在于超時(shí)和重傳的策略,即怎么決定超時(shí)間隔和如何確定重傳的頻率。

書中舉了一個(gè)簡(jiǎn)單的超時(shí)重傳例子:

如圖:

比如A往B傳,傳了一部分?jǐn)?shù)據(jù)后,把B的網(wǎng)線拔了(前邊講過,如果不傳數(shù)據(jù)的話,雙方?jīng)]法知道這個(gè)連接已經(jīng)斷了)。然后開始A再給B發(fā)數(shù)據(jù),此時(shí)tcpdump出來發(fā)現(xiàn),連續(xù)重傳了一個(gè)報(bào)文段:時(shí)間間隔分別是,1.013s, 3, 6, 12, 24 和多個(gè)64s...最后發(fā)了個(gè)復(fù)位報(bào)文段表示我放棄了。。(從第一次開始發(fā)這個(gè)報(bào)文段,到最后發(fā)一個(gè)復(fù)位段的時(shí)間差大約是9分鐘,這個(gè)9分鐘一般在TCP實(shí)現(xiàn)中是不變的)。

往返時(shí)間測(cè)量:
TCP的超時(shí)時(shí)間很大程度上是依賴報(bào)文段的往返時(shí)間。因此測(cè)量往返時(shí)間顯得尤為重要。
因?yàn)殒溌飞系木W(wǎng)絡(luò)流量或者路由器等的存在,往返時(shí)間一般不會(huì)是一成不變的,可能會(huì)經(jīng)常發(fā)生變化。
最初的TCP規(guī)范這樣協(xié)議:RTT(Round-Trip Time)表示往返時(shí)間,用M表示測(cè)量到的RTT。
更新過的RTT = 0.9*RTT + 0.1*M 表示,我估計(jì)新的往返時(shí)間將是,0.9倍的之前的RTT + 0.1倍的新測(cè)量的RTT。(0.9叫平滑因子)
得到了新的估計(jì)RTT,推薦的重傳超時(shí)時(shí)間RTO(Retransmission TimeOut)的值應(yīng)該設(shè)置為
RTO = RTT*b (這里的b是一個(gè)推薦值為2的時(shí)延離散因子)。超時(shí)時(shí)間就是大約2倍的往返時(shí)間。

以上這個(gè)計(jì)算超時(shí)時(shí)間的方法存在缺陷,[Jacobson 1988] 作出了詳細(xì)分析,當(dāng)RTT變化范圍比較大的時(shí)候,這個(gè)方法顯得力不從心了,可能會(huì)引起不必要的重傳。這樣當(dāng)網(wǎng)絡(luò)負(fù)載比較高的時(shí)候,再重傳會(huì)火上澆油...
? ? ?這就又有了新的方法計(jì)算重傳超時(shí)時(shí)間:
前邊說到如果RTT變化范圍較大時(shí),容易發(fā)生不必要重傳。學(xué)過數(shù)學(xué)的都會(huì)知道,方差可以體現(xiàn)出波動(dòng)大小。這個(gè)方法就是用到了方差來均衡下。
這里有個(gè)公式用來計(jì)算RTO,懂的原理就好了,這個(gè)計(jì)算RTO的公式依賴于估計(jì)的RTT和均值偏差(逼近與標(biāo)準(zhǔn)差),而最初的方法則使用了被平滑的RTT的一個(gè)倍數(shù)(b=2)。這塊知道是這么個(gè)事就好~

?

往返時(shí)間RTT的測(cè)量:
如圖:

左邊的時(shí)間軸上有三個(gè)括號(hào),它們表明為進(jìn)行RTT計(jì)算對(duì)哪些個(gè)報(bào)文段進(jìn)行了計(jì)時(shí),并不是所有的報(bào)文段都被計(jì)時(shí)。在發(fā)送一個(gè)報(bào)文段時(shí),如果給定連接的重傳定時(shí)器已經(jīng)被使用,則該報(bào)文段不被計(jì)時(shí)。如圖報(bào)文段4或者報(bào)文段7都沒有參與計(jì)時(shí)。
對(duì)每個(gè)連接而言,除了這個(gè)滴答計(jì)數(shù)器,報(bào)文段中數(shù)據(jù)的起始序號(hào)也被記錄下來。當(dāng)收到一個(gè)包含這個(gè)序號(hào)的確認(rèn)后,該定時(shí)器就被關(guān)閉。如果ACK到達(dá)時(shí)數(shù)據(jù)沒有被重傳,則被平滑的RTT和被平滑的均值偏差將基于這個(gè)新測(cè)量進(jìn)行更新。

在每次調(diào)用500 ms的TCP的定時(shí)器例程時(shí),就增加一個(gè)計(jì)數(shù)器來完成計(jì)時(shí)。這意味著,如果一個(gè)報(bào)文段的確認(rèn)在它發(fā)送550 ms后到達(dá),則該報(bào)文段的往返時(shí)間RTT將是1個(gè)滴答(即500 ms)或是2個(gè)滴答(即1000 ms)。
如圖RTT測(cè)量和時(shí)鐘滴答:

?

? -擁塞舉例:
主機(jī)slip總是通告窗口大小為4096,而主機(jī)vangogh則通告窗口為8192。
如圖:


報(bào)文段45丟失了,報(bào)文段58是正常接收43的報(bào)文段給出的確認(rèn),然后接著接收主機(jī)連續(xù)發(fā)了8個(gè)ack 6657??梢钥闯鍪侵匕l(fā)第三次(除了正常確認(rèn)的中第3個(gè))時(shí),發(fā)送主機(jī)重傳發(fā)送了63報(bào)文段。
這收到第三個(gè)ack才重傳也是算法中要求的,當(dāng)收到第3個(gè)時(shí),就假定一個(gè)報(bào)文段已經(jīng)丟失并重傳自那個(gè)序號(hào)起的一個(gè)報(bào)文段。這就是Jacobson的快速重傳算法。
值得注意的是,在重傳后(報(bào)文段63),發(fā)送方繼續(xù)正常的數(shù)據(jù)傳輸(報(bào)文段67、69和71)。TCP不需要等待對(duì)方確認(rèn)重傳。

這里再分析一下接收端是怎么處理的: 當(dāng)按序收到正常數(shù)據(jù)(報(bào)文段43)后,接收TCP將255個(gè)字節(jié)的數(shù)據(jù)交給用戶進(jìn)程。但下一個(gè)收到的報(bào)文段(報(bào)文段46)是失序的(數(shù)據(jù)的開始序號(hào) 6913 并不是下一個(gè)期望的序號(hào) 6657)。TCP保存256字節(jié)的數(shù)據(jù),并返回一個(gè)已成功接收數(shù)據(jù)的最大序號(hào)加1(6657)的ACK。被vangogh接收到的后面7個(gè)報(bào)文段(48, 50, 52, 54, 55, 57和59)也是失序的,接收方TCP保存這些數(shù)據(jù)并產(chǎn)生重復(fù)ACK(TCP實(shí)現(xiàn)沒法告訴對(duì)方,我就缺某某個(gè)報(bào)文段,它只能告訴發(fā)送方我的確認(rèn)序號(hào)一直是這個(gè))。
當(dāng)缺少的報(bào)文段(報(bào)文段 63)到達(dá)時(shí),接收方TCP在其接收緩存中組合好第6657~8960字節(jié)的數(shù)據(jù),并將這2304字節(jié)的數(shù)據(jù)交給用戶進(jìn)程。所有這些數(shù)據(jù)在報(bào)文段72中進(jìn)行確認(rèn)。
值得注意的是,此時(shí)該ACK通告窗口大小為5888(8192-2304,原來的通告窗口大小是8192),這是因?yàn)橛脩暨M(jìn)程此時(shí)還沒有讀取出這些緩存中的字節(jié)。

?

? -擁塞避免:
該算法假定由于分組受到損壞引起的丟失是非常少的(遠(yuǎn)小于1%),因此分組丟失就意味著在源主機(jī)和目的主機(jī)之間的某處網(wǎng)絡(luò)上發(fā)生了擁塞。
有兩種分組丟失的指示:發(fā)生超時(shí)和接收到重復(fù)的確認(rèn)(如果使用超時(shí)作為擁塞指示,則需要使用一個(gè)好的RTT算法)。
前邊講過慢啟動(dòng),擁塞避免算法和慢啟動(dòng)算法是兩個(gè)目的不同、獨(dú)立的算法。但是當(dāng)擁塞發(fā)生時(shí),我們希望降低分組進(jìn)入網(wǎng)絡(luò)的傳輸速率,于是可以調(diào)用慢啟動(dòng)來作到這一點(diǎn)。在實(shí)際中這兩個(gè)算法通常在一起實(shí)現(xiàn)。

? -快速重傳和快速恢復(fù)算法:
在前邊擁塞舉例時(shí),觀察到第三個(gè)ack過來,發(fā)送端才進(jìn)行重傳。這是因?yàn)?#xff1a;由于我們不知道一個(gè)重復(fù)的ACK是由一個(gè)丟失的報(bào)文段引起的,還是由于僅僅出現(xiàn)了幾個(gè)報(bào)文段的重新排序,因此我們等待少量重復(fù)的ACK到來。假如這只是一些報(bào)文段的重新排序,則在重新排序的報(bào)文段被處理并產(chǎn)生一個(gè)新的ACK之前,只可能產(chǎn)生1 ~ 2個(gè)重復(fù)的ACK。 如果一連串收到3個(gè)或3個(gè)以上的重復(fù)ACK,就非??赡苁且粋€(gè)報(bào)文段丟失了。于是我們就重傳丟失的數(shù)據(jù)報(bào)文段,而無需等待超時(shí)定時(shí)器溢出。這就是快速重傳算法。
接下來收到重傳的ACK以前,發(fā)送了3個(gè)新的數(shù)據(jù)的報(bào)文段(報(bào)文段67,69和71)。執(zhí)行的不是慢啟動(dòng)算法而是擁塞避免算法。這就是快速恢復(fù)算法。在這種情況下沒有執(zhí)行慢啟動(dòng)的原因是由于收到重復(fù)的ACK不僅僅告訴我們一個(gè)分組丟失了,而是在收發(fā)兩端之間仍然有流動(dòng)的數(shù)據(jù)(由于接收方只有在收到另一個(gè)報(bào)文段時(shí)才會(huì)產(chǎn)生重復(fù)的ACK,而該報(bào)文段已經(jīng)離開了網(wǎng)絡(luò)并進(jìn)入了接收方的緩存),因此我們不想執(zhí)行慢啟動(dòng)來突然減少數(shù)據(jù)流。

?

重新分組:
當(dāng)TCP超時(shí)并重傳時(shí),它不一定要重傳同樣的報(bào)文段。而是TCP允許進(jìn)行重新分組而發(fā)送一個(gè)較大的報(bào)文段,這將有助于提高性能(當(dāng)然,這個(gè)較大的報(bào)文段不能夠超過接收方聲明的MSS)。
如圖:

第3個(gè)發(fā)送前,斷開網(wǎng)線。開始發(fā)送3,此時(shí)發(fā)生了重傳,在放棄連接前,又鍵入了幾個(gè)字節(jié)。然后插上網(wǎng)線,發(fā)現(xiàn)第8行,是把前邊兩次的分組組裝成了一個(gè)分組發(fā)過去的。

?

TCP的超時(shí)重傳...end

總結(jié)

以上是生活随笔為你收集整理的【转】TCP/IP协议--TCP的超时和重传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。