如何基于Nagle算法设计嵌入式TCP协议?
扫描二维码
随时随地手机看文章
随着嵌入式系统的发展,在嵌入式系统中实现网络连接已成为研究热点,广泛使用的廉价8/ 16 位嵌入式处理器的性能不足与网络协议的复杂构成了尖锐的矛盾。 嵌入式Internet 技术的核心是在嵌入式系统中实现TCP/ IP 协议簇, TCP 协议的机制比较复杂,对8/ 16 位嵌入式处理器的存储能力和运算能力要求较高,必须进行简化。
本文提出了一种适用于8/ 16 位低速处理器的简化TCP 协议。对其性能进行分析发现,在嵌入式网络大量使用小数据包,造成网络带宽利用率低下并且容易造成网络阻塞。 因此在简化的TCP 协议中引入Nagle 算法,大幅度减少了嵌入式网络中发送的小数据包个数,提高了吞吐率,并减少了所需的带宽。
简化TCP 协议的提出
TCP 协议的数据传输分为3 个阶段: 建立连接、传输数据和断开连接,可以用状态机 来实现。8/ 16 位嵌入式微控制器要完整实现这样复杂的状态机是十分困难的。在嵌入式系统中简化TCP 的实现已有相关的研究,本文进一步引入了Nagle 算法并且进行了网络模拟,给出了实验结果。
连接建立和断开机制
TCP 建立连接有两种方式:主动打开和被动打开。如果实现服务器端应用,可以将TCP 状态机的主动打开连接部分简化掉。同理客户端应用,可以将状态机的被动打开连接部分简化掉。断开连接也有两种方式:主动断开和被动断开。其中被动断开连接的处理较为简单。但为了保证安全性,希望主动断开连接。主动断开连接简化实现的方法是:发送一个Fin 数据报,在接收到对Fin 数据报的确认后,再发送一个Reset 数据报,就可完成主动断开连接。
以服务器端的TCP 连接为例,简化后的TCP状态机如图1。
单TCP 连接
在8/ 16 位微控制器上实现简化TCP 协议,无需实现多个TCP 连接,只需实现单个TCP 连接即可。
简单确认机制
嵌入式系统发送数据包不大,可以将TCP 协议的滑动窗口机制去掉,成为简单确认机制,只对单个数据报而不是批量数据发送确认。实现方法是设置TCP 头部windows 字段的大小为1 ,即可保证TCP协议双方都使用简单确认。
仅计算发送TCP 报文的校验和
由于TCP 协议校验和的计算对系统存储和计算资源的占用都比较多,可以省去对接收数据报校验和的计算,保留发送数据报TCP 校验和的计算。
简化TCP 方案小结
在上述4 个方面的基础上,在嵌入式处理器中实现了简化的TCP 协议,程序流程如图2。其中“不同状态的相应处理”指根据接收到的TCP 报文准备待发送数据报并将其发送到以太网上。
简化TCP 协议的性能分析
这种简化的TCP 协议的性能可以通过在NS-2
网络模拟器中进行模拟实现。
通常在嵌入式的环境中,应用层产生的数据包是很小的,经常是每个包只有几个、十几、几十个字节的数据,这样就产生了一个问题: TCP 协议的报头开销太大。假设数据仅有一个字节,而TCP 的包头有40 个字节,这样的数据报对底层网络的利用率仅仅只有1/ 41 ,考虑到分组之间的间隙和网络硬件组成帧还需要一些比特,实际的网络利用率更低。 嵌入式系统的这种常见的小的数据包造成了网络带宽的极大浪费。除了网络利用率不高之外,还有另外一个问题是产生TCP 数据包数量极多,网关和路由器会由于这些极大数量的小数据包而发生阻塞。
组块技术与其不足
通过以上分析,很自然的想到采用组块技术(clumping) 把一定数量的数据包组成一个帧,这样既能减小报头开销,又能减小TCP 数据包的数量,而且代码量增加很少。但是,这样组包会产生一个问题,TCP 在数据帧未达到一定大小之前不会传输数据,这样产生的延时会影响到数据的实时传输。因此,有必要对怎样避免这种延时进行研究。
Nagle 算法的由来
在因特网发展初期,由于bbs 和新闻组的流行,网络上充斥着大量的telnet 产生的小的数据包,数量极大的这些数据包使得路由器和网关发生了严重的阻塞现象,这和嵌入式系统中的情形类似。JoneNagle 提出了一种算法来对付这种棘手的小数据包问题,后来被称为Nagle 算法。
Nagle 算法与简单的组包( clumping) 技术不同,它和慢启动一样使用自计时( self clocking) 、用确认的到达来触发其余数据的传输。因此它没有引入额外的延时,而且能有效地减少网络上小数据包的流量。
Nagle 算法的描述
在一个连接上已经传输的数据还没有被确认的情况下,发送方的应用程序又生成了后续数据,并照常将数据送到输出缓冲区中,但这时并不发送后续报文段,而是等到有足够的数据填满一个达到最大长度的报文段之后再把缓冲区中的数据发送出去。
如果某个应用程序每次仅产生一个八位组的数据, TCP 会立即发送最初的那个八位组,但是在确认到达之前, TCP 会把后续数据存入缓冲区中。因此当应用程序生成数据的速率比网络的速率快很多时(如传送文件) ,后续的报文段将包含大量的数据,而当应用程序比网络速度更慢时(如用户敲键盘) ,就会发送较短的报文段而不必经过长的延时。
Nagle 算法在嵌入式环境的适用性
在嵌入式系统的环境中,嵌入式TCP 协议会面临着各种情况,比如一两个开关量的传输,或者是传感器数据实时的传输,而Nagle 算法能够自动适应网络速率和应用层数据流量的各种情况,因为它是以确认来触发的自计时的协议。
网络模拟
NS-2 是一个应用于网络研究的离散事件模拟器,它充分支持有线与无线网络上对于TCP、路由和多播协议的模拟。它自问世以来受到学术界的充分信赖,成为设计和检验新的协议和算法的权威网络模拟测试平台。
网络模拟环境的构建
图3 是本文构建的网络模拟环境:节点0 使用本文提出的嵌入式TCP 协议发送数据,节点1 使用用户投文协议(UDP) 组播协议来发送大量的数据,用于测试嵌入式TCP 协议在网络阻塞情况下的性能,节点2 和节点3 之间是瓶颈路径,模拟交换机之间的线路情况。[!--empirenews.page--]
嵌入式TCP 协议的性能指标有吞吐量(throughp ut) ,即单位时间内TCP 源节点发送的字节数;延时,即源节点的应用层发出数据到目的节点应用层接收到数据的时间量。
基于Nagle 的简化TCP 协议的吞吐率
作为一个简单确认的TCP 协议,因为窗口始终是1 ,所以吞吐率( t hroughp ut ) 是恒定的,由于采用Nagle 算法,不再有大量小数据包产生,提高了吞吐率,提高的倍数约等于Internet 数据包最大值除以应用层产生数据包大小。比如应用层产生的数据包是10 byte ,那么吞吐率就提高了1000/ 10 = 100 倍。
如图4 所示,接收到的数据是随着时间线性增长的,也就是说吞吐率是恒定的。最高的曲线是采用Nagle 算法的简化TCP 协议的吞吐率;最低的曲线是未采用Nagle 算法的简化TCP 协议在同样环境下的吞吐率;中间曲线为未经过简化的标准TCP 协议,因此可以从图中看出,采用Nagle 算法明显优于其他两种情况,并且大大改善了简化TCP 的吞吐率。
基于Nagle 的简化TCP 协议的响应时间
再看看延时的问题,Nagle 算法会立即传送最初的数据,然后再以大吞吐量发送余下的数据。这就导致,第一,吞吐率大大增加,使得传送数据更快;第二,产生的数据包数量减少,使得发生拥塞重传的机会也减少。图5 和6 中分别是标准TCP 协议的延时抖动(jit ter) 和采用Nagle 算法的TCP 协议的延时抖动。
图6 曲线在开始的尖峰说明了在数据连接的开始Nagle 算法会立即发送接收到的小数据包,而接下来是将接收的大量的数据打成大包发送。图6曲线的平滑情况说明了延时抖动很小,适合嵌入式系统中实时数据的传输。在同样的模拟参数下,标准TCP 协议发送了大量的数据包(120 个) ,而采用Nagle 算法的简化的TCP 协议发送了不到20 个数据包。显而易见,采用Nagle 算法的简化TCP 协议在吞吐率高的同时还节省了网络的带宽。
对该协议实用性的分析
网络协议的实用性体现为,在恶劣的网络环境(如数据丢失) 下,可以保持连接而且能够恢复数据的传输。
前面已经分析到,由于大大降低了网络上小数据包的数量,降低了网络带宽的需求,使得基于Nagle 算法的TCP 协议比普通TCP 协议出现阻塞的可能性大大降低。
如果一旦网络出现阻塞,会出现数据包的丢失。TCP 的数据发送方会接收到3 个重复的确认(ACK) 信号,基于Nagle 算法的简化TCP ,同样执行标准的重发数据的工作,重新发送丢失的数据包。由于发送窗口始终是1 ,则不存在“快速恢复”问题。
对该协议模拟的结果如图7 所示:图中横坐标是模拟时间,纵坐标是数据包的序列号。上面两条曲线是Tahoe TCP 的数据和确认,而下面两条曲线是基于Nagle 的TCP 的数据和确认。 图中Tahoe TCP在慢启动后的某个时刻,接收方收到了3 个相同的ACK确认包,表示网络出现了阻塞,而且传送相同的数据Tahoe TCP 的带宽占用比基于Nagle 的简化TCP 大多了。而基于Nagle 的简化TCP 却并未阻塞。
由以上分析可见, 基于Nagle 算法的简化的TCP 在数据传输方面是可靠的。可以广泛的在嵌入式TCP 中使用,并且与其他TCP 算法能够完全兼容,而且能够大幅度提高网络性能,减少网络阻塞,特别是在应用层数据量比较小但数据包数量却很多的情况下能够大大改善数据的吞吐率和网络占用率,是一种非常实用的算法。WindowsTM也在其Telnet 程序中使用了Nagle 算法。
基于Nagle 算法的TCP 协议由于算法简单,性能优秀,能够胜任广大的嵌入式Internet 的应用领域包括:工业控制、智能家居、智能监控、自动抄表,等等。该协议能够应用于实时性要求比较高的场合,但是如果实时性要求特别高而网络带宽富裕时则建议不采用Nagle 算法。
结 语
本文提出的基于Nagle 算法的简化TCP 协议,大大减轻了微处理器的运算负担和系统的存储空间,使得TCP 协议得以在普通8/ 16 位处理器上实采用了Nagle 算法,在不增加多少代码的情况下,提高了协议的吞吐率、降低了协议的带宽占用,在嵌入式应用中其吞吐率甚至高于未简化的标准TCP 协议。它的延时抖动基本是恒定的,非常适合嵌入式系统中的实时数据的传输。它发送少量的大数据包而不是大量的小数据包,从而节省了网络带宽。基于本文算法的自动抄表方案已经在浙大校园网、杭州网通、宁波网通、上海有线通等宽带网络下进行了现场测试,测试结果符合设计要求。
该方案已经被国内多家电表生产企业所采纳,并应用于新型网络电能表的生产上,这种网络电能表可以方便地实现网络化自动集抄系统,这些系统已经应用在上海、杭州、宁波等地的电力部门中。同时,基于本文方案的新型电能表以及其技术文件已经向全国电工仪器仪表标准化技术委员会进行了推荐和报批。