【正文】
? “擁塞避免 ” 并非指完全能夠避免了擁塞 。 利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的 。 ? “ 擁塞避免 ” 是說在擁塞避免階段把擁塞窗口控制為按線性規(guī)律增長 , 使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞 。 TCP的超時與重傳 ? T C P提供可靠的運(yùn)輸層 ? 它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù) ? 但數(shù)據(jù)和確認(rèn)都有可能會丟失 ? T C P通過在發(fā)送時設(shè)置一個定時器來解決這種問題 ? 如果當(dāng)定時器溢出時還沒有收到確認(rèn),它就重傳該數(shù)據(jù)。 ? 關(guān)鍵就在于超時和重傳的策略,即怎樣決定 超時間隔 和如何確定 重傳的頻率 。 對每個連接, T C P管理 4個不同的定時器 ? 重傳定時器 發(fā)出數(shù)據(jù)后啟用 ? 堅持定時器 使窗口大小信息保持不斷流動,即使另一端關(guān)閉了其接收窗口。 ? 保活定時器 可檢測到一個空閑連接的另一端何時崩潰或重啟。 ? 2MSL定時器 測量一個連接處于 TIME_WAIT狀態(tài)的時間。 TCP的重傳機(jī)制 ? 重傳機(jī)制是 TCP 中最重要和最復(fù)雜的問題之一 ? TCP每發(fā)送一個報文段,就設(shè)置一次計時器 T’,超時未收到確認(rèn)就重傳。 ? T’太小,使得大量報文段重傳,給網(wǎng)絡(luò)增加許多不應(yīng)有的負(fù)擔(dān); T’太大,使網(wǎng)絡(luò)的傳輸效率降低。 ? 傳輸層的重傳定時器(超時計時器)的重傳時間 T’究竟應(yīng)設(shè)置多大? 重傳定時器 ? 最好稍大于往返時延 ? 關(guān)鍵:測量往返時延 往返時延的方差很大 ? 由于 TCP 的下層是一個互連網(wǎng)環(huán)境, IP 數(shù)據(jù)報所選擇的路由變化很大。因而運(yùn)輸層的往返時延的方差也很大。 時間 數(shù)據(jù)鏈路層 運(yùn)輸層 T1 T2 T3 往返時延的 概率分布 ? 記錄每一個報文段發(fā)出的時間 ? 再記錄收到相應(yīng)的確認(rèn)報文段的時間 ? 這兩個時間之差就是報文段的往返時延 ? 將各個報文段的往返時延樣本加權(quán)平均,就得出報文段的平均往返時延 RTT。 自適應(yīng)算法 ? 每測量到一個新的往返時延樣本,就按下式重新計算一次平均往返時延 RTT 平均往返時延 RTT ? ? ? RTT舊 ? (1 ? ?) ? RTT新 0 ? ? ? 1。 參數(shù) ? 的選擇 ? 若 ? 很接近于 1,表示新算出的平均往返時延 RTT 和原來的值相比變化不大,而新的往返時延樣本的影響不大 (RTT 值更新較慢 )。 ? 若選擇 ? 接近于零,則表示加權(quán)計算的平均往返時延 RTT 受新的往返時延樣本的影響較大(RTT 值更新較快 )。 ? 典型的 ? 值為 7/8。 超時重傳時間 RTO (RetransmissionTimeOut) ? 計時器的 RTO 應(yīng)略大于上面得出的 RTT,即:RTO ? ? ? RTT ? 大于 1 ? 若取 ? 很接近于 1 ,發(fā)送端可及時地重傳丟失的報文段,因此效率得到提高。 ? 但若報文段并未丟失而僅僅是增加了一點(diǎn)時延,那么過早地重傳反而會加重網(wǎng)絡(luò)的負(fù)擔(dān)。 ? 因此 TCP 原先的標(biāo)準(zhǔn)推薦將 ? 值取為 2。 往返時延 RTT? 往返時間的測量相當(dāng)復(fù)雜 ? TCP 報文段 1 沒有收到確認(rèn)。 ? 重傳后收到了確認(rèn)報文段 ACK。 ? 如何判定此確認(rèn)報文段是對原來的報文段的確認(rèn),還是對重傳的報文段的確認(rèn)? 發(fā)送一個 TCP 報文段 超時重傳 TCP 報文段 收到 ACK 時間 1 2 往返時延 RTT? 是對哪一個報文段 的確認(rèn)? ? 若收到的確認(rèn)是對重傳報文的確認(rèn),卻被源站當(dāng)成是對原來報文的確認(rèn),那么,這樣計算出的往返時延就會偏大 ? 若收到的確認(rèn)是對原來報文的確認(rèn),卻被源站當(dāng)成是對重傳報文的確認(rèn),那么,這樣計算出的往返時延就會偏小。 Karn算法 ? 在計算平均往返時延時,只要報文段重傳了,就不采用其往返時延樣本。 ? 引起重傳時間無法更新 修正的 Karn 算法 ? 報文段每重傳一次 , 就將重傳時間增大一些 RTO 新 ? ? ? RTO 舊 ? 系數(shù) ? 的典型值是 2 ? 當(dāng)不再發(fā)生報文段的重傳時,才根據(jù)報文段的往返時延更新平均往返時延 RTT 和重傳時間的數(shù)值。 ? 實踐證明,這種策略較為合理。 TCP的堅持定時器和保活定時器 ? TCP的堅持定時器 ? TCP的?;疃〞r器 一、 TCP的堅持定時器 ? 如果一個確認(rèn)丟失了,則雙方就有可能因為等待對方而使連接終止:接收方等待接收數(shù)據(jù)(因為它已經(jīng)向發(fā)送方通告了一個非 0的窗口),而發(fā)送方在等待允許它繼續(xù)發(fā)送數(shù)據(jù)的窗口更新。 ? 為防止這種死鎖情況的發(fā)生,發(fā)送方使用一個堅持定時器 (persist timer)來周期性地向接收方查詢,以便發(fā)現(xiàn)窗口是否已增大。 二、 TCP的?;疃〞r器 ? 可以沒有任何數(shù)據(jù)流通過一個空閑的 T C P連接 ? 也就是說,建立 TCP連接后, T C P連接的雙方可以都不向?qū)Ψ桨l(fā)送數(shù)據(jù)。 ? 一旦通信雙方建立起 TCP連接,如果不釋放連接,兩端的主機(jī)也沒有被重啟,則連接依然保持建立。 ? 許多時候一個服務(wù)器希望知道客戶主機(jī)是否崩潰并關(guān)機(jī)或者崩潰又重新啟動。 ? 許多實現(xiàn)提供的?;疃〞r器可以提供這種能力。 ?;畈⒉皇?TCP規(guī)范中的一部分。有 3個不使用保活定時器的理由: ? (1) 在出現(xiàn)短暫差錯的情況下,這可能會使一個非常好的連接釋放掉。 ? ( 2)它們耗費(fèi)不必要的帶寬 ? ( 3)在按分組計費(fèi)的情況下會在互聯(lián)網(wǎng)上花掉更多的錢 ? 然而,許多實現(xiàn)提供了?;疃〞r器。 ?;疃〞r器是一個有爭論的功能 ? 許多人認(rèn)為如果需要,這個功能不應(yīng)該在 TCP中提供,而應(yīng)該由應(yīng)用程序來完成。 ? 保活功能主要是為服務(wù)器應(yīng)用程序提供的。服務(wù)器應(yīng)用程序希望知道客戶主機(jī)是否崩潰,從而可以知道客戶是否使用該資源。 ? 許多版本的 R l o g i n和 Te l n e t服務(wù)器默認(rèn)使用這個選項。 TCP的未來和性能 ? 路徑 MTU發(fā)現(xiàn)機(jī)制 ? 長肥管道(具有很大的帶寬時延乘積的 網(wǎng)絡(luò) )以及 T C P在這些網(wǎng)絡(luò)上所具有的局限性 TCP的路徑 MTU發(fā)現(xiàn) ? 在連接建立時, T C P使用輸出接口或?qū)Χ寺暶鞯?M S S中的最小 M T U作為起始的報文段大小。路徑 M T U發(fā)現(xiàn)不允許 T C P超過對端聲明的 M S S。如果對端沒有指定一個 M S S,則默認(rèn)為 5 3 6。 ? 一旦選定了起始的報文段大小,在該連接上的所有被 T C P發(fā)送的 I P數(shù)據(jù)報都將被設(shè)置 D F比特。如果某個中間路由器需要對一個設(shè)置了 D F標(biāo)志的數(shù)據(jù)報進(jìn)行分片,它就丟棄這個數(shù)據(jù)報,并產(chǎn)生一個 I C M P的 “ 不能分片 ” 差錯。 ? 如果收到這個 I C M P差錯, T C P就減少段大小并進(jìn)行重傳。報文段大小被設(shè)置為下一跳的 M T U減去 I P和 T C P的首部長度。 ? 當(dāng)由這個 I C M P差錯引起的重傳發(fā)生時,擁塞窗口不需要變化,但要啟動慢啟動。 ? 由于路由可以動態(tài)變化,因此在最后一次減少路徑 M T U的一段時間以后,可以嘗試使用一個較大的值(直到等于對端聲明的 M S S或輸出接口 M T U的最小值)。 RFC 11 9 1推薦這個時間間隔為 1 0分鐘 ? 在對非本地目的地,默認(rèn)的 M S S通常為 5 3 6字節(jié),路徑 M T U發(fā)現(xiàn)可以避免在通過 M T U小于 5 7 6(這非常罕見)的中間鏈路時進(jìn)行分片。 ? 但為了能使路徑 M T U更加有用和充分利用 M T U大于 5 7 6的廣域網(wǎng),一個實現(xiàn)必須停止使用為非本地目的制定的 5 3 6的 M T U默認(rèn)值。 ? M S S的一個較好的選擇是輸出接口的 M T U(當(dāng)然要減去 I P和 T C P的首部大?。? ? 大多數(shù)的實現(xiàn)都允許系統(tǒng)管理員改變這個默認(rèn)的 M S S值 大分組還是小分組 ? 常規(guī)知識告訴我們較大的分組比較好 ? 因為發(fā)送較少的大分組比發(fā)送較多的小分組 “ 花費(fèi) ” 要少(假定分組的大小不足以引起分片,否則會引起其他方面的問題)。 ? 這些減少的花費(fèi)與網(wǎng)絡(luò)(分組首部負(fù)荷)、路由器(選路的決定)和主機(jī)(協(xié)議處理和設(shè)備中斷)等有關(guān)。 ? 但并非所有的人都同意這種觀點(diǎn) ? 測量表明,分組并不一定是越大越好。 ? 需要在更多的網(wǎng)絡(luò)上對該領(lǐng)域進(jìn)行更多的研究。 長肥管道 ? 我們把一個 連接的容量 表示為 c a p a c i t y (b) = b a n d w i d t h (b/s) ro u n dt r i p t i m e ( s ) ? 并稱之為 帶寬時延乘積 ? 也可稱它為 兩端的管道大小 ? 當(dāng)這個乘積變得越來越大時, T C P的某些局限性就會暴露出來。 多種網(wǎng)絡(luò)的帶寬時延乘積 長肥管道 ? 具有大的帶寬時延乘積的網(wǎng)絡(luò)被稱為長肥網(wǎng)絡(luò)( Long Fat Network ,即 L F N) ? 一個運(yùn)行在 L F N上的 T C P連接被稱為長肥管道 ? 管道可以被水平拉長(一個長的 RT T),或被垂直拉高(較高的帶寬),或向兩個方向拉伸。 使用長肥管道會遇到多種問題 ? T C P首部中 窗口大小 為 16 bit,從而將窗口限制在 6 5 5 3 5個字節(jié)內(nèi),現(xiàn)有的網(wǎng)絡(luò)需要一個更大的窗口來提供最大的吞吐量。用 窗口擴(kuò)大選項 可以解決這個問題。 ? 在一個長肥網(wǎng)絡(luò) L F N內(nèi)的 分組丟失會使吞吐量急劇減少 。如果只有一個報文段丟失,需要利用快速重傳和快速恢復(fù)算法來使管道避免耗盡。但是即使使用這些算法,在一個窗口內(nèi)發(fā)生的多個分組丟失也會典型地使管道耗盡(如果管道耗盡了,慢啟動會使它漸漸填滿,但這個過程將需要經(jīng)過多個 RT T)。建議使用 有選擇的確認(rèn) 來處理一個窗口發(fā)生的多個分組丟失。 ? 許多 T C P實現(xiàn)對每個窗口的 RT T僅進(jìn)行一次測量,它們并不對每個報文段進(jìn)行 RT T測量,在一個長肥網(wǎng)絡(luò) L F N上 需要更好的 RT T測量機(jī)制 。采用 時間戳選項 ,它允許更多的報文段被計時,包括重傳。 ? T C P對每個字節(jié)數(shù)據(jù)使用一個 32 bit無符號的序號來進(jìn)行標(biāo)識, 序號空間是有限的 ,相同序號 N在 M S L期間是否被重用的問題,也就是說,網(wǎng)絡(luò)是否足夠快以至于在不到一個 M S L的時候序號就發(fā)生了回繞。法:使用 T C P的時間戳選項的 PAW S(Protection Against Wrapped Sequence numbers)算法( 保護(hù)回繞的序號 ) T/TCP:為事務(wù)用的 TCP擴(kuò)展 ? T C P提供的是一種虛電路方式的運(yùn)輸服務(wù)。這種虛電路服務(wù)非常適合諸如遠(yuǎn)程注冊和文件傳輸之類的應(yīng)用。 ? 但是,還有一些其他的應(yīng)用進(jìn)程被設(shè)計成使用事務(wù)服務(wù)。一個事務(wù)就是符合下面這些特征的一個客戶請求及其隨后的服務(wù)器響應(yīng)。 ? 1) 應(yīng)該避免連接建立和連接終止的開銷,在可能的時候,發(fā)送一個請求分組并接收一個應(yīng)答分組。 ? 2) 等待時間應(yīng)當(dāng)減少到等于 RT T與 S P T之和。其中 RTT (RoundTrip Ti m e )為往返時間,而 SPT (Server Processing Ti m e )則是服務(wù)器處理請求的時間。 ? 3) 服務(wù)器應(yīng)當(dāng)能夠檢測出重復(fù)的請求,并且當(dāng)收到一個重復(fù)的請求時不重新處理事務(wù)(避免重新處理意味著服務(wù)器不必再次處理請求,而是返回保存的、與該請求對應(yīng)的應(yīng)答)。 其中一個使用這種類型服務(wù)的應(yīng)用就是域名服務(wù) 課下作業(yè)(必做) :擁塞控制 TCP的工作機(jī)制和實現(xiàn)細(xì)節(jié) 課下作業(yè)(選做) TCP服務(wù)器