第五学时: 网络层
(一) 网络层的功能 异构网络互联原则,路由与转发的区别和工作原理,拥塞控制的一半处理方式。
(二) 路由算法 静态路由与动态路由的划分原则,距离-向量路由算法 ,链路状态路由算法 ,层次路由路由选择算法及其分类,Dijstra算法(求最短路由),OSPF部分详细讲解,. D-V法和L-S法(距离矢量法和链路状态法),介绍计算路由的方法,并写出路由表、画出路由树。
(三) IPv4 IPv4分组原则,是一种分等级的地址结构。IPv4地址与NAT,地址转换的必要性和原理。子网划分与子网掩码的基本思路和具体实践中的注意事项。CIDR的概念和作用,即消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,有效地分配 IPv4 的地址空间。
从概念上说,IP地址的层次结构具有两个重要特性:
每台主机分配了一个唯一的地址。
网络标识号的分配必须全球统一,但主机标识号可由本地分配,不需全球一致。
IP地址有不同的版本:IPv4、IPv6。现以当前因特网使用的IPv4(第4版本)为例说明IP编址,因特网(IP网)为每台主机分配一个唯一的4字节(32比特)IP地址。为了便于管理,把这32位地址按分级地址空间的树形表示法分为两个部分:网络号和主机号(net-id,host-id)。主机号为全0的网络地址定义为网络号,它标识因特网上的唯一网络。
4字节的IP地址,采用"点分十进制"的方法来表示,例如,202.119.224.93。每一个十进制数表示4个字节中的一个,排列次序从左到右。由于每个字节为8比特,所以每个十进制数只允许在0~255范围内。根据因特网上的网络规模,IP地址可分为A类、B类、C类、D类和E类。
(1) A类网:网络号为1字节,定义最高比特为0为A类网识别符,余下7比特为网络号,主机号则可有24比特编址。可见A类网支持大型网络,可用网络号为126个,每个A类网可含224=16777216个主机号。比如,IP地址为15.1.2.25,是A类网,其网络号为15,主机号为1.2.25。
(2) B类网:网络号为2字节,定义最高二比特为10为B类网识别符,余下14比特为网络号,主机号则可有16比特编址。B类网是中型网络,可用网络号为16382个,每个B类网可含216=65536个主机号。
(3) C类网:网络号为3字节,定义最高三比特为110为C类网识别符,余下21比特为网络号,主机号仅有8比特编址。C类网是小型网络,可用网络号为2097150个,每个C类网可含28=256个主机号,可用主机号为254个。
(4) D类网:不分网络号和主机号,定义最高四比特为1110为D类网址识别符,表示一个多播地址,即多目的地传输,可用来识别一组主机。
如何识别任一IP地址的属性?只须从点分法的最左一个十进制数,就可判断其归属。例如,1~126属A类网址,128~191属B类网址,192~223属C类网址,224~239属D类网址。除了以上四类网址外,还有E类地址,暂未使用。
对于因特网IP地址中有特定的专用地址,不作分配:
(1) 主机地址全为"0"
不论哪类网络,主机地址全为"0"表示指向本网,常用在路由表中。例如,18.0.0.0表示其网络号为18。
(2) 主机地址全为"1"
主机地址全为"1"表示广播地址,向特定的所在网上所有主机发送数据报。例如,IP地址为202.119.224.225,是要求指向202.119.224网上的所有主机转发数据报。
(3) 4字节32比特全为"1"
若IP地址4字节32比特全为"1",表示仅在本网内进行广播发送。
(4) 网络号127
TCP/IP协议规定网络号127不可用于任何网络。其中有一个特别地址:127.0.0.1称之为回送地址(loopback),它将信息通过自身的接口发送后返回,可用来测试端口状态。
ARP协议是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。DHCP协议透过 "租约" 的概念,有效且动态的分配客户端的 TCP/IP 设定,包括IP地址,子网掩码,网关,DNS等。ICMP协议 允许主机或路由器报告差错情况和提供有关异常情况的报告,阐明ICMP 不是高层协议,而是IP层的协议,是为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去,典型应用如ping, tracert等。
(四) IPv6
IPv6的主要特点,IPv6地址的特点和优点,包括扩展的地址层次结构,首部格式,选项,允许协议继续扩充,支持即插即用(即自动配置),支持资源的预分配。
IPv6数据包有一个IPv6报头、多个扩展报头和一个上层协议数据单元组成。
IPv6报头 (IPv6 Header)
每一个IPv6数据包都必须包含报头,其长度固定为40字节。IPv6基本报头也称之为固定报头。固定报头包含8个字段,总长度为40个字节。这8个字段分别为:版本、流量类型、流标签、有效载荷长度、下一个包头、跳限制、源IPv6地址、目的IPv6地址。
扩展报头 (Extension Header)
IPv6扩展报头是可能跟在基本IPv6报头后面的可选报头。IPv6数据包中可以包含一个或多个扩展报头,当然也可以没有扩展报头,这些扩展报头可以具有不同的长度。IPv6报头和扩展报头代替了IPv4报头及其选项。新的扩展报头格式增强了IPv6的功能,使其具有极大的扩展性。与IPv4报头中的选项不同,IPv6扩展报头没有最大长度的限制,因此可以容纳IPv6通信所需要的所有扩展数据。IPv6扩展报头是可能跟在基本IPv6报头后面的可选报头。为什么在IPv6中要设计扩展报头这种字段呢?我们知道在IPv4的报头中包含了所有的选项,因此每个中间路由器都必须检查这些选项是否存在,如果存在,就必须处理它们。这种设计方法会降低路由器转发IPv4数据包的效率。为了解决这种矛盾,在IPv6中,相关选项被移到了扩展报头中。中间路由器就不需要处理每一个可能出现的选项(在IPv6中,每一个中间路由器必需处理唯一的扩展报头是逐跳选项扩展报头),这种处理方式提高了路由器处理数据包的速度,也提高了其转发性能。下面是一些扩展报头:
逐跳选项报头(Hop-by-Hop Options header)
目标选项报头(Destination Options header)
路由报头(Routing header)
分段报头(Fragment header)
认证报头(Authentication header)
封装安全有效载荷报头(Encapsulating Security Payload header)
在典型的数据包中,并不是每一个数据包都包括所有的扩展报头。在中间路由器或目标需要一些特殊处理时,发送主机才会添加相应扩展报头(具体扩展报头内容下面会详细讲解)。如果数据包中没有扩展报头,也就是说数据包只包括基本的报头和上层协议单元,基本报头的下一个报头(Next Header)字段值指明上层协议类型。
上层协议数据单元 (Upper Layer Protocol Data Unit)
上层协议数据单元一般由上层协议包头和他的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。
【教学重点和难点】路由算法,子网划分
【典型习题讲解】子网划分
第六学时: 网络层(续)
(一) 路由协议 自治系统(AS),Internet路由选择协议分类(IGP和EGP), 两种常用内部网关协议包括RIP(基于D-V法)和OSPF(基于L-S法),BGP路由协议。
在动态路由中,管理员不再需要与静态配置那样对路由器上的路由表进行手工维护,而是在每台路由器上运行一个路由表的管理程序。这个路由表的管理程序会根据路由器上的接口的配置(如IP地址的配置)及所连接的链路的状态,生成路由表中的路由表项。这个路由表的管理程序也就是动态路由协议。采用动态路由协议管理路由表在大规模的网络中是十分有效的。
RIP(Routing Information Protocol)路由协议就是一种动态路由协议,它采用距离矢量算法,距离矢量算法就是相邻的路由器之间互相交换整个路由表,并进行矢量的叠加,最后达到知道整个网络路由。它通过UDP报文交换路由信息,每隔30秒向外发送一次更新报文。如果路由器经过180秒没有收到来自对端的路由更新报文,则将所有来自此路由器的路由信息标记为不可达,若在其后120秒内仍未收到更新报文,就将这些路由从路由表中删除。
RIP使用跳数(Hop Count)来衡量到达目的地的距离,路由器到与它直接相连网络的跳数为0,通过一个路由器可达的网络的跳数为1,其余依此类推。为限制收敛时间,RIP规定metric取值0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。
每个运行RIP的路由器管理一个路由数据库,该路由数据库包含了到网络所有可达目的地的一个路由项,这个路由项包含下列信息:
目的地址:主机或网络的地址。
下一跳地址:为到达目的地,本路由器要经过的下一个路由器地址。
接口:转发报文的接口。
Metric值:本路由器到达目的地的开销,可取值0~16之间的整数。
定时器:该路由项最后一次被修改的时间。
路由标记:区分该路由为内部路由协议路由还是外部路由协议路由的标记。
RIP启动和运行的整个过程可描述如下:
某路由器刚启动RIP时,以广播形式向其相邻路由器发送请求报文,相邻路由器收到请求报文后,响应该请求,并回送包含本地路由信息的响应报文。
路由器收到响应报文后,修改本地路由表,同时向相邻路由器发送触发修改报文,广播路由修改信息。相邻路由器收到触发修改报文后,又向其各自的相邻路由器发送触发修改报文。在多次的触发修改广播后,各路由器都能得到并保持最新的路由信息。
并且,RIP每隔30秒向其相邻路由器广播本地路由表,相邻路由器在收到报文后,对本地路由进行维护,选择一条最佳路由,再向其各自相邻网络广播修改信息,使更新的路由最终能达到全局有效。同时,RIP采用超时机制对过时的路由进行超时处理,以保证路由的实时性和有效性。
距离矢量协议无论是实现还是管理都比较简单,但是它的收敛速度慢,支持站点的数量有限,路由表更新信息将占用较大的网络带宽,并且会产生路由环路,为避免路由环路,RIP应用水平分割(Split Horizon)、毒性逆转(Poison Reverse)技术,并采用触发更新(Triggered Update)机制。RIP协议有RIP-1和RIP-2两个版本,RIP-2支持明文认证和 MD5 密文认证,并支持变长子网掩码等。
距离矢量协议也称为Bellman-Ford协议,网络中路由器向相邻的路由器发送它们的全部路由信息。路由器根据从相邻路由器接收到的信息来更新自己的路由表。然后,将信息传递到它的相邻路由器。这样逐级的传递下去以达到全网同步。也就是说距离矢量路由表中的某些路由项有可能建立在第2 手信息的基础之上的,每个路由器都不了解整个网络拓扑,它们只知道与自己直接相连的网络情况,并根据从邻居得到的路由信息更新自己的路由表,进行矢量行叠加后转发给其它的邻居。
距离矢量路由协议启动时会首先初始化路由表,路由器在路由表中生成其直连路由并传播出去,直连路由是指与其直接相连的网络的情况。然后,路由器会定期地把路由表传送给相邻的路由器,让其它路由器知道自己的网络情况。
每个路由器收到一条RIP选路信息后的计算过程如下。路由表每行至少包括三个字段: (目的网络,跳数,下一跳路由器)
例如,(D,2,R)表示,到目的网络D的报文要送到相邻的路由器R,跳数为2跳。
当收到相邻路由器R发来的一个跳数为M,目的站为D的更新消息时,本机将其与现有的路由表比较:
如果:
1.本机中没有到D的路由存在,则生成路由表项(目的网络,跳数,下一跳路由器):(D,M+1,R);
2.否则,如果存在(D, * ,R),则更新为 (D,M+1,R);
3.否则,如果存在到D的路由跳数大于 M+1,则更新为(D,M+1,R);
4.否则,不更新。
在经过了若干个更新周期后,路由信息会被传递到每台路由器上,达到平衡。
OSPF工作原理分析
OSPF是一种分层次的路由协议,其层次中最大的实体是AS(自治系统),即遵循共同路由策略管理下的一部分网络实体。在每个AS中,将网络划分为不同的区域。每个区域都有自己特定的标识号。对于主干(backbone)区域,负责在区域之间分发链路状态信息。这种分层次的网络结构是根据OSPF的实际提出来的。当网络中自治系统非常大时,网络拓扑数据库的内容就更多,所以如果不分层次的话,一方面容易造成数据库溢出,另一方面当网络中某一链路状态发生变化时,会引起整个网络中每个节点都重新计算一遍自己的路由表,既浪费资源与时间,又会影响路由协议的性能(如聚合速度、稳定性、灵活性等)。因此,需要把自治系统划分为多个域,每个域内部维持本域一张唯一的拓扑结构图,且各域根据自己的拓扑图各自计算路由,域边界路由器把各个域的内部路由总结后在域间扩散。这样,当网络中的某条链路状态发生变化时,此链路所在的域中的每个路由器重新计算本域路由表,而其它域中路由器只需修改其路由表中的相应条目而无须重新计算整个路由表,节省了计算路由表的时间。
OSPF由两个互相关联的主要部分组成:“呼叫”协议和“可靠泛洪”机制。呼叫协议检测邻居并维护邻接关系,可靠泛洪算法可以确保统一域中的所有的OSPF路由器始终具有一致的链路状态数据库,而该数据库构成了对域的网络拓扑和链路状态的映射。链路状态数据库中每个条目称为LSA(链路状态通告),共有5种不同类型的LSA,路由器间交换信息时就是交换这些LSA.每个路由器都维护一个用于跟踪网络链路状态的数据库,然后各路由器的路由选择就是基于链路状态,通过Dijkastra算法建立起来最短路径树,用该树跟踪系统中的每个目标的最短路径。最后再通过计算域间路由、自治系统外部路由确定完整的路由表。与此同时,OSPF动态监视网络状态,一旦发生变化则迅速扩散达到对网络拓扑的快速聚合,从而确定出新的网络路由表。
OSPF的设计实现要涉及到指定路由器、备份指定路由器的选举、协议包的接收、发送、泛洪机制、路由表计算等一系列问题。
Dijkstra算法的描述如下:
(1)初始化集合E,使之只包含源节点S,并初始化集合R,使之包含所有其它节点。初始化路径列O,使其包含一段从S起始的路径。这些路径的长度值等于相应链路的量度值,并以递增顺序排列列表O.
(2)若列表O为空,或者O中第1个路径长度为无穷大,则将R中所有剩余节点标注为不可达,并终止算法。
(3)首先寻找列表O中的最短路径P,从O中删除P.设V为P的最终节点。若V已在集合E中,继续执行步骤2.否则,P为通往V的最短路径。将V从R移至E.
(4)建立一个与P相连并从V开始的所有链路构成的侯选路径集合。这些路径的长度是P的长度加上与P相连的长度。将这些新的链路插入有序表O中,并放置在其长度所对应的等级上。继续执行步骤2.
Dijkstra算法举例:
下面我们以路由器A为例,来说明最短路径树的建立过程:
(1)路由器A找到了路由器B、C,将它们列入候选列表{B:1;C:2}.
(2)从候选列表中找出最小代价项B,将B加入最短路径树并从候选列表中删除。接着从B开始寻找,找到了D,将其放入候选列表{C:2;D:2}.
(3)从列表中找出C,再由C又找到了D.但此时D的代价为4,所以不再加入候选列表。最后将D加入到最短路径树。此时候选列表为空,完成了最短路径树的计算。
OSPF路由表的计算与实现
有关路由表的计算是OSPF的核心内容,它是动态生成路由器内核路由表的基础。在路由表条目中,应包括有目标地址、目标地址类型、链路的代价、链路的存活时间、链路的类型以及下一跳等内容。关于整个计算的过程,主要由以下五个步骤来完成:
(1)保存当前路由表,当前存在的路由表为无效的,必须从头开始重新建立路由表;
(2)域内路由的计算,通过Dijkstra算法建立最短路径树,从而计算域内路由;
(3)域间路由的计算,通过检查Summary-LSA来计算域间路由,若该路由器连到多个域,则只检查主干域的Summary-LSA;
(4)查看Summary-LSA:在连到一个或多个传输域的域边界路由器中,通过检查该域内的Summary-LSA来检查是否有比第(2)(3)步更好的路径;
(5)AS外部路由的计算,通过查看AS-External-LSA来计算目的地在AS外的路由。
通过以上步骤,OSPF生成了路由表。但这里的路由表还不同于路由器中实现路由转发功能时用到的内核路由表,它只是OSPF本身的内部路由表。因此,完成上述工作后,往往还要通过路由增强功能与内核路由表交互,从而实现多种路由协议的学习。
(二) IP组播 组播的概念,地址 ,路由算法,组播协议主要包括组管理协议(IGMP)和组播路由协议。组播路由协议可分为三类:密集模式协议(如DVMRP,PIM-DM)、稀疏模式协议(如PIM-SM,CBT)和链路状态协议(MOSPF)。主要介绍PIM-DM和PIM-SM协议。组播树的建立,加入和退出组播的过程。
(三) 移动IP 移动IP的概念 ,通信过程
(四) 网络层设备 路由器的组成和功能 ,路由表与路由转发
【教学重点和难点】RIP,OSPF路由协议,组播和移动IP的概念
【典型习题讲解】OSPF路由协议
第七学时: 传输层
(一) 传输层提供的服务 传输层的作用,是通信子网与资源子网的桥梁,设置目的是在源、目主机的进程间提供可靠的端对端通信,分析传输层与数据链路层的异同点,网络服务质量类型(三类:A型、B型和C型)。传输层的功能,寻址与端口,无连接服务与面向连接服务。
(二) UDP协议 UDP数据报,校验,主要特点为,发送数据之前不需要建立连接,UDP 的主机不需要维持复杂的连接状态表,UDP 用户数据报只有8个字节的首部开销,网络出现的拥塞不会使源主机的发送速率降低。对实时应用很重要。
用户数据报协议是对IP协议组的扩充,它增加了一种机制,发送方使用这种机制可以区分一台计算机上的多个接收者。每个UDP报文除了包含某用户进程发送数据外,还有报文目的端口的编号和报文源端口的编号,从而使UDP的这种扩充,使得在两个用户进程之间的递送数据报成为可能。
UDP是依靠IP协议来传送报文的,因而它的服务和IP一样是不可靠的。这种服务不用确认、不对报文排序、也不进行流量控制,UDP报文右能会出现丢失、重复、失序等现象。
(三) TCP协议 TCP段 ,连接管理,即TCP连接建立与释放(三次握手),可靠传输 ,流量控制与拥塞控制,包括可变发送窗口协议等。TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节,在 TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。
TCP提供的是一种可靠的数据流服务。当传送受差错干扰的数据,或基础网络故障,或网络负荷太重而使网际基本传输系统(无连接报文递交系统)不能正常工作时,就需要通过其它协议来保证通信的可靠。TCP就是这样的协议,它对应于OSI模型的运输层,它在IP协议的基础上,提供端到端的面向连接的可靠传输。
TCP采用“带重传的肯定确认”技术来实现传输的可靠性。简单的“带重传的肯定确认”是指与发送方通信的接收者,每接收一次数据,就送回一个确认报文,发送者对每个发出去的报文都留一份记录,等到收到确认之后再发出下一报文分组。发送者发出一个报文分组时,启动一个计时器,若计时器计数完毕,确认还未到达,则发送者重新送该报文分组。
简单的确认重传严重浪费带宽,TCP还采用一种称之为“滑动窗口”的流量控制机制来提高网络的吞吐量,窗口的范围决定了发送方发送的但未被接收方确认的数据报的数量。每当接收方正确收到一则报文时,窗口便向前滑动,这种机制使网络中未被确认的数据报数量增加,提高了网络的吞吐量。
TCP通信建立在面向连接的基础上,实现了一种“虚电路”的概念。双方通信之前,先建立一条连接,然后双方就可以在其上发送数据流。这种数据交换方式能提高效率,但事先建立连接和事后拆除连接需要开销。TCP连接的建立采用三次握手的过程,整个过程由发送方请求连接、接收方再发送一则关于确认的确认三个过程组成。
TCP的拥塞控制和流量控制是一个比较复杂的问题,它包括发送端发送报文的大小和报文的时机,接收端发送确认和窗口大小的策略。同时还要兼顾不同网络的具体情况,算法要具有一定的自适应性,在保证可靠传输的同时,尽量提高传输效率。
这里主要对目前公认的比较行之有效的一些拥塞控制和流量控制算法进行介绍和验证。主要有:TCP的滑动窗口机制、TCP的糊涂窗口综合症和Nagle算法分析、网络拥塞的处理、TCP的超时与重传、TCP的窗口探查技术、TCP的快重传和快恢复。
TCP的滑动窗口机制
为了提高报文段的传输速率,TCP采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。发送窗口在连接建立时由双方商定,但在通信过程中,接收端可根据自己的接收缓存的大小,随时动态地调整发送端的发送窗口的上限值。这就是接收端窗口rwnd(receiver window),这个值被放在接收端发送的TCP报文段首部的窗口字段中。
同时,发送端根据其对当前网络拥塞程度的估计而确定的窗口值,叫做拥塞窗口cwnd(congestion window)。其大小与网络的带宽和时延密切相关。
发送端设置的当前能够发送数据量的大小叫做发送窗口,发送窗口的上限值由下面公式确定:
发送窗口的上限值=Min[cwnd,rwnd]
rwnd由接收端根据其接收缓存确定,发送端确定cwnd比较复杂,详细情况在慢启动和拥塞避免一节中叙述。
发送窗口的左边沿对应已发送数据中被确认的最高序号+1,其右边沿对应左边沿的序号加上发送窗口的大小。在数据传输的过程中,这个发送窗口不时地向右移动构成了滑动窗口。窗口的两个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:
(1)当窗口左边沿向右边沿靠近时,我们称之为窗口合拢。这种现象发生在数据被发送和确认时。如果窗口的左边沿与右边沿重合,则称其为一个零窗口,此时发送方不能发送任何数据。
(2)当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。
(3)当右边沿向左移动时,我们称之为窗口收缩。这种情况一般不会发生,但是TCP必须能够在某一端产生这种情况时进行处理。
TCP的糊涂窗口综合症和Nagle算法
TCP的流量控制方案是基于窗口的,有可能会出现一种被称为“糊涂窗口综合症”的状况。其中一种情况是,如果接受方处理较慢,并且每次从其接收缓存取走很少量数据就通告这个很小的窗口,而不是等到有较大的窗口时才通告;发送方得到这个很小的接收窗口后,立即按照这个窗口大小组成一个TCP报文段发送出去,而不是等待其它的数据以便发送一个大的报文段。如此往复,会导致网络的传输效率降低。
对于糊涂窗口综合症的现象,发送和接收双方均可以采取措施加以避免。
发送端比较有效的方法是采用Nagle算法。该算法主要是:在连接建立开始发送数据时,立即按序发送缓存中的数据(必须小于或等于MSS),在已经传输的数据还未被确认的情况下,后续数据的发送由数据是否足以填满发送缓存的一半或一个最大报文段长度决定。
接收端采用推迟确认技术,对收到的报文段进行确认和通告窗口的前提条件是:接收缓存的可用空间至少得到总空间的一半或者达到最大报文长度之后。如果条件不满足,则推迟发送确认和窗口通告。
总之,避免糊涂窗口综合症的总的原则是:接收端避免通告小窗口,发送端尽量将数据组成较大的报文段发送出去。
TCP的慢启动和拥塞避免
为了保证网络平稳高效的运行,防止网络流量的剧烈起伏震荡。1999年公布的因特网建议标准[RFC2581]提出了慢启动(slow-start)和拥塞避免算法(congestion avoidance)。
慢启动算法的原理是:在主机开始发送数据时,采用试探的方式,由小到大逐渐增大发送端的拥塞窗口数值。通常是在一开始cwnd应设置为不超过2×MSS(最大报文段)个字节,在每收到一个对新的报文段的确认后,拥塞窗口至多增加1个MSS的数值。使分组注入到网络的速率比较合理。
拥塞避免算法是使发送端的拥塞窗口cwnd每经过一个RTT就增加一个MSS的大小(而不管在时间RTT内收到了几个ACK)。
慢启动与拥塞避免算法相比较,拥塞窗口增加的方式分别是指数方式和线性方式。慢启动算法使发送端在发送数据的开始阶段逐步增加注入网络的分组数,但随着拥塞窗口按指数方式快速增长,势必会引起网络拥塞。需要在网络拥塞之前,将拥塞窗口的增长速率降下来,也就是将慢启动算法切换到拥塞避免算法。因此,需要设置一个慢启动门限变量ssthresh,利用ssthresh得到慢启动和拥塞避免的综合算法:
当cwnd<ssthresh时,使用慢启动算法;
当cwnd>ssthresh时,使用拥塞避免算法;
当cwnd=ssthresh时,既可以使用慢启动算法,也可以使用拥塞避免算法。
网络拥塞的处理
网络拥塞是指发送端没有按时收到确认报文或者收到了重复的确认报文。
在任何时候,只要发送端发现网络拥塞,根据没有得到确认的已发送数据量FlightSize,给出如下公式设置慢启动门限值:ssthresh≤max(FlightSize/2,2×MSS)。
以及设置拥塞窗口:cwnd=1。
然后,重新执行上一节所述的慢启动和拥塞避免的综合算法。
这样,能够迅速地减少主机发送到网络中的分组数,使得发生拥塞的主机或者路由器有时间把队列中的积压分组处理完毕。
TCP的超时与重传
超时与重传机制是TCP中最主要和最复杂的技术之一。发送端在每发送一个报文段,TCP为其保留一个复本、设定一个定时器并等待确认信息。如果定时器超时,而发送的报文段中的数据仍未得到确认,则重传这一报文段。因此可见,定时器重传数据的确定是关键。
针对网络环境的复杂性,TCP采用了一种自适应算法,提出超时重传时间应略大于平均往返时延RTT,而RTT是根据各个报文段的往返时延样本的加权平均得出的。如何比较精确的估计RTT的值,Karn算法是目前公认的效果较好的算法。
Karn算法提出在计算平均往返时延RTT时,不计算发生过报文段重传的往返时延样本;同时报文段每重传一次,相应增大重传时间:
新的重传时间=γ×(旧的重传时间)
其中,系数γ的典型值是2。并且,当不再发生报文段重传时,才根据报文段的往返时延更新RTT和重传时间的数值。
这样得出的平均往返时延RTT和重传时间就比较准确,并且实践证明,该方法比较合理和有效。
TCP的窗口探查技术
当接收端的接收缓存已满,不能继续接收数据,需要向发送端发送一个窗口为0的通告报文。发送端接收到这个报文后,停止发送数据,等待新的窗口通告。如果接收端通过确认报文通告窗口,TCP协议并不对这个确认报文进行确认,如果这个确认丢失了,则双方就有可能因为等待对方而使连接中止:接受方等待接收数据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接受方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查(window probe),窗口探查是包含一个字节的数据的报文段。
TCP的快重传和快恢复
为了避免TCP因等待重传定时器超时而空闲较长时间,又提出了两个新的拥塞控制算法:快重传和快恢复。
快重传算法是指当发送端连续收到三个重复的ACK报文时,即可认为某一报文段丢失并且网络仍能够进行正常报文传输。因此,不必等待那个报文的定时器超时,而直接重传那个认为是丢失的报文段。即在某些情况下更早地重传被估计为丢失的报文段。
快恢复算法是慢启动算法的一个补充,它与快重传算法配合使用。具体步骤如下:
(1) 当发送端收到连续n(n≥3)个重复的ACK,设置慢启动门限值:
ssthresh≤max(FlightSize/2,2×MSS)
同时,将cwnd设置为ssthress+n×MSS。
(2) 如果发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。
(3) 若收到了确认新的报文段的ACK,就将cwnd缩小到ssthress。
在采用快恢复算法时,慢启动算法只在TCP连接建立时才使用
【教学重点和难点】无连接服务与面向连接服务,流量控制与拥塞控制 |