龔猷龍
【摘要】 傳輸層通信時(shí),如果發(fā)送序列中間某個(gè)數(shù)據(jù)包丟失,一般的TCP 協(xié)議會等到超時(shí)后再重送遺失的數(shù)據(jù)包,在等待超時(shí)的這段時(shí)間中,TCP不能重送發(fā)新的數(shù)據(jù),這使得鏈路的使用率很低,急劇降低了TCP性能。為改善這種情況,選擇性確認(rèn)(SACK)技術(shù)提供了相應(yīng)機(jī)制使發(fā)送方能區(qū)分?jǐn)?shù)據(jù)丟失及重發(fā)情況。本文將分析SACK選項(xiàng)功能,同時(shí)采用NS-2模擬器進(jìn)行仿真,分析SACK丟包情況、隊(duì)列長度及擁塞窗口性能。
【關(guān)鍵詞】 TCP 選擇性確認(rèn) NS-2 重新發(fā)送
一、引言
TCP協(xié)議是面向連接、保證高可靠性(數(shù)據(jù)無丟失、數(shù)據(jù)無失序、數(shù)據(jù)無錯誤、數(shù)據(jù)無重復(fù)到達(dá))傳輸層協(xié)議。TCP協(xié)議中經(jīng)常要關(guān)注到網(wǎng)絡(luò)性能,比如網(wǎng)絡(luò)擁塞,產(chǎn)生了多種TCP擁塞控制算法,Tahoe、Reno、NewReno與SACK算法。擁塞控制就是防止過多的數(shù)據(jù)注入網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。擁塞控制是一個(gè)全局性的過程,和流量控制不同,流量控制指點(diǎn)對點(diǎn)通信量的控制。
二、TCP SACK的原理
發(fā)送方維持一個(gè)叫做擁塞窗口cwnd(congestion window)的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口,另外考慮到接受方的接收能力,發(fā)送窗口可能小于擁塞窗口。慢開始算法的思路就是,不要一開始就發(fā)送大量的數(shù)據(jù),先探測一下網(wǎng)絡(luò)的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。這里用報(bào)文段的個(gè)數(shù)的擁塞窗口大小舉例說明慢開始算法,實(shí)時(shí)擁塞窗口大小是以字節(jié)為單位的。當(dāng)然收到單個(gè)確認(rèn)但此確認(rèn)多個(gè)數(shù)據(jù)報(bào)的時(shí)候就加相應(yīng)的數(shù)值。所以一次傳輸輪次之后擁塞窗口就加倍。為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需設(shè)置一個(gè)慢開始門限ssthresh狀態(tài)變量。擁塞避免算法讓擁塞窗口緩慢增長,即每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口按線性規(guī)律緩慢增長。無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因?yàn)闊o法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法。
在傳送過程中,若同時(shí)有多個(gè)數(shù)據(jù)包在網(wǎng)絡(luò)中丟失,大多數(shù)情況下一般的TCP都必須等到超時(shí)(Timeout)后才能重新發(fā)送丟失的數(shù)據(jù)包。而SACK是TCP Reno的另一個(gè)衍生版本。在這個(gè)版本中,加入了一個(gè)SACK選項(xiàng)(TCP option field),允許接收端在返回Duplicate ACK時(shí),將已經(jīng)收到的數(shù)據(jù)區(qū)段(連續(xù)收到的數(shù)據(jù)范圍)返回給傳送端,數(shù)據(jù)區(qū)段與數(shù)據(jù)區(qū)段之間的間隔就是接收端沒有收到的數(shù)據(jù)。傳送端就知道哪些數(shù)據(jù)包是已經(jīng)收到的,哪些是該重送的,因此SACK的傳送端可以在一個(gè)RTT時(shí)間內(nèi)重送多個(gè)的數(shù)據(jù)包。SACK通常都是由TCP接收方產(chǎn)生的,在TCP握手時(shí),如果接收到對方的SACK允許選項(xiàng)同時(shí)自己也支持SACK的話,在接收異常時(shí)就可以發(fā)送SACK包通知發(fā)送方。在SACK中描述的是收到的數(shù)據(jù)段,這些數(shù)據(jù)段可以是正常的,也可能是重復(fù)發(fā)送的,SACK字段具有描述重復(fù)發(fā)送的數(shù)據(jù)段的能力,在第一塊SACK數(shù)據(jù)中描述重復(fù)接收的不連續(xù)數(shù)據(jù)塊的序列號參數(shù),其他SACK數(shù)據(jù)則描述其他正常接收到的不連續(xù)數(shù)據(jù),因此第一塊SACK描述的序列號會比后面的SACK描述的序列號大;而在接收到不完整的數(shù)據(jù)段的情況下,SACK范圍甚至可能小于當(dāng)前的ACK值。通過這種方法,發(fā)送方可以更仔細(xì)判斷出當(dāng)前網(wǎng)絡(luò)的傳輸情況,可以發(fā)現(xiàn)數(shù)據(jù)段被網(wǎng)絡(luò)復(fù)制、錯誤重傳、ACK丟失引起的重傳、重傳超時(shí)等異常的網(wǎng)絡(luò)狀況。
三、TCP SACK的性能仿真
針對性能指標(biāo):丟包情況、隊(duì)列長度及擁塞窗口性能。下面將通過NS-2仿真工具進(jìn)行仿真。
(1)仿真實(shí)驗(yàn)圖:
(2)按照圖1,使用NSG2工具自動生成TCL代碼進(jìn)行仿真。實(shí)驗(yàn)仿真結(jié)果:a.吞吐量:1918.4 Kbps;b.擁塞窗口cwnd變化情況如圖2:c.隊(duì)列變化情況如圖3:
總結(jié):TCP SACK的吞吐量比較大,擁塞窗口不會重設(shè)為1,而且保持平穩(wěn)的波動。且隊(duì)列變化情況也是很有規(guī)律的??梢?,TCP SACK的發(fā)送機(jī)制還是比較優(yōu)化的。
參 考 文 獻(xiàn)
[1] 王輝. NS-2網(wǎng)絡(luò)模擬器的原理和應(yīng)用.西北工業(yè)大學(xué)出版社,2008.
[2] 謝希仁. 計(jì)算機(jī)網(wǎng)絡(luò)(第5版). 電子工業(yè)出版社,2009.
[3] Comer,D.,Internetworking with TCP/IP,Vol.1,5ed.,Pearson Education,2006.