380 likes | 602 Views
TCP in Mobile Ad Hoc Networks (MANETs). Wireless Network Lab. TCP 拥塞控制窗口变化的是加法增大、乘法减小 (AIMD) : 较好地保证流之间的公平性,因为一旦丢包,窗口立即减半退避,可以为其他流留有足够的空间,从而保证整个的公平性; 拥塞发生时,窗口乘法减小,可快速解除拥塞。. TCP 拥塞控制策略: 慢启动 (Slow Start) 拥塞避免 (Congestion Avoidance) 超时重传 (RTO) 快速重传 (Fast Retransmit ) 快速恢复 (Fast Recovery)
E N D
TCP in Mobile Ad Hoc Networks(MANETs) Wireless Network Lab.
TCP拥塞控制窗口变化的是加法增大、乘法减小(AIMD):TCP拥塞控制窗口变化的是加法增大、乘法减小(AIMD): • 较好地保证流之间的公平性,因为一旦丢包,窗口立即减半退避,可以为其他流留有足够的空间,从而保证整个的公平性; • 拥塞发生时,窗口乘法减小,可快速解除拥塞。
TCP拥塞控制策略: 慢启动(Slow Start) 拥塞避免(Congestion Avoidance) 超时重传(RTO) 快速重传(Fast Retransmit ) 快速恢复(Fast Recovery) 拥塞窗口(CWND):拥塞控制 通告/接收窗口(RWND):流量控制 发送窗口(SWND) = min(RWND, CWND)
TCP在无线Ad hoc网络中的应用与挑战 • TCP协议是为有线网络设计的,它在有线网络中表现很好,该协议通过增加拥塞窗口来不断探测网络的可用带宽,拥塞窗口决定了网络中未确认的分组数量。 • 拥塞控制算法依赖于分组的丢失和网络的拥塞程度,一般使用反馈机制,如通过超时重传和连续重复的ACK(确认分组)来检测分组丢失,判断拥塞,然后通过减少拥塞窗口来解除拥塞,而且当发生超时重传后,使用指数退避算法来确定重传的超时值。
Ad hoc网络是一种自组织无线网络,与传统的带固定设备的无线网络相比(如WLAN),显著特点是网络中没有固定的通信基础设施,网络中的所有节点均可自由移动,且每个节点既作为终端又作为路由器,可提供包的存储转发功能。 Ad hoc网络的一些本质特性使TCP应用于其中时面临一些问题。 传统的TCP认为所有的包丢失都是由网络拥塞造成的。一旦检测到丢包事件,TCP会减少窗口来降低发送速率,从而避免或减轻网络拥塞。但是在Ad hoc无线网络中,许多因素都会导致包的丢失。
可能会导致丢包的因素: (1)传输介质的某些本质特性会导致包的丢失: collision(hidden terminal),bit error ratio (2)路由变化会导致包的丢失 node mobility,heavy contention (3)链路竞争会导致包的丢失 access medium
传统的TCP本身是没有能力区分数据包丢失原因的,而是一旦发现丢包,就进行拥塞控制减小拥塞窗口,这种不恰当、不合时宜地拥塞控制、拥塞避免和超时重传,会导致TCP吞吐量的严重下降。传统的TCP本身是没有能力区分数据包丢失原因的,而是一旦发现丢包,就进行拥塞控制减小拥塞窗口,这种不恰当、不合时宜地拥塞控制、拥塞避免和超时重传,会导致TCP吞吐量的严重下降。 无线Ad hoc下TCP研究重点: 让TCP具备区分丢包原因的能力,能够实时感知网络状态,根据网络状态调整拥塞窗口。
目前针对Ad Hoc 网络的传输层/TCP问题提出了许多协议: 基于网络层的方案 基于网络层的方法就是TCP发送端利用网络层提供的反馈信息,以较为准确地判断网络中路由发生变化的信息,从而采取相应的措施以提高TCP性能。 典型的方法有:TCP-F( TCPFeedback )、ELFN(显示通知)和ATCP(子层)等。
基于端到端的方案 针对TCP自身的端到端特性,结合某种判断方法,来对丢包和收到重复的ACK等现象加以判别以进行相应处理。 典型的方案: 固定重传超时(fixed RTO)、动态延迟ACK (Dynamic delay ACK)和TCP错序检测与响应(TCP Door,TCP Detecting out of order and Response)等。
NS2原理:离散事件模拟器,事件对象化 对象配置: 每一个对象都有一些可以被指定的配置参数,这些配置参数是此对象的实例变量。它们在NS启动时被赋予缺省值,在NS软件包的ns/tcl/lib子目录中有一个启动文件ns-deafult.tcl,此文件中有NS中各个类的缺省参数值。 可以通过set命令来得到缺省参数值,也可以自主设置一个类的所有对象的值。
用NS进行仿真的基本步骤如下: (1)产生事件调度器:产生一个仿真实例;用at调度时间;用run命令开始调度。 (2)打开跟踪机制:打开一个nam文件或trace文件跟踪链路上的包。 (3)产生需要进行仿真的网络:配置网络参数如路由协议、物理层协议、路由器队列长度等:创建节点;确定网络拓扑等。 (4)产生传输层连接:设定连接的源端和目的端,并选择传输agent的类型,建立连接。 (5)业务生成:确定连接上的传输业务类型,如FTP,CBR等;把业务附加到一个agent上. (6)传输应用层数据:用at调度时间来确定何时进行业务的传输。 (7)开始仿真:调用命令使仿真开始。
网络的拓扑结构 ---通过指定三个基本的拓扑单位来实现:nodes、links、agents。 simulator类中的node函数用来创建节点,并给每个节点自动分配一个唯一的地址。 Simplex-link函数用来在两个节点之间建立单向连接。Duplex-link用来建立两个节点之间的双向连接。
Agents 是驱动仿真程序的对象。它可以被想象为在节点上运行的进程,节点可以是端主机或路由器。网络业务源端和业务接收端、动态路由模型以及各种不同的协议模块都是agents的实例。通过实例化一个agents类的子类对象可以创建一个agents , agents/type表示子类对象,其中type表示是哪一种agents 。 创建 agents ,用simulator类中attach-agents函数将这个agents与一个节点相连。
在仿真中,一些agent必须有相连的业务源,也有一些agent能够生成自身的数据。使用attach-source和attach-traffic将业务源连接到agent上。在仿真中,一些agent必须有相连的业务源,也有一些agent能够生成自身的数据。使用attach-source和attach-traffic将业务源连接到agent上。 #=================================== # Agents Definition #=================================== set tcp_(0) [$ns_ create-connection TCP $node_(0) TCPSink $node_(1) 0] $tcp_(0) set window_ 32 $tcp_(0) set packetSize_ 512 set ftp_(0) [$tcp_(0) attach-source FTP] $ns_ at 0.0 "$ftp_(0) start"
TCP Agent 主要有两种:单向agent 和双向agent。 单向agent 可以进一步分为一系列的发送器(采 用不同的拥塞控制机制技术)和接受器(”sink”); 双向agent 可以被看作为一个发送器和一个接收器的统一体
现存的单向TCP 发送agent 如下: ·Agent/TCP - a “tahoe” TCP sender ·Agent/TCP/Reno - a “Reno” TCP sender ·Agent/TCP/Newreno - Reno with a modification ·Agent/TCP/Sack1 - TCP with selective repeat (follows RFC2018) ·Agent/TCP/Vegas - TCP Vegas ·Agent/TCP/Fack - Reno TCP with “forward acknowledgment” 现存的TCP 接收agent : ·Agent/TCPSink - TCP sink with one ACK per packet ·Agent/TCPSink/DelAck - TCP sink with configurable delay per ACK ·Agent/TCPSink/Sack1 - selective ACK sink (follows RFC2018) ·Agent/TCPSink/Sack1/DelAck - Sack1 with DelAck
#建立一个TCP Reno的FTP连接 set tcp1 [new Agent/TCP/Reno] $tcp1 set window_ 24 $tcp1 set fid_ 2 $ns attach-agent $n2 $tcp1 set tcp1sink [new Agent/TCPSink] $ns attach-agent $n3 $tcp1sink $ns connect $tcp1 $tcp1sink set ftp1 [new Application/FTP] $ftp1 attach-agent $tcp1
#建立一个TCP Vegas的FTP连接 $set tcp0 [new Agent/TCP/Vegas]$tcp0 set v_alpha_ 1$tcp0 set v_beta_ 3$tcp0 set window_ 24$tcp0 set fid_ 1$ns attach-agent $n0 $tcp0set tcp0sink [new Agent/TCPSink]$ns attach-agent $n1 $tcp0sink$ns connect $tcp0 $tcp0sinkset ftp0 [new Application/FTP]$ftp0 attach-agent $tcp0
Configuration Parameters Agent/TCP set window_ 20 ;# max bound on window size Agent/TCP set windowInit_ 1 ;# initial/reset value of cwnd Agent/TCP set windowOption_ 1 ;# cong avoid algorithm (1: standard) Agent/TCP set windowConstant_ 4 ;# used only when windowOption != 1 Agent/TCP set windowThresh_ 0.002 ;# used in computing averaged window Agent/TCP set overhead_ 0 ;# !=0 adds random time between sends Agent/TCP set ecn_ 0 ;# TCP should react to ecn bit Agent/TCP set packetSize_ 1000 ;# packet size used by sender (bytes) Agent/TCP set bugFix_ true ;# see explanation Agent/TCP set slow_start_restart_ true ;# see explanation Agent/TCP set tcpTick_ 0.1 ;# timer granulatiry in sec (.1 is NONSTANDARD) Agent/TCP set maxrto_ 64 ;# bound on RTO (seconds) Agent/TCP set dupacks_ 0 ;# duplicate ACK counter Agent/TCP set ack_ 0 ;# highest ACK received
TCP under NS2 Functions for Sending Data: Functions for Window Management Functions for Processing ACKs
send_much (force, reason, maxburst ): 它试图发送 当前发送窗口所允许的最大数量的信息包。总量被限定为maxburst_。 output (seqno, reason): 它发送具有指定序列号的信息包。如果迄今为止给定的序列号是最大的,则此函数将更新发送序列号变量maxseq_以容纳之。它还把TCP 报头分成了不同的域(序列号,时间标记,传送原因)。如果计时器未定,则此函数也设定重传计时器。
Functions for Window Management 有效发送窗口在任何时刻都是由函数window()所创建。它设定最小拥塞窗口和变量wnd_。其中wnd_表示接收器的advertised 窗口。 opencwnd(): 在接收到新ACK 的时候,可以调用此函数来打开拥塞窗口。 在慢启动的情况下,每收到一个ACK,此函数就增大一次cwnd_。在拥塞避免的情况下,标准配置把cwnd_增大其倒数。在拥塞避免时,还设置了其它窗口增长选项,但是它们只是试验性的(并非正式的)。
closecwnd(int how): 此函数可以用来减小拥塞窗口。 调用准则:进行快速重传;计时器终止;拥塞报告(设置ECN 比特)。 它的引数how 表明将会怎样缩小拥塞窗口。0 值用于Tahoe TCP 重传超时和快速重传,但是它常常会导致TCP 进入慢启动状态 并把ssthresh_减小为当前窗口的1/2。值1 在Reno TCP 中用于设置恢复(避免返回到慢启动状态)。值2 用于根据ECN 指示缩小窗口使拥塞窗口复位到其初始值(常导致慢启动)但不改变ssthresh_。
Functions for Processing ACKs recv():ACK 的主要接收路径。 注:只用到一个信息流方法。故只有净ACK 包(即无数据)才能调用此函数。它在ts_peer_中保存了来向ACK 的时间标记(timestamp)检测ECN 比特(在合适的时候缩小发送窗口)。如果ACK 是新的,则调用newack(),否则检查他是否为前一个ACK seen 的重复。若如此,它则进行快速重传:先关闭窗口,复位重传计时器,调用send_much 发送信息包。
newack(): 处理新ACK(具有比此前ACK 号更大号的ACK)。它调用newtimer()设立新的重传计时器。