龚猷龙
【摘要】 传输层通信时,如果发送序列中间某个数据包丢失,一般的TCP 协议会等到超时后再重送遗失的数据包,在等待超时的这段时间中,TCP不能重送发新的数据,这使得链路的使用率很低,急剧降低了TCP性能。为改善这种情况,选择性确认(SACK)技术提供了相应机制使发送方能区分数据丢失及重发情况。本文将分析SACK选项功能,同时采用NS-2模拟器进行仿真,分析SACK丢包情况、队列长度及拥塞窗口性能。
【关键词】 TCP 选择性确认 NS-2 重新发送
一、引言
TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。TCP协议中经常要关注到网络性能,比如网络拥塞,产生了多种TCP拥塞控制算法,Tahoe、Reno、NewReno与SACK算法。拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
二、TCP SACK的原理
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。当然收到单个确认但此确认多个数据报的时候就加相应的数值。所以一次传输轮次之后拥塞窗口就加倍。为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。
在传送过程中,若同时有多个数据包在网络中丢失,大多数情况下一般的TCP都必须等到超时(Timeout)后才能重新发送丢失的数据包。而SACK是TCP Reno的另一个衍生版本。在这个版本中,加入了一个SACK选项(TCP option field),允许接收端在返回Duplicate ACK时,将已经收到的数据区段(连续收到的数据范围)返回给传送端,数据区段与数据区段之间的间隔就是接收端没有收到的数据。传送端就知道哪些数据包是已经收到的,哪些是该重送的,因此SACK的传送端可以在一个RTT时间内重送多个的数据包。SACK通常都是由TCP接收方产生的,在TCP握手时,如果接收到对方的SACK允许选项同时自己也支持SACK的话,在接收异常时就可以发送SACK包通知发送方。在SACK中描述的是收到的数据段,这些数据段可以是正常的,也可能是重复发送的,SACK字段具有描述重复发送的数据段的能力,在第一块SACK数据中描述重复接收的不连续数据块的序列号参数,其他SACK数据则描述其他正常接收到的不连续数据,因此第一块SACK描述的序列号会比后面的SACK描述的序列号大;而在接收到不完整的数据段的情况下,SACK范围甚至可能小于当前的ACK值。通过这种方法,发送方可以更仔细判断出当前网络的传输情况,可以发现数据段被网络复制、错误重传、ACK丢失引起的重传、重传超时等异常的网络状况。
三、TCP SACK的性能仿真
针对性能指标:丢包情况、队列长度及拥塞窗口性能。下面将通过NS-2仿真工具进行仿真。
(1)仿真实验图:
(2)按照圖1,使用NSG2工具自动生成TCL代码进行仿真。实验仿真结果:a.吞吐量:1918.4 Kbps;b.拥塞窗口cwnd变化情况如图2:c.队列变化情况如图3:
总结:TCP SACK的吞吐量比较大,拥塞窗口不会重设为1,而且保持平稳的波动。且队列变化情况也是很有规律的。可见,TCP SACK的发送机制还是比较优化的。
参 考 文 献
[1] 王辉. NS-2网络模拟器的原理和应用.西北工业大学出版社,2008.
[2] 谢希仁. 计算机网络(第5版). 电子工业出版社,2009.
[3] Comer,D.,Internetworking with TCP/IP,Vol.1,5ed.,Pearson Education,2006.