Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 合同模板 > LWIP协议栈详解,lwip协议栈详解pdf

LWIP协议栈详解,lwip协议栈详解pdf

收藏

本作品内容为LWIP协议栈详解,格式为 doc ,大小 228904 KB ,页数为 9页

LWIP协议栈详解


('1.TCP连接的建立和终止TCP是一个面向连接的协议,提供可靠的数据连接。在收发数据之前,需要在双方之间建立一条连接。下面以图①所示为例说明TCP连接的建立和终止。1.1TCP连接的建立1)请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1415531521)。这个SYN段为报文段1。2)服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。这三个报文段完成连接的建立。这个过程也称为三次握手(three-wayhandshake)。图①1.2TCP连接的终止建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。一个TCP连接在收到一个FIN后不能接收数据,但仍能发送数据,反之一个TCP连接在发送一个FIN后不能发送数据,但仍能接收数据。以客户端为主动关闭一方为例说明TCP连接的终止过程。首先客户端发送第一个FIN(报文段4),服务器收到FIN后,返回对该FIN的确认ACK(报文段5),然后通知应用层对方已经关闭连接,然后回复FIN(报文段6)。客户端收到该FIN后再回复一个确认ACK(报文段7),同时客户端关闭本地连接,而服务端收到该ACK后也最终关闭连接。2.TCP的滑动窗口协议2.1使用滑动窗口的原因TCP协议在工作时,如果发送端的TCP协议软件每传输一个数据分组后,必须等待接收端的确认才能够发送下一个分组,由于网络传输的时延,将有大量时间被用于等待确认,导致传输效率低下。为此TCP在进行数据传输时使用了滑动窗口机制。滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。2.2滑动窗口简介图②下面以上图为例说明TCP的滑动窗口协议。图中我们将字节从1至11进行标号。接收方通告的窗口称为提出的窗口(offeredwindow),如图所示窗口大小为6,它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:1)称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。2)当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。3)当右边沿向左移动时,我们称之为窗口收缩。HostRequirementsRFC强烈建议不要使用这种方式。但TCP必须能够在某一端产生这种情况时进行处理。因为窗口的左边沿受另一端发送的确认序号的控制,因此不可能向左边移动。如果接收到一个指示窗口左边沿向左移动的ACK,则它被认为是一个重复ACK,并被丢弃。如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据。3.TCP的超时重传机制3.1TCP的重传超时时间RTO的计算在计算RTO之前需估计往返时间(RTT)。RTT是某个字节的数据被发出到该字节被确认返回的时间间隔。由于路由器和网络流量均会变化,因此RTT可能经常会发生变化,TCP应该跟踪这些变化并相应地改变其超时时间RTO。在一段时间内可能会发送多个数据包,但只能选择其中一包作为计算RTT的值,直到该数据包被确认返回。才开始下一次的RTT估算。计算RTO的算法如下:Err=M-AA←A+gErrD←D+h(Err-D)RTO=A+4DM表示所测量到的RTT,A是被平滑的RTT(均值的估计器),Err是刚得到的测量结果与当前的RTT估计器之差。增量g起平均作用,取为1/8。而D则是被平滑的均值偏差。偏差的增益是h,取值为1/4。A和D均被用于计算下一个重传时间(RTO)。Lwip中有两个参数rttest和rttseq用于计算RTT;rttest表示开始计算RTT的滴答数(500ms一个滴答),rttesq是用于计算RTT的包的序号。下面是lwip中用于计算RTT和RTO的相关代码解析:/RTTestimationcalculations.Thisisdonebycheckingiftheincomingsegmentacknowledgesthesegmentweusetotakearound-triptimemeasurement.if(pcb->rttest&&TCP_SEQ_LT(pcb->rtseq,ackno)){m=tcp_ticks-pcb->rttest;/ThisistakendirectlyfromVJsoriginalcodeinhispaperm=m-(pcb->sa>>3);pcb->sa+=m;if(m<0){m=-m;}m=m-(pcb->sv>>2);pcb->sv+=m;pcb->rto=(pcb->sa>>3)+pcb->sv;pcb->rttest=0;}3.2TCP超时重传超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送一个数据以后就开启一个500ms的计时器,超时以后如果没有得到发送数据报的ACK报文,那么就重新发送数据。当超过设定的重传次数nrtx都没有相应的ACK返回,那么就主动断开socket连接。代码解析:++pcb->rtime;if(pcb->unacked!=NULL&&pcb->rtime>=pcb->rto){if(pcb->state!=SYN_SENT){pcb->rto=((pcb->sa>>3)+pcb->sv)<nrtx];}pcb->rtime=0;……tcp_rexmit_rto(pcb);}4.TCP的慢启动和拥塞避免算法4.1慢启动TCP刚开始发送数据时,并不是一下子就发送大量的数据分组,这在局域网中也许没问题。但如果收发双方存在路由器或较慢的链路。一些中间路由器存在缓存分组的功能,有可能耗尽路由器的存储空间,进而造成网络的拥塞。所以TCP中支持“慢启动算法”,它是在一个连接上发起数据流的方法。慢启动为TCP增加了一个窗口:拥塞窗口(记为cwnd),它是发送方使用的流量控制。刚开始拥塞窗口被初始化为一个报文段。慢启动期间,每收到一个报文段,cwnd就增加一个报文段。发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。以此类推,这是一种指数增加的关系。它是通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。4.2拥塞避免算法拥塞避免算法是用来处理分组丢失的算法,分组丢失时有两种指示:出现数据发送超时和收到重复的分组确认。当出现数据分组发送超时时,就会执行慢启动来实现拥塞避免。当出现3次以上收到重复的确认时,也会进入拥塞避免,这时执行快速重传和快速恢复算法,这个将在下面说明。拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh,个人感觉ssthresh的作用主要是用来说明当前是处于慢启动还是处于拥塞避免,当cwnd小于或等于ssthresh,处于慢启动;反之处于拥塞避免。该算法的工作过程如下:1)对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。2)TCP输出的分组数据大小不能超过cwnd和接收方通告窗口的大小。代码解析:wnd=LWIP_MIN(pcb->snd_wnd,pcb->cwnd);seg=pcb->unsent;……while(seg!=NULL&&ntohl(seg->tcphdr->seqno)-pcb->lastack+seg->len<=wnd){pcb->unsent=seg->next;tcp_output_segment(seg,pcb);……seg=pcb->unsent;}3)当出现超时或收到重复确认时,拥塞发生,ssthresh被设置为当前窗口大小的一半(cwnd和接收方通告窗口大小的最小值,但最少为2个报文段)。如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)。如果收到3次以上的重复确认,cwnd被设置为ssthresh加上3个报文段(进入快速重传和快速恢复阶段)。代码解析:if(pcb->unacked!=NULL&&pcb->rtime>=pcb->rto){……//与超时重传相关的部分eff_wnd=LWIP_MIN(pcb->cwnd,pcb->snd_wnd);pcb->ssthresh=eff_wnd>>1;if(pcb->ssthreshmss){pcb->ssthresh=pcb->mss2;}pcb->cwnd=pcb->mss;}4)当新的数据被对方确认时,就增加cwnd,若处于慢启动,则cwnd增加一个报文段;处于拥塞避免时,拥塞避免算法要求每次收到一个确认时将cwnd增加1/cwnd。代码解析:if(TCP_SEQ_BETWEEN(ackno,pcb->lastack+1,pcb->snd_max)){……if(pcb->state>=ESTABLISHED){if(pcb->cwndssthresh){if((u16_t)(pcb->cwnd+pcb->mss)>pcb->cwnd){pcb->cwnd+=pcb->mss;}}else{u16_tnew_cwnd=(pcb->cwnd+pcb->msspcb->mss/pcb->cwnd);if(new_cwnd>pcb->cwnd){pcb->cwnd=new_cwnd;}}}……}5.TCP的快速重传和快速恢复算法在说明快速重传与恢复算法之前,我们需要搞清楚以下几点:①为什么会收到重复的ACK?接收方没有收到自己期望的序号,而收到其他序号的报文段时就会产生重复的ACK。②为什么是三个以上的重复ACK才判定有可能是出现数据丢失呢?因为一个重复的ACK可能是由一个丢失的报文段引起的,也可能是由于仅仅出现了几个报文段的重新排序。如果是几个报文段的重新排序引起的,只可能产生1~2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。接下来执行的是快速恢复算法。③出现分组丢失时,为什么不执行慢启动来减少分组进入网络的速率?这是因为收到重复的ACK不仅仅告诉分组丢失了,也说明其他报文段已经进入了接收方的缓存,只不过处于失序状态,也就是说收发双方之间还有流动的数据,不必执行慢启动来突然减少数据流量。当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包,如果发送方收到一个重复的ACK,那么根据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd加1。如果能够严格按照该原则那么网络中很少会发生拥塞,事实上拥塞控制的目的也就在修正违反该原则的地方。这个算法通常按如下过程进行实现:1)当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。2)每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)。3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。代码解析:if(pcb->lastack==ackno){pcb->acked=0;if(pcb->snd_wl1+pcb->snd_wnd==right_wnd_edge){++pcb->dupacks;if(pcb->dupacks>=3&&pcb->unacked!=NULL){if(!(pcb->flags&TF_INFR)){tcp_rexmit(pcb);if(pcb->cwnd>pcb->snd_wnd)pcb->ssthresh=pcb->snd_wnd/2;elsepcb->ssthresh=pcb->cwnd/2;if(pcb->ssthresh<2pcb->mss){pcb->ssthresh=2pcb->mss;}pcb->cwnd=pcb->ssthresh+3pcb->mss;pcb->flags=TF_INFR;}else{if((u16_t)(pcb->cwnd+pcb->mss)>pcb->cwnd)pcb->cwnd+=pcb->mss;}}}}elseif(TCP_SEQ_BETWEEN(ackno,pcb->lastack+1,pcb->snd_max)){if(pcb->flags&TF_INFR){pcb->flags&=~TF_INFR;pcb->cwnd=pcb->ssthresh;}…….pcb->dupacks=0;pcb->lastack=ackno;…….}',)


  • 编号:1700665517
  • 分类:合同模板
  • 软件: wps,office word
  • 大小:9页
  • 格式:docx
  • 风格:商务
  • PPT页数:228904 KB
  • 标签:

广告位推荐

相关合同模板更多>