实验指导书NetRiver系列计算机网络实验系统NetRiver20001目录1滑动窗口协议实验11.
1实验目的11.
2实验要求11.
3实验内容11.
4实验帮助11.
4.
1处理流程41.
4.
2接口函数说明52IPV4协议收发实验72.
1实验目的72.
2实验要求72.
3实验内容72.
4实验帮助72.
4.
1处理流程82.
4.
2IPv4分组头部格式92.
4.
3接口函数说明103IPV4协议转发实验123.
1实验目的123.
2实验要求123.
3实验内容123.
4实验帮助133.
4.
1路由表维护153.
4.
2转发处理流程153.
4.
3实验接口函数154IPV6协议收发实验194.
1实验目的194.
2实验要求19计算机网络实验系统NetRiver2000--24.
3实验内容194.
4实验帮助194.
4.
1处理流程204.
4.
2IPv6分组头部格式214.
4.
3数据结构说明224.
4.
4接口函数说明225IPV6协议转发实验245.
1实验目的245.
2实验要求245.
3实验内容245.
4实验帮助255.
4.
1路由表维护275.
4.
2转发处理流程275.
4.
3实验接口函数276RIP协议实验316.
1实验目的316.
2实验要求316.
3实验内容316.
4实验帮助326.
4.
1RIP协议介绍326.
4.
2实验拓扑356.
4.
3需要实现的接口函数356.
4.
4系统提供的全局变量376.
4.
5系统提供的接口函数377TCP协议实验387.
1实验目的387.
2实验要求387.
3实验内容397.
4实验帮助407.
4.
1TCP报文头部格式42计算机网络实验系统NetRiver200037.
4.
2数据结构437.
4.
3接收和发送处理437.
4.
4Socket接口各函数处理447.
4.
5系统提供的接口函数457.
4.
6需要完成的接口函数468状态机实验错误!
未定义书签.
8.
1实验目的508.
2实验要求508.
3实验内容508.
4实验帮助508.
4.
1BGP协议介绍508.
4.
2需要实现的接口函数558.
4.
3数据结构定义598.
4.
4系统提供的接口函数599IPSEC协议实验619.
1实验目的619.
2实验要求619.
3实验内容619.
4实验帮助619.
4.
1IPSEC协议介绍619.
4.
2需要实现的接口函数679.
4.
3数据结构以及宏定义749.
4.
4系统提供的接口函数7710IPV4协议交互实验9510.
1实验目的9510.
2实验要求9510.
3实验内容9510.
4实验帮助9511RIP协议交互实验97计算机网络实验系统NetRiver2000--411.
1实验目的9711.
2实验要求9711.
3实验内容9711.
4实验帮助9811.
4.
1RIP协议介绍9811.
4.
2实验拓扑10111.
4.
3实验界面10112IPV6协议交互实验10412.
1实验目的10412.
2实验要求10412.
3实验内容10412.
4实验帮助10413TCP协议交互实验10613.
1实验目的10613.
2实验要求10613.
3实验内容10613.
4实验帮助10614参考文献109计算机网络实验系统NetRiver20005计算机网络实验系统NetRiver200011滑动窗口协议实验1.
1实验目的计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议.
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解数据链路层协议中的"滑动窗口"技术的基本工作原理,掌握计算机网络协议的基本实现技术.
1.
2实验要求在一个数据链路层的模拟实现环境中,用C语言实现下面三个数据链路层协议.
1)1比特滑动窗口协议2)回退N帧滑动窗口协议3)选择性重传协议1.
3实验内容充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时或者错误时对部分帧进行重传.
编写停等及退回N滑动窗口协议函数,响应系统的发送请求、接收帧消息以及超时消息,并根据滑动窗口协议进行相应处理.
编写选择性重传协议函数,响应系统的发送请求、接受帧消息以及错误消息,并根据滑动窗口协议进行相应处理.
1.
4实验帮助1)窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.
发送窗口和接收窗口的序号的上下界不计算机网络实验系统NetRiver2000--2一定要一样,甚至大小也可以不同.
不同的滑动窗口协议窗口大小一般不同.
发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧.
下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):图6.
1窗口机制示意图分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合.
接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息.
此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列.
至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧.
接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧.
此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧.
此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列.
至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧.
此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧.
此时接收窗口状态仍不变.
若从滑动窗口的观点来统一看待1比特滑动窗口、回退N帧和选择性重传这三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已.
1比特滑动窗口协议:发送窗口=1,接收窗口=1;回退N帧协议和选择性重传协议:发窗口>1,接收窗口>1.
2)1比特滑动窗口协议计算机网络实验系统NetRiver20003当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait).
该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧.
由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号.
由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了.
其发送方和接收方运行的流程图如下所示.
图6.
21比特滑动窗口协议流程图在两个主机端系统通信的环境中,网络的拓扑可以简化为两台主机直接相连,中间的具体连接方式可以抽象为一条简单的链路,如图6.
3所示.
滑计算机网络实验系统NetRiver2000--4动窗口实验就是要在实验系统客户端的开发平台上,实现滑动窗口协议发送端的功能.
图6.
3实验环境网络拓扑结构1.
4.
1处理流程1)停等协议和回退N帧协议测试函数包括停等协议测试函数stud_slide_window_stop_and_wait和回退N帧协议测试函数stud_slide_window_back_n_frame,在下列情况系统会调用学生的测试函数.
当发送端需要发送帧时,会调用学生测试函数,并置参数messageType为MSG_TYPE_SEND,测试函数应该将该帧缓存,存入发送队列中.
若发送窗口还未打开到规定限度,则打开一个窗口,并将调用SendFRAMEPacket函数将该帧发送.
若发送窗口已开到限度,则直接返回,相当于直接进入等待状态.
当发送端收到接收端的ACK后,会调用学生测试函数,并置参数messageType为MSG_TYPE_RECEIVE,测试函数应该检查ACK值后,将该ACK对应的窗口关闭.
由于关闭了窗口,等待发送的帧可以进入窗口并发送,因此,此时若发送队列中存在等待发送的帧应该将一个等待发送的帧发送并打开一个新的窗口.
发送每发送一个帧,系统都会为他创建一个定时器,当被成功ACK后,定时器会被取消,若某个帧在定时器超时时间仍未被ACK,系统则会调用测试函数,并置参数messageType为MSG_TYPE_TIMEOUT,告知测试函数某帧超时,测试函数应该将根据帧序号将该帧以及后面发送过的帧重新发送.
2)选择性重传协议测试函数包括stud_slide_window_choice_frame_resend,在下列情况下计算机网络实验系统NetRiver20005系统会调用学生的测试函数.
当发送端需要发送帧时,会调用学生测试函数,并置参数messageType为MSG_TYPE_SEND,测试函数应该将该帧缓存,存入发送队列中.
若发送窗口还未打开到规定限度,则打开一个窗口,并将调用SendFRAMEPacket函数将该帧发送.
若发送窗口已开到限度,则直接返回,相当于直接进入等待状态.
当发送端收到接收端的ACK后,会调用学生测试函数,并置参数messageType为MSG_TYPE_RECEIVE,测试函数应该检查ACK值后,将该ACK对应的窗口关闭.
由于关闭了窗口,等待发送的帧可以进入窗口并发送,因此,此时若发送队列中存在等待发送的帧应该将一个等待发送的帧发送并打开一个新的窗口.
当发送端收到接收端的帧类型为NAK(表示出错的帧号)后,会调用学生测试函数,并置参数messageType为MSG_TYPE_RECEIVE,测试函数应该检查NAK值后,系统则会调用测试函数,告知测试函数某帧错误,测试函数应该将根据帧序号将该帧重新发送.
1.
4.
2接口函数说明1.
4.
2.
1需要实现的接口函数1)停等协议测试函数intstud_slide_window_stop_and_wait(char*pBuffer,intbufferSize,UINT8messageType)参数:pBuffer:指向系统要发送或接收到的帧内容的指针,或者指向超时消息中超时帧的序列号内容的指针bufferSize:pBuffer表示内容的长度messageType:传入的消息类型,可以为以下几种情况MSG_TYPE_TIMEOUT某个帧超时MSG_TYPE_SEND系统要发送一个帧MSG_TYPE_RECEIVE系统接收到一个帧的ACK对于MSG_TYPE_TIMEOUT消息,pBuffer指向数据的前四个字节为超时帧的序列号,以UINT32类型存储,在与帧中的序列号比较时,请注意字节序,并进行必要的转换.
计算机网络实验系统NetRiver2000--6对于MSG_TYPE_SEND和MSG_TYPE_RECEIVE类型消息,pBuffer指向的数据的结构如以下代码中frame结构的定义.
typedefenum{data,ack,nak}frame_kind;typedefstructframe_head{frame_kindkind;//帧类型unsignedintseq;//序列号unsignedintack;//确认号unsignedchardata[100];//数据};typedefstructframe{frame_headhead;//帧头unsignedintsize;//数据的大小};2)回退N帧协议测试函数intstud_slide_window_back_n_frame(char*pBuffer,intbufferSize,UINT8messageType)参数:该函数参数定义同停等协议测试函数.
3)选择性重传协议测试函数intstud_slide_window_choice_frame_resend(char*pBuffer,intbufferSize,UINT8messageType)该函数参数定义同停等协议测试函数.
1.
4.
2.
2系统提供的接口函数1)发送帧函数externvoidSendFRAMEPacket(unsignedchar*pData,unsignedintlen);参数:pData:指向要发送的帧的内容的指针len:要发送的帧的长度计算机网络实验系统NetRiver200072IPv4协议收发实验2.
1实验目的IPv4协议是互联网的核心协议,它保证了网络节点(包括网络设备和主机)在网络层能够按照标准协议互相通信.
IPv4地址唯一标识了网络节点.
在我们日常使用的计算机的主机协议栈中,IPv4协议必不可少,它能够接收网络中传送给本机的分组,同时也能根据上层协议的要求将报文封装为IPv4分组发送出去.
本实验通过设计实现主机协议栈中的IPv4协议,让学生深入了解网络层协议的基本原理,学习IPv4协议基本的分组接收和发送流程.
另外,通过本实验,学生可以初步接触互联网协议栈的结构和计算机网络实验系统,为后面进行更为深入复杂的实验奠定良好的基础.
2.
2实验要求根据计算机网络实验系统所提供的上下层接口函数和协议中分组收发的主要流程,独立设计实现一个简单的IPv4分组收发模块.
要求实现的主要功能包括:1)IPv4分组的基本接收处理;2)IPv4分组的封装发送;注:不要求实现IPv4协议中的选项和分片处理功能2.
3实验内容1)实现IPv4分组的基本接收处理功能对于接收到的IPv4分组,检查目的地址是否为本地地址,并检查IPv4分组头部中其它字段的合法性.
提交正确的分组给上层协议继续处理,丢弃错误的分组并说明错误类型.
2)实现IPv4分组的封装发送根据上层协议所提供的参数,封装IPv4分组,调用系统提供的发送接口函数将分组发送出去.
2.
4实验帮助在主机协议栈中,IPv4协议主要承担辨别和标识源IPv4地址和目的IPv4计算机网络实验系统NetRiver2000--8地址的功能,一方面接收处理发送给自己的分组,另一方面根据应用需求填写目的地址并将上层报文封装发送.
IPv4地址可以在网络中唯一标识一台主机,因而在相互通信时填写在IPv4分组头部中的IPv4地址就起到了标识源主机和目的主机的作用.
在后面IPv4分组的转发实验中,我们还将深入学习IPv4地址在分组转发过程中对选择转发路径的重要作用.
在两个主机端系统通信的环境中,网络的拓扑可以简化为两台主机直接相连,中间的具体连接方式可以抽象为一条简单的链路,如图1.
1所示.
IPv4分组收发实验就是要在实验系统客户端的开发平台上,实现IPv4分组的接收和发送功能.
图1.
1实验环境网络拓扑结构2.
4.
1处理流程客户端接收到测试服务器发送来的IPv4分组后,调用接收接口函数stud_ip_recv()(图1.
2中接口函数1).
学生需要在这个函数中实现IPv4分组接收处理的功能.
接收处理完成后,调用接口函数ip_SendtoUp()将需要上层协议进一步处理的信息提交给上层协议(图1.
2中接口函数2);或者调用函数ip_DiscardPkt()丢弃有错误的分组并报告错误类型(图1.
2中函数5).
在上层协议需要发送分组时,会调用发送接口函数stud_ip_Upsend()(图1.
2中接口函数3).
学生需要在这个函数中实现IPv4分组封装发送的功能.
根据所传参数完成IPv4分组的封装,之后调用接口函数ip_SendtoLower()把分组交给下层完成发送(图1.
2中接口函数4).
计算机网络实验系统NetRiver20009图1.
2实验接口函数示意图2.
4.
1.
1接收流程在接口函数stud_ip_recv()中,需要完成下列处理步骤(仅供参考):1)检查接收到的IPv4分组头部的字段,包括版本号(Version)、头部长度(IPHeadlength)、生存时间(Timetolive)以及头校验和(Headerchecksum)字段.
对于出错的分组调用ip_DiscardPkt()丢弃,并说明错误类型.
2)检查IPv4分组是否应该由本机接收.
如果分组的目的地址是本机地址或广播地址,则说明此分组是发送给本机的;否则调用ip_DiscardPkt()丢弃,并说明错误类型.
3)如果IPV4分组应该由本机接收,则提取得到上层协议类型,调用ip_SendtoUp()接口函数,交给系统进行后续接收处理.
2.
4.
1.
2发送流程在接口函数stud_ip_Upsend()中,需要完成下列处理步骤(仅供参考):1)根据所传参数(如数据大小),来确定分配的存储空间的大小并申请分组的存储空间.
2)按照IPv4协议标准填写IPv4分组头部各字段,标识符(Identification)字段可以使用一个随机数来填写.
(注意:部分字段内容需要转换成网络字节序)3)完成IPv4分组的封装后,调用ip_SendtoLower()接口函数完成后续的发送处理工作,最终将分组发送到网络中.
2.
4.
2IPv4分组头部格式IPv4分组头部格式如图1.
3所示,具体字段的定义请参考教材[1]和文献[2].
计算机网络实验系统NetRiver2000--10图1.
3IPv4分组头部格式2.
4.
3接口函数说明2.
4.
3.
1需要实现的接口函数1)接收接口intstud_ip_recv(char*pBuffer,unsignedshortlength)参数:pBuffer:指向接收缓冲区的指针,指向IPv4分组头部length:IPv4分组长度返回值:0:成功接收IP分组并交给上层处理1:IP分组接收失败2)发送接口intstud_ip_Upsend(char*pBuffer,unsignedshortlen,unsignedintsrcAddr,unsignedintdstAddr,byteprotocol,bytettl)参数:pBuffer:指向发送缓冲区的指针,指向IPv4上层协议数据头部len:IPv4上层协议数据长度srcAddr:源IPv4地址dstAddr:目的IPv4地址protocol:IPv4上层协议号ttl:生存时间(TimeToLive)计算机网络实验系统NetRiver200011返回值:0:成功发送IP分组1:发送IP分组失败2.
4.
3.
2系统提供的接口函数1)丢弃分组voidip_DiscardPkt(char*pBuffer,inttype)参数:pBuffer:指向被丢弃分组的指针type:分组被丢弃的原因,可取以下值:STUD_IP_TEST_CHECKSUM_ERRORIP校验和出错STUD_IP_TEST_TTL_ERRORTTL值出错STUD_IP_TEST_VERSION_ERRORIP版本号错STUD_IP_TEST_HEADLEN_ERROR头部长度错STUD_IP_TEST_DESTINATION_ERROR目的地址错2)发送分组voidip_SendtoLower(char*pBuffer,intlength)参数:pBuffer:指向待发送的IPv4分组头部的指针length:待发送的IPv4分组长度3)上层接收voidip_SendtoUp(char*pBuffer,intlength)参数:pBuffer:指向要上交的上层协议报文头部的指针length:上交报文长度4)获取本机IPv4地址unsignedintgetIpv4Address()参数:无计算机网络实验系统NetRiver2000--123IPv4协议转发实验3.
1实验目的通过前面的实验,我们已经深入了解了IPv4协议的分组接收和发送处理流程.
本实验需要将实验模块的角色定位从通信两端的主机转移到作为中间节点的路由器上,在IPv4分组收发处理的基础上,实现分组的路由转发功能.
网络层协议最为关注的是如何将IPv4分组从源主机通过网络送达目的主机,这个任务就是由路由器中的IPv4协议模块所承担.
路由器根据自身所获得的路由信息,将收到的IPv4分组转发给正确的下一跳路由器.
如此逐跳地对分组进行转发,直至该分组抵达目的主机.
IPv4分组转发是路由器最为重要的功能.
本实验设计模拟实现路由器中的IPv4协议,可以在原有IPv4分组收发实验的基础上,增加IPv4分组的转发功能.
对网络的观察视角由主机转移到路由器中,了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的主机.
本实验中也会初步接触路由表这一重要的数据结构,认识路由器是如何根据路由表对分组进行转发的.
3.
2实验要求在前面IPv4分组收发实验的基础上,增加分组转发功能.
具体来说,对于每一个到达本机的IPv4分组,根据其目的IPv4地址决定分组的处理行为,对该分组进行如下的几类操作:1)向上层协议上交目的地址为本机地址的分组;2)根据路由查找结果,丢弃查不到路由的分组;3)根据路由查找结果,向相应接口转发不是本机接收的分组.
3.
3实验内容实验内容主要包括:1)设计路由表数据结构.
设计路由表所采用的数据结构.
要求能够根据目的IPv4地址来确定分组处理行为(转发情况下需获得下一跳的IPv4地址).
路由表的数据结构和查找算法会极大的影响路由器的转发性能,有兴趣的同学可以计算机网络实验系统NetRiver200013深入思考和探索.
2)IPv4分组的接收和发送.
对前面实验(IP实验)中所完成的代码进行修改,在路由器协议栈的IPv4模块中能够正确完成分组的接收和发送处理.
具体要求不做改变,参见"IP实验".
3)IPv4分组的转发.
对于需要转发的分组进行处理,获得下一跳的IP地址,然后调用发送接口函数做进一步处理.
3.
4实验帮助分组转发是路由器最重要的功能.
分组转发的依据是路由信息,以此将目的地址不同的分组发送到相应的接口上,逐跳转发,并最终到达目的主机.
本实验要求按照路由器协议栈的IPv4协议功能进行设计实现,接收处理所有收到的分组(而不只是目的地址为本机地址的分组),并根据分组的IPV4目的地址结合相关的路由信息,对分组进行转发、接收或丢弃操作.
实验的主要流程和系统接口函数与前面"IP实验"基本相同.
在下层接收接口函数Stud_fwd_deal()中(图2.
1中接口函数1),实现分组接收处理.
主要功能是根据分组中目的IPv4地址结合对应的路由信息对分组进行处理.
分组需要上交,则调用接口函数Fwd_LocalRcv()(图2.
1中接口函数2);需要丢弃,则调用函数Fwd_DiscardPkt()(图2.
1中函数5);需要转发,则进行转发操作.
转发操作的实现要点包括,TTL值减1,然后重新计算头校验和,最后调用发送接口函数Fwd_SendtoLower()(图2.
1中接口函数4)将分组发送出去.
注意,接口函数Fwd_SendtoLower()比前面实验增加了一个参数pNxtHopAddr,要求在调用时传入下一跳的IPv4地址,此地址是通过查找路由表得到的.
另外,本实验增加了一个路由表配置的接口(图2.
1中函数6),要求能够根据系统所给信息来设定本机路由表.
实验中只需要简单地设置静态路由信息,以作为分组接收和发送处理的判断依据,而路由信息的动态获取和交互,在有关路由协议的实验(RIP协议)中会重点涉及.
计算机网络实验系统NetRiver2000--14MACTCP/UDP接收流程发送流程IP123456图2.
1IPv4分组转发实验接口示意图与前面IP实验不同的是,在本实验中分组接收和发送过程中都需要引入路由表的查找步骤.
路由器的主要任务是进行分组转发,它所接收的多数分组都是需要进行转发的,而不像主机协议栈中IPv4模块只接收发送给本机的分组;另外,路由器也要接收处理发送给本机的一些分组,如路由协议的分组(RIP实验中会涉及到)、ICMP分组等.
如何确定对各种分组的处理操作类型,就需要根据分组的IPV4目的地址结合路由信息进行判断.
一般而言,路由信息包括地址段、距离、下一跳地址、操作类型等.
在接收到IPv4分组后,要通过其目的地址匹配地址段来判断是否为本机地址,如果是则本机接收;如果不是,则通过其目的地址段查找路由表信息,从而得到进一步的操作类型,转发情况下还要获得下一跳的IPv4地址.
发送IPv4分组时,也要拿目的地址来查找路由表,得到下一跳的IPv4地址,然后调用发送接口函数做进一步处理.
在前面实验中,发送流程中没有查找路由表来确定下一跳地址的步骤,这项工作由系统来完成了,在本实验中则作为实验内容要求学生实现.
需要进一步说明的是,在转发路径中,本路由器可能是路径上的最后一跳,可以直接转发给目的主机,此时下一跳的地址就是IPv4分组的目的地址;而非最后一跳的情况下,下一跳的地址是从对应的路由信息中获取的.
因此,在路由表中转发类型要区分最后一跳和非最后一跳的情况.
路由表数据结构的设计是非常重要的,会极大地影响路由表的查找速度,进而影响路由器的分组转发性能.
本实验中虽然不会涉及大量分组的处计算机网络实验系统NetRiver200015理问题,但良好且高效的数据结构无疑会为后面的实验奠定良好的基础.
链表结构是最简单的,但效率比较低;树型结构的查找效率会提高很多,但组织和维护有些复杂,可以作为提高的要求.
具体数据结构的设计,可以在实践中进一步深入研究.
3.
4.
1路由表维护需要完成下列分组接收处理步骤:1)stud_Route_Init()函数中,对路由表进行初始化.
2)stud_route_add()函数中,完成路由的增加.
3.
4.
2转发处理流程在stud_fwd_deal()函数中,需要完成下列分组接收处理步骤:1)查找路由表.
根据相应路由表项的类型来确定下一步操作,错误分组调用函数fwd_DiscardPkt()进行丢弃,上交分组调用接口函数fwd_LocalRcv()提交给上层协议继续处理,转发分组进行转发处理.
注意,转发分组还要从路由表项中获取下一跳的IPv4地址.
2)转发处理流程.
对IPv4头部中的TTL字段减1,重新计算校验和,然后调用下层接口fwd_SendtoLower()进行发送处理.
3.
4.
3实验接口函数本小节列出了实验时会用到的各种接口函数,其中有一些函数是需要学生来完成的,有一些函数则是已经实现好了,供学生在实验时直接使用的.
表2.
1列出了所有的接口函数及其简要说明,更详细的说明在后面描述.
函数名说明是否需要学生实现stud_fwd_deal系统处理收到的IP分组的函数,当接收到一个IP分组的时候,实验系统会调用该函数进行处理是fwd_SendtoLower将封装完成的IP分组通过链路层发送出去的函数.
否fwd_LocalRcv将IP分组上交本机上层协议的函数,即当分组需要上交上层函数的时候调用本函数.
否计算机网络实验系统NetRiver2000--16fwd_DiscardPkt丢弃IP分组的函数.
当需要丢弃一个IP分组的时候调用.
否stud_route_add向路由表添加路由的函数.
系统将调用该函数向路由表添加一条IPv4路由.
是stud_Route_Init路由表初始化函数,系统初始化的时候将调用此函数对路由表进行初始化操作.
是getIpv4Address获取本机的IPv4地址,用来判断分组地址和本机地址是否相同否表2.
1函数接口表1)stud_fwd_deal()intstud_fwd_deal(char*pBuffer,intlength)参数:pBuffer:指向接收到的IPv4分组头部length:IPv4分组的长度返回值:0为成功,1为失败;说明:本函数是IPv4协议接收流程的下层接口函数,实验系统从网络中接收到分组后会调用本函数.
调用该函数之前已完成IP报文的合法性检查,因此学生在本函数中应该实现如下功能:a.
判定是否为本机接收的分组,如果是则调用fwd_LocalRcv();b.
按照最长匹配查找路由表获取下一跳,查找失败则调用fwd_DiscardPkt();c.
调用fwd_SendtoLower()完成报文发送;d.
转发过程中注意TTL的处理及校验和的变化;计算机网络实验系统NetRiver2000172)fwd_LocalRcv()voidfwd_LocalRcv(char*pBuffer,intlength)参数:pBuffer:指向分组的IP头length:表示分组的长度说明:本函数是IPv4协议接收流程的上层接口函数,在对IPv4的分组完成解析处理之后,如果分组的目的地址是本机的地址,则调用本函数将正确分组提交上层相应协议模块进一步处理.
3)fwd_SendtoLower()voidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop)参数:pBuffer:指向所要发送的IPv4分组头部length:分组长度(包括分组头部)nexthop:转发时下一跳的地址.
说明:本函数是发送流程的下层接口函数,在IPv4协议模块完成发送封装工作后调用该接口函数进行后续发送处理.
其中,后续的发送处理过程包括分片处理、IPv4地址到MAC地址的映射(ARP协议)、封装成MAC帧等工作,这部分内容不需要学生完成,由实验系统提供支持.
4)fwd_DiscardPkt()voidfwd_DiscardPkt(char*pBuffer,inttype)参数:pBuffer:指向被丢弃的IPV4分组头部type:表示错误类型,包括TTL错误和找不到路由两种错误,定义如下:STUD_FORWARD_TEST_TTLERRORSTUD_FORWARD_TEST_NOROUTE说明:本函数是丢弃分组的函数,在接收流程中检查到错误时调用此函数将分组丢弃.
5)stud_route_add()voidstud_route_add(stud_route_msg*proute)计算机网络实验系统NetRiver2000--18参数:proute:指向需要添加路由信息的结构体头部,其数据结构stud_route_msg的定义如下:typedefstructstud_route_msg{unsignedintdest;unsignedintmasklen;unsignedintnexthop;}stud_route_msg;说明:本函数为路由表配置接口,系统在配置路由表时需要调用此接口.
此函数功能为向路由表中增加一个新的表项,将参数所传递的路由信息添加到路由表中.
6)stud_Route_Init()voidstud_Route_Init()参数:无说明:本函数将在系统启动的时候被调用,学生可将初始化路由表的代码写在这里.
7)getIpv4Address()UINT32getIpv4Address()说明:本函数用于获取本机的IPv4地址,学生调用该函数即可返回本机的IPv4地址,可以用来判断IPV4分组是否为本机接收.
返回值::本机IPv4地址除了以上的函数以外,学生可根据需要自己编写一些实验需要的函数和数据结构,包括路由表的数据结构,对路由表的搜索、初始化等操作函数.
4计算机网络实验系统NetRiver2000194IPv6协议收发实验4.
1实验目的现有的互联网是在IPv4协议的基础上运行.
IPv6是下一版本的互联网协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,地址空间的不足必将影响互联网的进一步发展.
为了扩大地址空间,拟通过IPv6重新定义地址空间.
IPv4采用32位地址长度,只有大约43亿个地址,估计在2005~2010年间将被分配完毕,而IPv6采用128位地址长度,几乎可以不受限制地提供地址.
本实验通过设计实现主机协议栈中的IPv6协议,让学生深入了解网络层协议的基本原理,学习IPv6协议基本的分组接收和发送流程.
4.
2实验要求根据计算机网络实验系统所提供的上下层接口函数和协议中分组收发的主要流程,独立设计实现一个简单的IPv6分组收发模块.
要求实现的主要功能包括:1)IPv6分组的基本接收处理;2)IPv6分组的封装发送;3)不要求实现IPv6协议中的选项和分片处理功能.
4.
3实验内容1)实现IPv6分组的基本接收处理功能对于接收到的IPv6分组,检查目的地址是否为本地地址,并检查IPv6分组头部中其它字段的合法性.
提交正确的分组给上层协议继续处理,丢弃错误的分组并说明错误类型.
2)实现IPv6分组的封装发送根据上层协议所提供的参数,封装IPv6分组,调用系统提供的发送接口函数将分组发送出去.
4.
4实验帮助在两个主机端系统通信的环境中,网络的拓扑可以简化为两台主机直接相连,中间的具体连接方式可以抽象为一条简单的链路,如图4.
1所示.
IPv6计算机网络实验系统NetRiver2000--20分组收发实验就是要在实验系统客户端的开发平台上,实现IPv6分组的接收和发送功能.
图4.
1实验环境网络拓扑结构4.
4.
1处理流程客户端接收到测试服务器发送来的IPv6分组后,调用接收接口函数stud_ipv6_recv()(图4.
2中接口函数1).
学生需要在这个函数中实现IPv6分组接收处理的功能.
接收处理完成后,调用接口函数ipv6_SendtoUp()将需要上层协议进一步处理的信息提交给上层协议(图4.
2中接口函数2);或者调用函数ipv6_DiscardPkt()丢弃有错误的分组并报告错误类型(图4.
2中函数5).
在上层协议需要发送分组时,会调用发送接口函数stud_ipv6_Upsend()(图4.
2中接口函数3).
学生需要在这个函数中实现IPv6分组封装发送的功能.
根据所传参数完成IPv6分组的封装,之后调用接口函数ipv6_SendtoLower()把分组交给下层完成发送(图4.
2中接口函数4).
IPv6MACTCP/UDP12543图4.
2实验接口函数示意图4.
4.
1.
1接收流程在接口函数stud_ipv6_recv()中,需要完成下列处理步骤(仅供参考):计算机网络实验系统NetRiver2000211)检查所接收到的IPv6分组头部的字段,包括版本号(Version)、有效载荷长度(Payloadlength)、跳数限制(Hoplimit)字段.
对于出错的分组调用ipv6_DiscardPkt()丢弃,并说明错误类型.
2)检查IPv6分组是否该由本机接收.
如果分组的目的地址是本机地址或广播地址,则说明此分组是发送给本机的;否则调用ipv6_DiscardPkt()丢弃,并说明错误类型.
3)提取得到上层协议类型,调用ipv6_SendtoUp()接口函数,交给系统进行后续接收处理.
4.
4.
1.
2发送流程在接口函数stud_ipv6_Upsend()中,需要完成下列处理步骤(仅供参考):1)根据所传参数(如数据大小),来确定分配的存储空间的大小并申请分组的存储空间.
2)按照IPv6协议标准填写IPv6分组头部各字段.
注意,各字段内容都要转换成网络字节序.
3)完成IPv6分组的封装后,调用ipv6_SendtoLower()接口函数完成后续的发送处理工作,最终将分组发送到网络中.
4.
4.
2IPv6分组头部格式IPv6分组头部格式如图4.
3所示,具体字段的定义请参考教材[1]和文献[2].
VersionTrafficClassFlowLabelPayloadLenNextHeaderHopLimit128bitsourceAddress128bitDestinationAddress图4.
3IPv6分组头部格式Version:4位协议版本号,为6.
TrafficClass:传输类型,占8位.
计算机网络实验系统NetRiver2000--22FlowLabel:流量标签:占20位.
PayloadLength:16位无符号整数,IPv6载荷,也就是说跟在IPv6头部后面的部分,以8bits为单位.
NextHeader:8位,标识紧跟IPv6头部之后的头部类型.
HopLimit:8位无符号整数,每经过一个节点减1,减为0后该报文被丢弃.
SourceAddress:源地址,报文的产生者.
DestinationAddress:目的地址:报文的接收者.
4.
4.
3数据结构说明系统提供了IPv6地址的结构定义如下:typedefunion{charbAddr[16];unsignedshortwAddr[8];longdwAddr[4];}ipv6_addr;4.
4.
4接口函数说明4.
4.
4.
1需要实现的接口函数1)接收接口intstud_ipv6_recv(char*pBuffer,unsignedshortlength)参数:pBuffer:指向接收缓冲区的指针,指向IPv6分组头部length:IPv6分组长度返回值:0:成功接收IP分组并交给上层处理-1:IP分组接收失败2)发送接口intstud_ipv6_Upsend(char*pData,unsignedshortlen,ipv6_addrsrcAddr,ipv6_addrdstAddr,bytecharhoplimit,charnexthead)参数:计算机网络实验系统NetRiver200023pData:IPv6上层协议数据len:IPv6上层协议数据长度srcAddr:源IPv6地址dstAddr:目的IPv6地址hoplimit:跳数限制nexthead:上层协议类型返回值:0:成功发送IP分组-1:发送分组失败4.
4.
4.
2系统提供的接口函数8)丢弃分组externvoidipv6_DiscardPkt(char*pBuffer,inttype)参数:pBuffer:指向被丢弃的分组type:分组被丢弃的原因,有以下可能STUD_IPV6_TEST_VERSION_ERRORIP版本号错STUD_IPV6_TEST_DESTINATION_ERROR目的地址错STUD_IPV6_TEST_HOPLIMIT_ERROR跳数限制错9)发送分组externvoidipv6_SendtoLower(char*pBuffer,intlength)参数:pBuffer:指向待发送的IPv6分组length:待发送的IPv6分组长度10)上层接收externvoidipv6_SendtoUp(char*pBuffer,intlength)参数:pBuffer:指向要上交的上层协议报文头length:上交报文长度11)获取本机IPv6地址externvoidgetIpv6Address(ipv6_addr*paddr)参数:paddr:指向本机IPv6地址结构的指针计算机网络实验系统NetRiver2000--245IPv6协议转发实验5.
1实验目的通过前面的实验,我们已经深入了解了IPv6协议的分组接收和发送处理流程.
本实验需要将实验模块的角色定位从通信两端的主机转移到作为中间节点的路由器上,在IPv6分组收发处理的基础上,实现分组的路由转发功能.
网络层协议最为关注的是如何将IPv6分组从源主机通过网络送达目的主机,这个任务就是由路由器中的IPv6协议模块所承担.
路由器根据自身所获得的路由信息,将收到的IPv6分组转发给正确的下一跳路由器.
如此逐跳地对分组进行转发,直至该分组抵达目的主机.
IPv6分组转发是路由器最为重要的功能.
本实验设计实现路由器中的IPv6协议,可以在原有IPv6分组收发实验的基础上,增加IPv6分组的转发功能.
对网络的观察视角由主机转移到路由器中,了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的端的.
大家在本实验中也会初步接触路由表这一重要的数据结构,认识路由器是如何根据路由表对分组进行转发的.
5.
2实验要求在前面IPv6分组收发实验的基础上,增加分组转发功能.
具体来说,对于每一个到达本机的IPv6分组,根据其目的IPv6地址查找本机的路由表,对该分组进行如下的几类操作:1)丢弃查不到路由的分组;2)向上层协议上交目的地址为本机地址的分组;3)根据路由查找结果,向相应接口转发其余的分组.
5.
3实验内容实验内容主要包括:1)设计路由表数据结构.
设计路由表所采用的数据结构.
要求能够根据IPv6地址来确定分组处理行为(丢弃、上交或转发),转发情况下需获得下一跳的IPv6地址.
路由表的数据结构和查找算法会极大的影响路由器的转发性能,有计算机网络实验系统NetRiver200025兴趣的同学可以深入思考和探索.
2)IPv6分组的接收和发送.
对前面实验中所完成的代码进行修改,在路由器协议栈的IPv6模块中能够正确完成分组的接收和发送处理.
具体要求不做改变,参见IPv6分组收发实验.
3)IPv6分组的转发.
对于需要转发的分组进行处理,获得下一跳的IP地址,然后调用发送接口函数进一步处理.
5.
4实验帮助分组转发是路由器最重要功能.
分组转发的依据是路由信息,以此将目的地址不同的分组发送到相应的接口上,逐跳转发,并最终到达目的主机.
本实验要求按照路由器协议栈的IPv6协议功能进行设计实现,接收处理所有收到的分组(而不只是目的地之为本机地址的分组),并根据预先设定的路由信息,对分组进行转发、接收或丢弃.
实验的主要流程和系统接口函数与前面IPv6分组收发实验基本相同.
在下层接收接口函数stud_ipv6_fwd_deal()中(图5.
1中接口函数1),实现分组接收处理.
主要功能是根据分组中目的IPv6地址查找路由表,根据路由表查找结果进行后续处理.
分组需要上交,则调用接口函数ipv6_fwd_LocalRcv()(图5.
1中接口函数2);需要丢弃,则调用函数ipv6_fwd_DiscardPkt()(图5.
1中函数5);需要转发,则进行转发操作.
转发操作的实现要点包括,HopLimit值减1,然后调用发送接口函数ipv6_fwd_SendtoLower()(图5.
1中接口函数4)将分组发送出去.
注意,接口函数ipv6_fwd_SendtoLower()比前面实验增加了一个参数nexthop,要求在调用时传入下一跳的IPv6地址,此地址是通过查找路由表得到的.
另外,本实验增加了一个路由表配置的接口(图5.
1中函数6),要求能够根据系统所给信息来设定本机路由表.
实验中只需要简单地设置静态路由信息,以作为分组接收和发送处理的判断依据.
计算机网络实验系统NetRiver2000--26MACTCP/UDPIPv6123456图5.
1IPv6分组转发实验接口示意图与前面IPv6分组收发实验不同的是,在本实验中分组接收和发送过程中都需要引入路由表的查找步骤.
路由器的主要任务是进行分组转发,它所接收的多数分组都是需要进行转发的,而不像主机协议栈中IPv6模块只接收发送给本机的分组.
;另外,路由器也要接收处理发送给本机的一些分组,如路由协议的分组、ICMP分组等.
如何确定对各种分组的处理操作类型,就需要根据路由表进行判断.
一般而言,路由信息包括地址段、距离、下一跳地址、操作类型等.
在接收到IPv6分组后,要通过其目的地址匹配地址段来查找相应的路由信息,从而得到进一步的操作类型,转发情况下还要获得下一跳的IPv6地址.
发送IPv6分组时,也要拿目的地址来查找路由表,得到下一跳的IPv6地址,然后调用发送接口函数进一步处理.
在前面实验中,发送流程中没有查找路由表来确定下一跳地址的步骤,这项工作由系统来完成了,在本实验中则作为实验内容要求学生实现.
需要进一步说明的是,在转发路径中,本路由器可能是路径上的最后一跳,可以直接转发给目的主机,此时下一跳的地址就是IPv6分组的目的地址;而非最后一跳的情况下,下一跳的地址是从对应的路由信息中获取的.
因此,在路由表中转发类型要区分最后一跳和非最后一跳的情况.
路由表数据结构的设计是非常重要的,会极大地影响路由表的查找速度,进而影响路由器的分组转发性能.
本实验中虽然不会涉及大量分组的处理问题,但良好且高效的数据结构无疑会为后面的实验奠定良好的基础.
链计算机网络实验系统NetRiver200027表结构是最简单的,但效率比较低;树型结构的查找效率会提高很多,但组织和维护有些复杂,可以作为提高的要求.
具体数据结构的设计,可以在实践中进一步深入研究.
5.
4.
1路由表维护需要完成下列分组接收处理步骤:1)stud_ipv6_Route_Init()函数中,对路由表进行初始化.
2)stud_ipv6_route_add()函数中,完成路由的增加.
5.
4.
2转发处理流程在stud_ipv6_fwd_deal()函数中,需要完成下列分组接收处理步骤:1)查找路由表.
根据相应路由表项的类型来确定下一步操作,错误分组调用函数ipv6_fwd_DiscardPkt()进行丢弃,上交分组调用接口函数ipv6_fwd_LocalRcv()提交给上层协议继续处理,转发分组进行转发处理.
注意,转发分组还要从路由表项中获取下一跳的IPv4地址.
2)转发处理流程.
对IPv6头部中的HopLimit字段减1,然后调用下层接口ipv6_fwd_SendtoLower()进行发送处理.
5.
4.
3实验接口函数本小节列出了实验时会用到的各种接口函数,其中有一些函数是需要学生来完成的,有一些函数则是已经实现好了,供学生在实验时直接使用的.
表1列出了所有的接口函数及其简要说明,更详细的说明在后面描述.
1)stud_ipv6_fwd_deal()intstud_ipv6_fwd_deal(char*pBuffer,intlength)参数:pBuffer:指向所及受到的IPv6分组头部length:为IPv6分组的长度返回值:处理该包的返回值,0为成功,1为失败;说明:本函数是IPv6协议接收流程的下层接口函数,实验系统从网络中接收到分组后会调用本函数.
调用该函数之前已完成IPv6报文的合法性检查,因此学生在本函数中应该实现如下功能:a.
判定是否为本机接收的分组,如果是则调用ipv6_fwd_LocalRcv();计算机网络实验系统NetRiver2000--28b.
按照最长匹配查找路由表获取下一跳,查找失败则调用ipv6_fwd_DiscardPkt();c.
调用ipv6_fwd_SendtoLower()完成报文发送;d.
转发过程中注意HopLimit的处理;2)ipv6_fwd_LocalRcv()voidipv6_fwd_LocalRcv(char*pBuffer,intlength)参数:pBuffer:指向报文的IPv6头length:表示报文的长度说明:本函数是IPv6协议接收流程的上层接口函数,在对IPv6的分组完成解析处理之后,如果分组的目的地址是本机的地址,则调用本函数将正确分组提交上层相应协议模块进一步处理.
3)ipv6_fwd_SendtoLower()voidipv6_fwd_SendtoLower(char*pBuffer,intlength,ipv6_addr*nexthop)参数:pBuffer:指向所要发送的IPv6分组的起始地址length:分组的整个长度(包括分组头部)nexthop:为转发处理时下一跳的地址.
说明:本函数是发送流程的下层接口函数,在IPv6协议模块完成发送封装工作后调用该接口函数进行后续发送处理.
其中,后续的发送处理过程包括分片处理、IPv6地址到MAC地址的映射(ND协议)、封装成MAC帧等工作,这部分内容不需要学生完成,由实验系统提供支持.
4)ipv6_fwd_DiscardPkt()voidipv6_fwd_DiscardPkt(char*pBuffer,inttype)参数:pBuffer:指向被丢弃的报文type:表示错误类型,包括TTL错误和找不到路由两种错误,定义如下:#defineSTUD_IPV6_FORWARD_TEST_HOPLIMIT_ERROR计算机网络实验系统NetRiver200029#defineSTUD_IPV6_FORWARD_TEST_NOROUTE说明:本函数是丢弃分组的函数,在接收流程中检查到错误时调用此函数将分组丢弃.
5)stud_ipv6_route_add()voidstud_ipv6_route_add(stud_ipv6_route_msg*proute)参数:proute:需要添加的路由,其数据结构stud_ipv6_route_msg的定义如下:typedefstud_route_msg{ipv6_addrdest;UINT32masklen;ipv6_addrnexthop;}stud_ipv6_route_msg;说明:本函数为路由表配置接口,系统在配置路由表时需要调用此接口.
此函数功能为向路由表中增加一个新的表项,将参数所传递的路由信息添加到路由表中.
6)stud_ipv6_Route_Init()voidstud_ipv6_Route_Init()参数:说明:本函数用于对路由表进行初始化,由学生编写,在系统初始化的时候将调用该函数,对学生自己写的路由表数据结构进行初始化操作.
7)getIpv6Address()voidgetIpv6Address(ipv6_addr*pAddr)说明:本函数用于获取本机的IPv6地址,学生调用该函数即可返回本机的IPv6地址.
参数:pAddr:返回的IPv6地址结构的指针返回值::计算机网络实验系统NetRiver2000--30无除了以上的函数以外,学生还需要自己编写一些实验需要的函数和数据结构,包括路由表的数据结构,对路由表的搜索、初始化等操作函数.
计算机网络实验系统NetRiver2000316RIP协议实验6.
1实验目的通过简单实现路由协议RIP,深入理解计算机网络中的核心技术——路由技术,并了解计算机网络的路由转发原理.
6.
2实验要求充分理解RIP协议,根据RIP协议的流程设计RIP协议的报文处理和超时处理函数.
能够实现如下功能:1)RIP报文有效性检查2)处理Request报文3)处理Response报文4)路由表项超时删除5)路由表项定时发送6.
3实验内容1)对客户端接收到的RIP报文进行有效性检查对客户端接收到的RIP协议报文进行合法性检查,丢弃存在错误的报文并指出错误原因;2)处理Request报文正确解析并处理RIP协议的Request报文,并能够根据报文的内容以及本地路由表组成相应的Response报文,回复给Request报文的发送者,并实现水平分割;3)处理Response报文正确解析并处理RIP协议的Response报文,并根据报文中携带的路由信息更新本地路由表;4)路由表项超时删除处理来自系统的路由表项超时消息,并能够删除指定的路由;5)路由表项定时发送实现定时对本地的路由进行广播的功能,并实现水平分割.
计算机网络实验系统NetRiver2000--326.
4实验帮助6.
4.
1RIP协议介绍6.
4.
1.
1协议简述RIP协议采用的是距离-向量路由算法,该算法早在Internet的前身ARPANET网络中就已经被广泛采用.
在70年代中期,Xerox公司根据它们对互联网的研究成果提出了一套被称为XNS(XeroxNetworkSystem)的网络协议软件.
这套协议软件包含了XNSRIP协议,该协议就是现在所使用的RIP协议的最早原型.
80年代加州大学伯克利分校在开发Unix系统的同时,在routed程序中设计实现了RIP协议软件.
routed程序被绑定在BSDUnix系统中一起推出,被广泛的应用于早期网络中的机器之间交换路由信息.
尽管RIP/routed没有非常突出的优点,但是由于Unix操作系统的普及,RIP/routed也逐渐被推广出来,为许多人所接受,成为了中小型网络中最基本的路由协议/程序.
RIP协议的RFC文本在1988年6月被正式推出,它综合了实际应用中许多实现版本的特点,同时为版本的兼容互通性提供了可靠的依据.
由于RIPv1中存在着一些缺陷,再加上网络技术的发展,有必要对RIP版本进行相应的改进.
1994年11月,RFC1723对RIPv1的报文结构进行了扩展,增加一些新的网络功能.
1998年11月,RIPv2的标准RFC文本被正式提出,它在协议报文的路由表项中增加了子网掩码信息,同时增加了安全认证、不同路由协议交互等功能.
随着OSPF、IS-IS等域内路由协议的出现,许多人认为RIP协议软件已经过时.
尽管RIP在协议性能和网络适应能力上远远落后于后来提出的路由协议,但是RIP仍然具有自身的特点.
首先,在小型的网络环境中,从使用的网络带宽以及协议配置和管理复杂程度上看,RIP的运行开销很小;其次,与其他路由协议相比,RIP使用简单的距离-向量算法,实现更容易;最后,由于历史的原因,RIP的应用范围非常广,在未来的几年中仍然会使用在各种网络环境中.
因此,在路由器的设计中,RIP协议是不可缺少的路由协议之一,RIP协议的实现效率高低对路由器系统的路由性能起着重要的作用.
计算机网络实验系统NetRiver2000336.
4.
1.
2RIPv2协议的报文结构图7.
1RIPv2的报文结构RIPv2的报文结构如图7.
1所示.
每个报文都包括一个报文命令字段、一个报文版本字段、一个路由域字段、一个地址类字段、一个路由标记字段以及一些路由信息项(一个RIP报文中最多允许25个路由信息项),其中每个字段后括号中的数字表示该字段所占的字节数.
RIP报文的最大长度为4+20*25=504字节,加上UDP报头的8字节,一共是512字节.
如果路由表的路由表项数目大于25时,那么就需要多个RIP报文来完成路由信息的传播过程.
下面对报文字段进行逐一介绍:命令字段:表示RIP报文的类型,目前RIP只支持两种报文类型,分别是请求报文(request1)和响应(response2)报文.
版本字段:表示RIP报文的版本信息,RIPv2报文中此字段为2.
路由域字段:是一个选路守护程序的标识符,它指出了这个数据报的所有者.
在一个Unix实现中,它可以是选路守护程序的进程号.
该域允许管理者在单个路由器上运行多个RIP实例,每个实例在一个选路域内运行.
地址类字段:表示路由信息所属的地址族,目前RIP中规定此字段必须为2,表示使用IP地址族.
IP地址字段:表示路由信息对应的目的地IP地址,可以是网络地址、计算机网络实验系统NetRiver2000--34子网地址以及主机地址.
子网掩码字段:应用于IP地址产生非主机部分地址,为0时表示不包括子网掩码部分,使得RIP能够适应更多的环境.
下一站IP地址字段:下一驿站,可以对使用多路由协议的网络环境下的路由进行优化.
度量值字段:表示从本路由器到达目的地的距离,目前RIP将路由路径上经过的路由器数作为距离度量值.
一般来说,RIP发送的请求报文和响应报文都符合图7.
1的报文结构格式,但是当需要发送请求对方路由器全部路由表信息的请求报文时,RIP使用另一种报文结构,此报文结构中路由信息项的地址族标识符字段为0,目的地址字段为0,距离度量字段为16.
6.
4.
1.
3RIP协议的基本特点协议规定,RIP协议使用UDP的520端口进行路由信息的交互,交互的RIP信息报文主要是两种类型:请求(request)报文和响应(response)报文.
请求报文用来向相邻运行RIP的路由器请求路由信息,响应报文用来发送本地路由器的路由信息.
RIP协议使用距离-向量路由算法,因此发送的路由信息可以用序偶来表示,在实际报文中,vector用路由的目的地址address表示,而distance用该路由的距离度量值metric表示,metric值规定为从本机到达目的网络路径上经过的路由器数目,metric的有效值为1到16,其中16表示网络不可到达,可见RIP协议运行的网络规模是有限的.
当系统启动时,RIP协议处理模块在所有RIP配置运行的接口处发出request报文,然后RIP协议就进入了循环等待状态,等待外部RIP协议报文(包括请求报文和响应报文)的到来;而接收到request报文的路由器则应当发出包含它们路由表信息的response报文.
当发出请求的路由器接收到一个response报文后,它会逐一处理收到的路由表项内容.
如果报文中的表项为新的路由表项,那么取出报文中路由表项的各个字段,并且取response报文的源地址作为下一跳的值,向路由表加入该表项,.
如果该报文表项已经在路由表中存在,那么首先判断这个收到的路由更新信息是哪个路由器发送过来的.
如果就是这个表项的源路由器(即当初发送相应路由信息从而导致这个路由表项的路由器),则无论该现有表项的距离度量值(metric)如何,都需要更新该表项;如果不是,那么计算机网络实验系统NetRiver200035只有当更新表项的metric值小于路由表中相应表项metric值时才需要替代原来的表项.
此外,为了保证路由的有效性,RIP协议规定:每隔30秒,重新广播一次路由信息;若连续三次没有收到RIP广播的路由信息,则相应的路由信息失效.
6.
4.
1.
4水平分割水平分割是一种避免路由环的出现和加快路由汇聚的技术.
由于路由器可能收到它自己发送的路由信息,而这种信息是无用的,水平分割技术不反向通告任何从终端收到的路由更新信息,而只通告那些不会由于计数到无穷而清除的路由.
6.
4.
2实验拓扑客户端软件模拟一个网络中的路由器,在其中2个接口运行RIP协议,接口编号为1和2,每个接口均与其他路由器连接,通过RIP协议交互路由信息.
6.
4.
3需要实现的接口函数1)RIP报文处理函数intstud_rip_packet_recv(char*pBuffer,intbufferSize,UINT8iNo,UINT32srcAdd)参数:pBuffer:指向接收到的RIP报文内容的指针bufferSize:接收到的RIP报文的长度iNo:接收该报文的接口号srcAdd:接收到的报文的源IP地址返回值:0说明:当系统收到RIP报文时,会调用此函数,学生编写此函数,应该实现如下功能:对RIP报文进行合法性检查,若报文存在错误,则调用ip_DiscardPkt函数,并在type参数中传入错误编号.
错误编号的宏定义如下:#defineSTUD_RIP_TEST_VERSION_ERRORRIP版本错误#defineSTUD_RIP_TEST_COMMAND_ERRORRIP命令错误计算机网络实验系统NetRiver2000--36根据报文的command域,判断报文类型.
对于Request报文,应该将根据本地的路由表信息组成Response报文,并通过rip_sendIpPkt函数发送出去.
注意,由于实现水平分割,组Response报文时应该检查该Request报文的来源接口,Response报文中的路由信息不包括来自该来源接口的路由.
对于Response报文,应该提取出该报文中携带的路由信息,对于本地路由表中已存在的项要判断该条路由信息的metric值,若为16,则应置本地路由表中对应路由为无效,否则若更新表项的metric值小于路由表中相应表项metric值时就替代原来的表项.
注意要将metric值加1.
对于本地路由表中不存在的项,则将metric值加1后将该路由项加入本地路由表,注意,若metric值加1后为16说明路由已经失效,则不用添加.
2)RIP超时处理函数voidstud_rip_route_timeout(UINT32destAdd,UINT32mask,unsignedcharmsgType)参数:destAdd:路由超时消息中路由的目标地址mask:路由超时消息中路由的掩码msgType:消息类型,包括以下两种定义:#defineRIP_MSG_SEND_ROUTE#defineRIP_MSG_DELE_ROUTE说明:RIP协议每隔30秒,重新广播一次路由信息,系统调用该函数并置msgType为RIP_MSG_SEND_ROUTE来进行路由信息广播.
该函数应该在每个接口上分别广播自己的RIP路由信息,即通过rip_sendIpPkt函数发送RIPResponse报文.
由于实现水平分割,报文中的路由信息不包括来自该接口的路由信息.
RIP协议每个路由表项都有相关的路由超时计时器,当路由超时计时器过期时,该路径就标记为失效的,但仍保存在路由表中,直到路由清空计时器过期才被清掉.
当超时定时器被触发时,系统会调用该函数并置msgType为RIP_MSG_DELE_ROUTE,并通过destAdd和mask参数传入超时的路由项.
该函数应该置本地路由的对应项为无效,即metric值置为16.
计算机网络实验系统NetRiver2000376.
4.
4系统提供的全局变量1)RIP路由表externstructstud_rip_route_node*g_rip_route_table;系统以单向链表存储RIP路由表,学生需要利用此表存储RIP路由,供客户端软件检查.
该全局变量为系统中RIP路由表链表的头指针,其中,stud_rip_route_node结构定义如下:typedefstructstud_rip_route_node{unsignedintdest;unsignedintmask;unsignedintnexthop;unsignedintmetric;unsignedintif_no;structstud_rip_route_node*next;};6.
4.
5系统提供的接口函数1)发送RIP报文函数externvoidrip_sendIpPkt(unsignedchar*pData,UINT16len,unsignedshortdstPort,UINT8iNo);参数:pData:指向要发送的RIP报文内容的指针len:要发送的RIP报文的长度dstPort:要发送的RIP报文的目的端口iNo:发送该报文通过的接口的接口号计算机网络实验系统NetRiver2000--387TCP协议实验7.
1实验目的传输层是互联网协议栈的核心层次之一,它的任务是在源节点和目的节点间提供端到端的、高效的数据传输功能.
TCP协议是主要的传输层协议,它为两个任意处理速率的、使用不可靠IP连接的节点之间,提供了可靠的、具有流量控制和拥塞控制的、端到端的数据传输服务.
TCP协议不同于IP协议,它是有状态的,这也使其成为互联网协议栈中最复杂的协议之一.
网络上多数的应用程序都是基于TCP协议的,如HTTP、FTP等.
本实验的主要目的是学习和了解TCP协议的原理和设计实现的机制.
TCP协议中的状态控制机制和拥塞控制算法是协议的核心部分.
TCP协议的复杂性主要源于它是一个有状态的协议,需要进行状态的维护和变迁.
有限状态机可以很好的从逻辑上表示TCP协议的处理过程,理解和实现TCP协议状态机是本实验的重点内容.
另外,由于在网络层不能保证分组顺序到达,因而在传输层要处理分组的乱序问题.
只有在某个序号之前的所有分组都收到了,才能够将它们一起提交给应用层协议做进一步的处理.
拥塞控制算法对于TCP协议及整个网络的性能有着重要的影响.
目前对于TCP协议研究的一个重要方向就是对于拥塞控制算法的改进.
希望通过学习、实现和改进TCP协议的拥塞控制算法,增强大家对计算机网络进行深入研究的兴趣.
另外,TCP协议还要向应用层提供编程接口,即网络编程中所普遍使用的Socket函数.
通过实现这些接口函数,可以深入了解网络编程的原理,提高网络程序的设计和调试能力.
TCP协议是非常复杂的,不可能在一个实验中完成所有的内容.
出于工作量和实现复杂度的考虑,本实验对TCP协议进行适当的简化,只实现客户端角色的、"停-等"模式的TCP协议,能够正确的建立和拆除连接,接收和发送TCP报文,并向应用层提供客户端需要的Socket函数.
7.
2实验要求实验要求主要包括:计算机网络实验系统NetRiver2000391)了解TCP协议的主要内容,并针对客户端角色的、"停-等"模式的TCP协议,完成对接收和发送流程的设计.
2)实现TCP报文的接收流程,重点是报文接收的有限状态机.
3)实现TCP报文的发送流程,完成TCP报文的封装处理.
4)实现客户端Socket函数接口.
注意,以下功能暂不做要求,有能力的同学可顺序选做:1)滑动窗口.
由于将TCP协议简化为"停-等"模式,实际上发送窗口和接收窗口的大小都为1,因此也就不存在乱序接收的问题.
发送流程也得到了很大的简化,不再需要复杂的状态控制.
可以进一步实现复杂的滑动窗口控制机制.
2)拥塞控制.
"停-等"模式的TCP协议,其发送和接收窗口都为1,不存在拥塞控制的问题.
可以在实现复杂的滑动窗口机制的基础上,进一步设计实现拥塞控制算法.
具体内容可参考教材[1].
3)往返时延估计.
TCP协议超时重传的间隔时间长短会影响到TCP协议甚至整个网络的性能,如何确定重传时间间隔也是当前计算机网络领域的一个研究热点.
现在主要采用的是一种动态自适应的算法,根据网络性能的连续测量情况,来不断地调整超时间隔.
具体内容可参考教材[1].
7.
3实验内容实验内容主要包括:1)设计保存TCP连接相关信息的数据结构(一般称为TCB,TransmissionControlBlock).
2)TCP协议的接收处理.
学生需要实现stud_tcp_input()函数,完成检查校验和、字节序转换功能(对头部中的选项不做处理),重点实现客户端角色的TCP报文接收的有限状态机.
不采用捎带确认机制,收到数据后马上回复确认,以满足"停-等"模式的需求.
3)TCP协议的封装发送.
学生需要实现stud_tcp_output()函数,完成简单的TCP协议的封装发送功能.
为保证可靠传输,要在收到对上一个报文的确认后才能够继续发送.
计算机网络实验系统NetRiver2000--404)TCP协议提供的Socket函数接口实现与客户端角色的TCP协议相关的5个Socket接口函数,stud_tcp_socket()、stud_tcp_connect()、stud_tcp_recv()、stud_tcp_send()和stud_tcp_close(),将接口函数实现的内容与发送和接收流程有机地结合起来.
实验内容(1)、(2)和(3)完成后,其正确性用测试例1——针对分组交互的测试来验证;实验内容(4)的正确性用测试例2——socketAPI测试来验证.
7.
4实验帮助从设计实现的角度出发,TCP协议主要考虑以下几个因素:1)状态控制2)滑动窗口机制3)拥塞控制算法4)性能问题(RTT估计)5)Socket接口将这些内容完全实现具有很大的难度,因此我们对其进行简化.
本实验中要求实现一个客户端角色的TCP协议,采用"停-等"模式,即发送窗口和接收窗口的大小都为1,并向上层提供客户端所必需的Socket接口函数.
客户端角色的TCP协议只能够主动发起建立连接请求,而不能监听端口等待其它主机的连接.
因而相比于标准TCP协议的状态控制,客户端角色的TCP协议的状态机得到简化,如图3.
1所示.
计算机网络实验系统NetRiver200041图3.
1客户端角色的TCP协议状态机从CLOSED状态开始,调用Socket函数stud_tcp_connect()发送建立连接请求(SYN报文)后转入SYN-SENT状态,等待服务器端的应答和建立连接请求;收到服务器端的SYN+ACK后,以ACK应答,完成"三次握手"的过程,转为ESTABLISHED状态.
在ESTABLISHED状态,客户端与服务器端可以通过函数stud_tcp_recv()和stud_tcp_send()进行数据交互.
完成数据传输后,客户端通过stud_tcp_close()函数发送关闭连接请求(FIN报文),转入FIN-WAIT1状态;收到应答ACK后进入FIN-WAIT2状态,此时状态为半关闭,等待服务器端关闭连接.
收到服务器端的FIN报文后,需要发送确认ACK,状态改变为TIME-WAIT;等待一段时间后,转为初始的CLOSED状态,连接完全断开.
上述流程是一个客户端TCP建立和拆除连接的最简单的正常流程,然而实际的TCP协议要处理各种各样的异常情况,这也是TCP状态控制非常复杂的一个原因.
本实验中对此不做复杂处理,对接收到的异常报文(如报文类型不符、序号错误等情况)调用系统所提供的函数tcp_DiscardPkt()丢弃即可.
"停-等"模式的TCP协议,其发送窗口和接收窗口大小都为1.
接收到的报文中,只有序列号正确的报文才会被处理,并根据报文内容和长度对接计算机网络实验系统NetRiver2000--42收窗口进行滑动.
发送一个报文后就不能继续发送,而要等待对方对此报文的确认,收到确认后才能继续发送.
如果一段时间后没有收到确认,则需要重传(本实验暂不涉及重传机制).
实现一个完整的TCP协议,还需要向应用层提供Socket接口函数.
作为客户端角色的TCP协议,必须实现的Socket接口函数包括:stud_tcp_socket()、stud_tcp_connect()、stud_tcp_recv()、stud_tcp_send()和stud_tcp_close().
实现Socket接口函数,主要工作是将Socket接口函数和TCP报文的接收和发送流程结合起来,根据应用层需求发送或接受特定类型的报文或读写数据.
实验的接口如下图3.
2所示.
图3.
2TCP实验接口示意图下面详细说明设计实现时所涉及的要点,包括数据结构的设计、报文的接收和发送处理流程、实验模块的接口函数说明等.
7.
4.
1TCP报文头部格式TCP报文头部格式如图3.
3所示,具体字段的定义请参考教材[1]及文献[2].
计算机网络实验系统NetRiver200043图3.
3TCP报文头部格式7.
4.
2数据结构一般情况下,TCP协议通过一个数据结构来控制每个TCP连接的发送和接收动作,该数据结构被称为传输控制块(TransmissionControlBlock,TCB).
TCP为每个活动的连接维护一个TCB结构,所有TCP连接对应的TCB结构可以组织成一个TCB的链表结构进行管理.
TCB中包含了有关TCP连接的所有信息,包括两端的IP地址和端口号、连接状态信息、发送和接收窗口信息等.
TCB的数据结构由学生来设计完成,本实验指导书中并不做具体规定,学生可根据设计实现的需要来具体定义TCB结构.
7.
4.
3接收和发送处理在stud_tcp_input()函数中,需要完成下列分组接收处理步骤:1)检查校验和.
关于TCP头部中校验和的计算和检查请参考教材[1]和参考文献[4]的相关部分.
2)字节序转换.
3)检查序列号.
如果序列号不正确,则调用tcp_DiscardPkt.
4)将报文交由输入有限状态机处理.
5)有限状态机对报文进行处理,转换状态.
计算机网络实验系统NetRiver2000--446)根据当前的状态并调用stud_tcp_output函数完成tcp建连、数据传递时返回ACK、tcp断连等工作在stud_tcp_output()函数中,分组发送流程的实现要点:1)判断需要发送的报文类型,并针对特定类型做相应的处理.
2)判断是否可以发送(发送窗口不为0).
3)构造TCP数据报文并发送.
填写TCP报文各字段的内容和数据,转换字节序,计算校验和,然后调用发送流程的下层接口函数sendIpPkt()发送.
7.
4.
4Socket接口各函数处理在stud_tcp_socket()函数中,分组发送流程的实现要点:1)在此函数中要先创建新的TCB结构,并对成员变量进行初始化.
2)为每个TCB结构分配唯一的套接口描述符.
在stud_tcp_connect()函数中,分组发送流程的实现要点:1)设定目的IPv4地址和端口,源IPv4地址和端口.
2)初始化TCB结构中的相关变量.
3)设定TCB中的输入状态为SYN-SENT,及其它相关变量,准备发送SYN报文.
4)调用发送流程的下层接口函数stud_tcp_output()发送SYN报文(发送类型为PACKET_TYPE_SYN).
5)等待"三次握手"完成后返回,建立连接成功;或者出错返回.
stud_tcp_send()函数的实现要点:1)判断是否处于ESTABLISHED状态.
2)将应用层协议的数据拷贝到TCB的输入缓冲区.
3)调用stud_tcp_output()发送TCP的数据报文(发送类型为PACKET_TYPE_DATA).
stud_tcp_recv()函数的实现要点:1)判断是否处于ESTABLISHED状态.
2)从TCB的输入缓冲区读出数据.
3)将数据交给应用层协议.
计算机网络实验系统NetRiver200045在stud_tcp_close()函数中,分组发送流程的实现要点:1)在正常情况下(ESTABLISHED状态),进行相应状态转换;非正常情况下(SYN-SENT状态),直接删除TCB结构后退出.
2)调用发送流程下层接口函数stud_tcp_output()发送FIN报文(发送类型为PACKET_TYPE_FIN).
3)等待回应的ACK报文,收到后成功返回;或者出错返回.
7.
4.
5系统提供的接口函数1)TCP处理中由于某种原因丢弃报文voidtcp_DiscardPkt(char*pBuffer,inttype);参数:char*pBuffer:指向被丢弃的报文;inttype:报文丢弃的原因,有以下三种可能:STUD_TCP_TEST_SEQNO_ERROR序列号错误STUD_TCP_TEST_SRCPORT_ERROR源端口错误STUD_TCP_TEST_DSTPORT_ERROR目的端口错误说明:本函数给出了丢弃报文的函数接口返回值:无2)IP报文发送函数:voidtcp_sendIpPkt(unsignedchar*pData,uint16len,unsignedintsrcAddr,unsignedintdstAddr,uint8ttl)参数:pData:IP上层协议数据;len:IP上层协议数据长度;srcAddr:源IP地址;dstAddr:目的IP地址;ttl:跳极限;说明:本函数提供了发送IP报文的接口返回值:计算机网络实验系统NetRiver2000--46无下列函数仅用于socket接口函数:3)IP数据报文主动接收:intwaitIpPacket(char*pBuffer,inttimeout)参数:char*pBuffer:接收缓冲区的指针inttimeout:等待时间返回值:如果正确接收则返回接收到的数据长度,否则返回-1说明:本函数用于学生代码中主动接收IP分组,如果在设定时间内正确接收到分组,则将该分组内容复制到pBuffer中,否则返回-14)客户端获得本机IPv4地址:UINT32getIpv4Address();5)客户端获得服务器IPv4地址:UINT32getServerIpv4Address();6)全局变量intgSrcPort=2005;intgDstPort=2006;intgSeqNum=0;intgAckNum=0;7.
4.
6需要完成的接口函数7.
4.
6.
1接收和发送函数一、针对分组交互的测试1)TCP分组接收函数:intstud_tcp_input(char*pBuff,unsignedshortlen,unsignedintsrcAddr,unsignedintdstAddr)计算机网络实验系统NetRiver200047参数:char*pBuff:指向接收缓冲区的指针,从TCP头开始unsignedshortlen:缓冲区数据长度unsignedintsrcAddr:源IP地址unsignedintdstAddr:目的IP地址返回值:如果成功则返回0,否则返回-1说明:所有接收到的TCP报文都将调用本函数传递给学生代码,本函数中学生需要维护一个状态机,并根据状态机得变迁调用stud_TCP_send向服务器发送对应的报文,如果出现异常,则需要调用tcp_sendReport函数向服务器报告处理结果.
2)TCP分组发送函数:voidstud_tcp_output(char*pData,unsignedshortlen,unsignedcharflag,unsignedshortsrcPort,unsignedshortdstPort,unsignedintsrcAddr,unsignedintdstAddr)参数:char*pData:数据指针unsignedshortlen:数据长度unsignedcharflag:分组类型unsignedshortsrcPort:源端口unsignedshortdstPort:目的端口unsignedintsrcAddr:源IP地址unsignedintdstAddr:目的IP地址其中,分组类型flag为以下可能:PACKET_TYPE_DATA数据PACKET_TYPE_SYNSYN标志位开PACKET_TYPE_SYN_ACKSYN、ACK标志位开PACKET_TYPE_ACKACK标志位开PACKET_TYPE_FINFIN标志位开PACKET_TYPE_FIN_ACKFIN、ACK标志位开输出:计算机网络实验系统NetRiver2000--48无说明:学生需要在此函数中自行申请一定的空间,并封装TCP头和相关的数据,此函数可以由接收函数调用,也可以直接由解析器调用,此函数中将调用tcp_sendIpPkt完成分组发送.
7.
4.
6.
2Socket接口函数1)获得socket描述符intstud_tcp_socket(intdomain,inttype,intprotocol)参数:intdomain:套接字标志符,缺省为INETinttype:类型,缺省为SOCK_STREAMintprotocol:协议,缺省为IPPROTO_TCP返回值:如果正确建连则返回socket值,否则返回-1说明:返回以后在系统调用中可能用到的socket描述符,或者在错误的时候返回-12)TCP建立连接函数intstud_tcp_connect(intsockfd,structsockaddr_in*addr,intaddrlen)参数:intsockfd:套接字标志符structsockaddr_in*addr:socket地址结构指针intaddrlensocket:地址结构的大小返回值:如果正确发送则返回0,否则返回-1说明:在本函数中要求发送SYN报文,并调用waitIpPacket函数获得SYN_ACK报文,并发送ACK报文,直至建立tcp连接.
3)TCP报文发送函数intstud_tcp_send(intsockfd,constunsignedchar*pData,unsignedshortdatalen,intflags)参数:计算机网络实验系统NetRiver200049intsockfd:套接字标志符constunsignedchar*pData:数据缓冲区指针unsignedshortdatalen:数据长度intflags:标志返回值:如果正确接收则返回0,否则返回-1说明:本函数向服务器发送数据"thisisatcptest",在本函数内要调用waitIpPacket函数获得ACK.
4)TCP报文接收函数intstud_tcp_recv(intsockfd,constunsignedchar*pData,unsignedshortdatalen,intflags)参数:intsockfd:套接字标志符constuint8*pData:数据缓冲区指针uint16dataLen:数据长度intflags:标志返回值:如果正确接收则返回0,否则返回-1说明:本函数接收从服务器发送的数据,并调用在本函数内要调用sendIpPkt函数发送ACK.
5)TCP关闭连接函数intstud_tcp_close(intsockfd)参数:intsockfd:连接描述符返回值:如果正常关闭则返回0,否则返回-1说明:在本函数中要求发送FIN报文,并调用waitIpPacket函数获得FIN_ACK报文,并发送ACK报文,直至关闭tcp连接计算机网络实验系统NetRiver2000--508协议状态机实验8.
1实验目的通过协议状态机实验,使学生加深对协议状态机描述的认识,同时对实现协议状态机有一个初步的认识;实验状态机取材于BGP路由协议,通过这个实验,同学们也可以增进对于路由协议的理解.
8.
2实验要求1)协议状态变迁;8.
3实验内容1)协议状态变迁;根据系统的各种输入事件,进行BGP状态的变迁,并根据BGP协议在适当情况下进行相应的处理.
8.
4实验帮助8.
4.
1BGP协议介绍8.
4.
1.
1协议简述BGP是一种自治系统间的动态路由发现协议,它的基本功能是在自治系统间自动交换无环路的路由信息.
与OSPF和RIP等在自治区域内部运行的协议对应,BGP是一类EGP(EdgeGatewayProtocol)协议,而OSPF和RIP等为IGP(InteriorGatewayProtocol)协议.
BGP是在EGP应用的基础上发展起来的.
EGP在此以前已经作为自治区域间的路由发现协议,广泛应用于NFSNET等主干网络上.
但是,EGP被路由环路问题所困扰.
BGP通过在路由信息中增加自治区域(AS)路径的属性,来构造自治区域的拓扑图,从而消除路由环路并实施用户配置的策略.
同时,随着INTERNET的飞速发展,路由表的体积也迅速增加,自治区域间路由信息的交换量越来越大,都影响了网络的性能.
BGP支持无类型的区域间路由CIDR(ClasslessInterdomainRouting),可以有效的减少日益增大的路由表.
BGP运行时刻分别与本自治区域外和区域内的BGP伙伴建立连接(使用Socket).
与区域内伙伴的连接称为IBGP(InternalBGP)连接,与自治区域外计算机网络实验系统NetRiver200051的BGP伙伴的连接称为EBGP(ExternalBGP)连接.
本地的BGP协议对IBGP和EBGP伙伴使用不同的机制处理.
8.
4.
1.
2BGP协议的报文类型BGP有4种类型的消息.
分别为OPEN,UPDATE,KEEPALIVE和NOTIFY.
它们有相同的消息头.
1.
消息头结构:1234Marker(16bytes)LengthTypeMarker:(16字节)鉴权信息Length:(2字节)消息的长度Type:(1字节)消息的类型0:OPEN1:UPDATE2:NOTIFICATION3:KEEPALIVE2.
OPEN消息结构:消息头加如下结构:1234VersionMyAutonomousSystemHoldTimeBGPIdentifierOptParmLenOptionalParameters(nbytes)Version:(1字节)发端BGP版本号MyAutonomousSystem:(2字节无符号整数)本地AS号计算机网络实验系统NetRiver2000--52HoldTime:(2字节无符号整数)发端建议的保持时间BGPIdentifier:(4字节)发端的路由器标识符OptParmLen:(1字节)可选的参数的长度OptionalParameters:(变长)可选的参数3.
KEEPALIVE消息结构KEEPALIVE消息只有一个消息头.
4.
NOTIFY消息结构消息头加如下结构:1234ErrorcodeErrsubcodeDataErrorcode:(1字节)错误代码错误代码错误类型1消息头错2OPEN消息错3UPDATE消息错4保持时间超时5状态机错6退出Errsubcode:(1字节)辅助错误代码,略.
Data:(变长)依赖于不同的错误代码和辅助错误代码.
用于诊断错误原因.
5.
UPDATE消息结构消息头加如下结构:UnfeasibleRoutesLen:(2字节无符号整数)不可达路由长度WithdrawnRoutes:(变长)退出路由PathAttributeLen:(2字节无符号整数)路径属性长PathAttributes:(变长)路径属性(以下详细说明)NetworkLayerReachabilityInformation:(变长)网络可达信息(信宿)其中退出路由和信宿地址的表示方法为一的二元组.
length一个字节,指示地址前缀的长度.
prefix为地址前缀,长度1至4字节.
8.
4.
1.
3BGP伙伴的有限状态机(FSM)BGP有限状态机有6种状态:1-Idle2-Connect计算机网络实验系统NetRiver2000533-Active4-OpenSent5-OpenConfirm6-EstablishedBGP事件:1-Start2-ManualStop3-BGPTransportconnectionopen4-BGPTransportconnectionclosed5-BGPTransportconnectionopenfailed6-BGPTransportfatalerror7-ConnectRetrytimerexpired8-HoldTimerexpired9-KeepAlivetimerexpired10-ReceiveOPENmessage11-ReceiveKEEPALIVEmessage12-ReceiveUPDATEmessage13-ReceiveNOTIFICATIONmessageIdle状态BGP总是从IDLE状态开始,此时拒绝所有外来连接.
当一个Start事件(IE1)发生(如操作者手动配置BGP进程或复位现有的BGP进程等),BGP进程将初始化所有BGP资源,起定时器,并初始化与邻居间的TCP连接,监听来自邻居的TCP初始化,并将自己的状态置为Connect.
Connect状态在此状态,BGP进程等待TCP建连完成.
若TCP建连成功,BGP进程将清除ConnectRetry定时器,完成初始化,并向邻居发送OPEN报文,且将自己状态置为OpenSent状态.
若TCP建连不成功,BGP进程将继续监听来自邻居的连接,复位ConnectRetry定时器,并将自己状态转为Active.
若在此状态ConnectRetry定时器超时,此定时器将被复位,进程将再次试图与邻居建立TCP连接,状态仍保持在Connect状态.
其他事件(除了IE1)都将使BGP状态回到Idle状态.
Active状态计算机网络实验系统NetRiver2000--54在此状态,BGP进程试图初始化与邻居的TCP连接,若TCP建连成功,BGP进程清除ConnectRetry定时器,完成初始化,并向邻居发送OPEN报文,且将自己状态置为OpenSent状态.
若在此状态ConnectRetry定时器超时,进程将回到Connect状态,并复位ConnectRetry定时器,且初始化TCP连接,监听TCP连接.
其他事件(除了IE1)都将使BGP状态回到Idle状态.
OpenSent状态在此状态,Open报文已经被发送,BGP进程将等待来自邻居的OPEN报文.
当收到来自邻居的Open报文时,BGP进程将检查报文的所有的域,若存在错误,则发送Notification报文,并将自己状态置为Idle.
若Open报文中没有错误,则发送一个KeepAlive报文,并置KeepAlive定时器.
并将自己状态置为OpenConfirm.
若发生TCP断连,本地进程将关闭BGP连接,重置ConnectRetry定时器,并开始监听新的连接.
自己的状态被置为Active.
其他事件(除了IE1)都将使BGP状态回到Idle状态.
OpenConfirm状态在此状态,BGP进程等待KeepAlive报文或Notification报文.
若收到KeepAlive报文,则将自己状态转到Estabilished状态.
若在收到KeepAlive报文之前Hold定时器超时,则发送一个Notification报文,其中错误代码为HoldTimerExpired,并将状态转为Idle.
若收到Notification报文,则转换状态到Idle态.
若Hold定时器超时,或错误发生,或Stop事件发生,将发送一个Notification报文到邻居,关闭BGP连接,并转换状态到Idle态.
Estabilished状态在此状态,BGP对等体的连接被完全建立,此时可以交互各种BGP报文,若收到Notification报文,则转换状态到Idle态.
若Hold定时器超时,则发送一个Notification报文,其中错误代码为"HoldTimerExpired",并将自己状态转为Idle态.
若Keepalive定时器超时,则发送一个Keepalive报文,并复位Keepalive定时器.
若收到BGPStop事件,则发送Notification报文,其中错误代码为Cease,并将自己状态转为Idle.
计算机网络实验系统NetRiver200055其他事件(除了IE1)都将发送Notification报文,其中错误代码为FinateStateMachineError,并将BGP状态回到Idle状态.
状态机如图8.
1所示:ActiveOpen-sentOpen-confirEstablishedIdleConnectConnect-RetrytimerexpiryTCPconnectionfailsConnect-RetrytimerexpiryStartOthersTCPconnectionfailsErrorErrorErrorKeepAlivetimerexpiryKeepAlivepacketidCorrectOPENpacketreceivedTCPconnectionsetupTCPconnectionsetupOthers1.
KeepAlivetimerexpiry2.
Updatereceived3.
KeepAliveeceived图8.
1BGP有限状态机一个典型的过程为:Idle(启动消息)->Connect(TCP连接成功,发OPEN)->OpenSent(收到OPEN消息,协商成功)->OpenConfirm(收到KEEPALIVE消息)->Established(TCP连接关闭,有错误,或处理UPDATE消息失败,或收到NOTIFICATION消息)->Idle8.
4.
2需要实现的接口函数1)收到Open报文事件处理函数BOOLEANstud_bgp_FsmEventOpen(BgpPeer*pPeer,BYTE*pBuf,unsignedintlen)参数:pPeer:指向当前对等体的指针pBuf:指向接收到的open报文计算机网络实验系统NetRiver2000--56len:open报文长度返回值:0:成功处理Open报文-1:处理过程出现错误说明:当系统收到BGPOpen报文时,会调用此函数,学生编写此函数,应该实现如下功能:对Open报文进行检查,根据当前状态,调整BGP状态机的状态.
并在需要的时候发送KeepAlive报文.
2)收到Keepalive报文事件处理函数BOOLEANstud_bgp_FsmEventKeepAlive(BgpPeer*pPeer,BYTE*pBuf,unsignedintlen)参数:pPeer:指向当前对等体的指针pBuf:指向接收到的keepalive报文len:keepalive报文长度返回值:0:成功处理Keepalive报文-1:处理过程出现错误说明:当系统收到BGPKeepalive报文时,会调用此函数,学生编写此函数,应该实现对BGP状态进行相应的改变.
3)收到Notification报文事件处理函数BOOLEANstud_bgp_FsmEventNotification(BgpPeer*pPeer,BYTE*pBuf,unsignedintlen)参数:pPeer:指向当前对等体的指针pBuf:指向接收到的Notification报文len:Notification报文长度返回值:0:成功处理Notification报文计算机网络实验系统NetRiver200057-1:处理过程出现错误说明:当系统收到BGPNotification报文时,会调用此函数,学生编写此函数,应该实现对BGP状态进行相应的改变.
4)收到Update报文事件处理函数BOOLEANstud_bgp_FsmEventUpdate(BgpPeer*pPeer,BYTE*pBuf,unsignedintlen)参数:pPeer:指向当前对等体的指针pBuf:指向接收到的Update报文len:Update报文长度返回值:0:成功处理Update报文-1:处理过程出现错误说明:当系统收到BGPUpdate报文时,会调用此函数,学生编写此函数,应该实现对BGP状态进行相应的改变.
5)TCP连接异常事件处理函数voidstud_bgp_FsmEventTcpException(BgpPeer*pPeer,BYTEmsgType)参数:pPeer:指向当前对等体的指针msgType:TCP异常类型.
可能的取值如下:BGP_TCP_CLOSE/*tcpclose*/BGP_TCP_FATAL_ERROR/*BGPTransportfatalerror*/BGP_TCP_RETRANSMISSION_TIMEOUT/*retransmissiontimeout*/返回值:无说明:当TCP出现异常时,系统会调用此函数.
学生编写此函数,根据BGP状态机的需求,进行相应操作,以及状态的改变.
6)定时器超时事件处理函数计算机网络实验系统NetRiver2000--58voidstud_bgp_FsmEventTimerProcess(BgpPeer*pPeer,BYTEmsgType)参数:pPeer:指向当前对等体的指针msgType:定时器消息类型,可能的取值如下:BGP_CONNECTRETRY_TIMEOUTBGP_HOLD_TIMEOUTBGP_KEEPALIVE_TIMEOUT返回值:无说明:当定时器超时时,系统会调用此函数,根据msgType传入超时定时器的类型.
学生应根据协议需求,进行相应操作,以及状态的改变.
7)Bgp开始事件处理函数voidstud_bgp_FsmEventStart(BgpPeer*pPeer)参数:pPeer:指向当前对等体的指针返回值:无说明:当发生BGPStart事件(IE1)时,系统调用此函数,学生根据协议要求编写代码,进行BGP状态的改变,并在适当的条件下调用试图建连函数初始化TCP连接.
8)Bgp结束事件处理函数voidstud_bgp_FsmEventStop(BgpPeer*pPeer)参数:pPeer:指向当前对等体的指针返回值:无说明:当发生BGPStop事件(IE2)时,系统调用此函数,学生根据协议要求编写代码,进行BGP状态的改变.
9)收到连接结果事件处理函数计算机网络实验系统NetRiver200059voidstud_bgp_FsmEventConnect(BgpPeer*pPeer)参数:pPeer:指向当前对等体的指针返回值:无说明:BGP的TCP建连成功时,系统将调用此函数.
学生需要在此函数中实现BGP状态的改变,以及在必要的时候构造BGPOpen报文,并通过bgp_FsmSendTcpData函数发送出去.
8.
4.
3数据结构定义系统定义了BGP对等体结构定义,如下:structBgpPeer{DWORDbgp_dwMyRouterID;//本路由器的路由器ID;WORDbgp_wMyAS;//向对方建立时,所用的AS.
联盟相关DWORDbgp_dwCfgHoldtime;//设置的holdtime时间值BYTEbgp_byState;//协议状态机BYTEbgp_bAuth;//是否有认证信息}8.
4.
4系统提供的接口函数1)试图建连函数voidbgp_FsmTryToConnectPeer()参数:无返回值:无说明:学生根据BGP协议要求,在需要试图建连时,调用此函数开始TCP连接的初始化.
2)TCP报文发送函数voidbgp_FsmSendTcpData(char*pBuf,DWORDdwLen)参数:计算机网络实验系统NetRiver2000--60pBuf:传送的报文内容dwLen:发送的报文长度返回值:无说明:学生根据BGP协议要求,在需要发送BGP报文时调用此函数来发送BGP报文.
计算机网络实验系统NetRiver2000619IPSEC协议实验9.
1实验目的通过IPSEC协议实验,使学生加深对IPSEC协议的认识,同时对IPSEC协议实现的工作模式、AH协议和ESP协议有一个初步的认识,通过这个实验,同学们也可以增进对于网络安全协议的理解.
9.
2实验要求1)传输模式报文处理(AH协议)2)隧道模式报文处理(ESP协议)3)混合模式报文处理(AH协议+ESP协议)4)3des加密算法实现(ESP协议)9.
3实验内容1)传输模式报文处理(AH协议);根据系统提供的已经建立安全联盟的信息,对于接收到的报文和发送的报文,在IPSEC传输模式的工作状态下,根据AH协议使用系统提供的认证算法对报文进行相应的处理.
2)隧道模式报文处理(ESP协议);根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在IPSEC隧道模式的工作状态下,根据ESP协议使用系统提供的认证和加密算法对报文进行相应的处理.
3)混合模式报文处理(AH协议+ESP协议);根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在IPSEC混合模式的工作状态下,根据AH协议和ESP协议使用系统提供的认证和加密算法对报文进行相应的处理.
4)3DES加密算法实现(ESP协议);根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在IPSEC传输模式的工作状态下,根据ESP协议通过使用系统的3des加密算法对报文进行相应的处理.
9.
4实验帮助9.
4.
1IPSEC协议介绍9.
4.
1.
1协议简述IPsec(InternetProtocolSecurity)即Intenet安全协议,是IETF计算机网络实验系统NetRiver2000--62提供Internet安全通信的一系列规范,它提供私有信息通过公用网的安全保障.
IPSec适用于目前的版本IPv4和下一代IPv6.
由于IPSec在TCP/IP协议的核心层——IP层实现,因此可以有效地保护各种上层协议,并为各种安全服务提供一个统一的平台.
IPSec也是被下一代Internet所采用的网络安全协议.
IPSec协议是现在VPN开发中使用的最广泛的一种协议,它有可能在将来成为IPVPN的标准.
IPsec使用两个不同的协议——AH和ESP来确保通信的认证、完整性和机密性.
它既可以保护整个IP数据报也可以只保护上层协议.
适当的模式称为:隧道模式和传送模式.
在隧道模式下,IP数据报被IPsec协议完全加密成新的数据报;在传送模式下,仅仅是有效负荷被IPsec协议将IPsec头插入IP头和上层协议头之间来搬运.
为保护IP数据报的完整性,IPsec协议使用了"散列信息认证代码"(HMAC:hashmessageauthenticationcodes).
为了得到这个"散列信息认证代码",IPsec使用了像MD5和SHA这样的散列算法根据一个密钥和数据报的内容来生成一个"散列".
这个"散列信息认证代码"包含在IPsec协议头并且数据包接受者可以检查"散列信息认证代码"(当然前提是可以访问密钥).
为了保证数据报的机密性,IPsec协议使用对称加密算法.
IPsec标准需要NULL和DES执行者.
如今经常使用像3DES、AES和Blowfish这样更加强的算法.
为了避免拒绝服务攻击(DoS:denialofserviceattacks),IPsec协议使用了一个滑动窗口,每个数据包被分配到一个序号,并且只接受在不在窗口中的或新的数据包.
旧的数据包立即丢弃.
这可以避免重复攻击,即:攻击者记录原始的数据并稍后再次重发.
本实验的设计中没有加入抗重播服务.
通信的双方为了能够加密和解密IPsec数据包,他们需要一种方法来保存通信的密钥、算法和IP地址等有关信息.
所有的这些用来保护IP数据报的参数保存在一个"安全联盟"(SA:securityassociation)中.
"安全联盟"依次保存在一个"安全联盟"数据库(SAD:securityassociationdatabase)中.
每个"安全联盟"定义了以下参数:1)结果IPsec头中的源IP地址和目标IP地址.
这是IPsec双方计算机网络实验系统NetRiver200063保护数据包的IP地址2)IPsec协议(AH还是ESP)3)IPsec协议用的加密算法和密钥4)IPsec协议用的认证算法和密钥5)安全参数索引(SPI).
这是一个32位的数据,用来识别"安全联盟"(SA)6)IPsec模式(隧道模式或者传输模式)因为"安全联盟"定义了源IP地址和目标IP地址,在一个全双工IPsec通信中,它只能保护一个方向的通信.
如果想保护双方的通信,IPsec需要两个单向的"安全联盟".
"安全联盟"仅仅声明IPsec支持保护通信.
需要定义另外的信息来声明什么时候通信需要保护.
这些信息保存在"安全策略"(SP:securitypolicy)中,"安全策略"又依次保存在"安全策略库"(SPD:securitypolicydatabase)中.
一个"安全策略"通常声明下列参数:1)被保护的数据包的源地址和目标地址.
在传输模式下,这同SA的地址相同.
在隧道模式下,他们可能不一样.
2)被保护的协议或端口.
一些IPsec执行者不允许定义被保护的协议,这种情况下将保护所有涉及到的IP地址之间的通信.
3)用来保护数据包的"安全联盟"9.
4.
1.
2AH协议、ESP协议及3DES加密算法介绍IPsec协议包括两个协议:认证头协议(AH:AuthenticationHeader)和封装安全负载协议(ESP:EncapsulatedSecurityPayload).
两者都独立于IP协议.
认证头协议使用IP协议的51,封装安全负载协议使用IP协议50.
1.
AH协议认证头协议保护IP双数据报的的完整性.
为了达到这一点,认证头协议计算了一个"散列信息认证代码"(HMAC)来保护完整性.
当计算一个"散列信息认证代码"时,认证头协议基于它的密钥、有效负载和IP头的不可变的部分(如IP地址).
然后它将认证头放到数据包里.
认证头共长24个字节.
第一个字节是"下一个头"字段,这个字段指定了下边协议的头.
在遂道模式下,一个完整的IP数据报被封装,因此这计算机网络实验系统NetRiver2000--64个字段的值是4.
在传送模式下,当被封装的是TCP数据报时相应的值是6.
下一个字节指定了的有效负载的长度.
这个字段下边是两个保留字节.
再下边两个字节指定了32位长的安全参数索引(SPI:SecurityParameterIndex).
安全参数索引指定了解安全负载封装使用的"安全联盟".
32位长的序号防止重复攻击.
最后96位保存了"散列信息认证代码"(HMAC).
"散列信息认证代码"保护了数据包的完整性,因为只有双方知道可以创建和检查"散列信息认证代码"的密钥.
因为认证头协议保护了IP数据包括IP头的不可变的部分(如IP地址),认证头协议不允许网络地址转换(NAT:NetworkAddressTranslation).
网络地址转换将IP头的IP地址(通常是源IP地址)改为不同的IP地址,当改变后"散列信息认证代码"就不再有效了.
IPsec协议的"横越网络地址转换"(NAT-Traversal)扩展围绕这一限制实现了一条道路.
下图显示了认证头的结构.
01234567890123456789012345678901|NextHeader|PayloadLen|RESERVED||SecurityParametersIndex(SPI)||SequenceNumberField|||+AuthenticationData(variable)|||NextHeader该字段长度为8位,指明在AH协议头后的有效载荷的协议类型.
Payloadlen该字段长度为8位,指明在AH协议头后的有效载荷的长度.
RESERVED该字段长度为16位,是预留位,默认值为全零.
SecurityParametersIndex计算机网络实验系统NetRiver200065该字段长度为32位,它与目的地址和AH认证协议唯一的标识一个安全连接.
SequenceNumberField该字段长度为32位,是一个累加的值,为这个安全连接提供了抗重播功能,初始化为0,第一个包的值为1.
AuthenticationData该字段为可变长度,但是必须是32的整数倍,用来存放报文完整性校验值.
2.
ESP协议安全负载封装协议既可以使用"散列信息认证代码"来确保数据包的完整性,又可以使用加密算法保证机密性.
在加密数据包并计算出"散列信息认证代码"后,生成安全负载封装头并加入数据包.
安全负载封装头的第一个双字字段指定了安全参数索引(SPI),这个"索引"指定了解安全负载封装数据包用到的"安全联盟".
下一个双字字段保存序号.
序号被用来预防重复攻击.
第三个双字字段指定了加密程序使用的"初始向量"(IV:InitializationVector).
不使用"初始向量"对称加密算法可能被多次攻击.
"初始向量"可以确保两个相同的负载被加密成不同的负载.
IPsec使用密码块来进行加密处理.
因此,如果负载的长度不是声的整倍长时可能需要填补.
这时需要增加填补长度.
下边的两个字节是填补长度.
"下一个头"字段指定了下一个头.
"安全负载封装"头的最后96位长是"散列信息认证代码",用来确保数据包的完整性.
这个"散列信息认证代码"仅仅统计数据包的负载.
IP头不包括在计算之列.
01234567890123456789012345678901|SecurityParametersIndex(SPI)||SequenceNumber||PayloadData*(variable)|||||Padding(0-255bytes)|计算机网络实验系统NetRiver2000--66||PadLength|NextHeader||AuthenticationData(variable)|~~||SecurityParametersIndex(SPI)SPI是一个任意的32位值,它与目的IP地址和安全协议(ESP)结合,唯一地标识这个数据报的SA.
SequenceNumber这个无符号的、32位字段包含一个单调递增的计数器值(序列号).
PayloadData有效载荷数据是变长字段,它包含下一个头字段描述的数据.
Padding供加密使用的填充字段,字节数为(0-255).
PadLength填充字段的长度.
NextHeader该字段为8位字节,表识有效载荷字段中数据的类型.
AuthenticationData验证字段用来存放ESP报文的完整性校验值,该字段可选,只有SA选择验证服务的时候,才包含验证数据字段.
3.
3DES加密算法3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密.
数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSIX.
3.
92.
DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密.
比起最初的DES,3DES更为安全.
3DES(即TripleDES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形.
它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设计算机网络实验系统NetRiver200067Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,加密过程为:C=Ek3(Dk2(Ek1(P)))解密过程为:P=Dk1((EK2(Dk3(C)))K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密.
多年来,它在对付强力攻击时是比较安全的.
若数据对安全性要求不那么高,K1可以等于K3.
在这种情况下,密钥的有效长度为112位.
(1)先使用密钥1通过des加密算法对明文1加密,得到密文1(2)再用密钥2通过des解密算法对密文1解密,得到明文2(肯定不是原来的明文)(3)最后再用密钥3对明文2用des加密算法加密,得到密文2.
注意:本实验设计中的安全联盟只提供两个密钥,即在加密过程中密钥3用密钥1代替,这样总共密钥就是128位了,并且在ESP协议使用3DES加密算法对报文加密时没有加入初始化向量.
9.
4.
2需要实现的接口函数1)收到ipsec报文事件处理函数intstud_ipsec_input(char*pBuffer,unsignedintlen)参数:pBuffer:指向当前接收报文的指针,从IP报头开始len:接收到的ipsec报文长度返回值:0:成功解封装ipsec报文1:解封装过程出现错误说明:当系统收到ipsec报文时,会调用此函数,学生编写此函数,应该实现如下功能:根据系统提供的安全联盟数据库,按照报文源地址、目的地址和上层协议号查找与之匹配的安全策略,确定与该安全策略对应的安全联盟束,再根据源地址、目的地址和上层协议号查找于之对应的安全联盟,从而根据找到的安全联盟中的模式、认证加密算法和密钥处理该报文.
(注意:有可能被多次保护,需要按照先后顺序对报文进行认证和解密),具体流程图如下图计算机网络实验系统NetRiver2000--68所示:AH输入处理流程图:计算机网络实验系统NetRiver200069开始查找AH认证算法AH认证数据剥离AH输入包还原结束ESP输入处理流程图:计算机网络实验系统NetRiver2000--70开始查找ESP认证算法查找ESP加密算法ESP认证数据剥离ESP加密数据解密ESP输入包还原结束2)发送ipsec报文事件处理函数intstud_ipsec_output(char*pBuffer,unsignedintlen)参数:pBuffer:指向当前接收报文的指针,从IP报头开始len:接收到报文长度返回值:0:成功封装ipsec报文1:封装过程出现错误计算机网络实验系统NetRiver200071说明:当系统收到普通报文时,会调用此函数,学生编写此函数,应该实现如下功能:根据系统提供的安全策略数据库,按照报文源地址、目的地址和上层协议号查找于之匹配的安全策略,确定与该安全策略对应的安全联盟束,再根据源地址、目的地址和上层协议号查找于之对应的安全联盟,从而根据找到的安全联盟中的模式、认证加密算法和密钥处理该报文.
(注意:有可能一个数据流命中多个安全联盟,需要按照命中的先后顺序对数据流进行安全保护),处理流程图如下图所示:计算机网络实验系统NetRiver2000--72AH输出处理流程图:计算机网络实验系统NetRiver200073ESP输出处理流程图:计算机网络实验系统NetRiver2000--74查找ESP认证算法开始获得输出序列号认证数据长度计算加密数据填充对数据进行加密计算认证数据查找ESP加密算法结束9.
4.
3数据结构以及宏定义系统定义了安全策略头结构定义,如下:typedefstructipsecSpdHeader{计算机网络实验系统NetRiver200075structipsecPolicySelector*spSelector;//指向当前接口安全策略数据库的头指针}IPSEC_SPD_HEADER;系统定义安全策略结构定义,如下:typedefstructipsecPolicySelector{structipsecPolicySelector*next;//指向下一条安全策略条目DWORDsrcAddr;//安全策略中数据流的源地址DWORDdstAddr;//安全策略中数据流的目的地址DWORDsrcPref;//安全策略中数据流源地址的前缀DWORDdstPref;//安全策略中数据流目的地址的前缀structipsecAssoc*spSA;//指向当前接口安全联盟数据库的头指针}IPSEC_POLICY_SELECTOR;系统定义的安全联盟密钥结构定义,如下:typedefstructipsecSaKey{BYTEkeyNum;/*thenumberofkeys*/unsignedshortkeyBits;/*bitsofonekey*/BYTEkey[1];/*keybits/8*/}IPSEC_SA_KEY;系统定义的安全联盟结构定义,如下:typedefstructipsecAssoc{structipsecAssoc*next;//指向下一条安全联盟的指针structipsecAssocSelectorselector;//安全联盟对应的数据流DWORDsrcAddr;//当前安全联盟的起始地址DWORDdstAddr;//安全联盟的目的地址BYTEproto;//安全联盟所使用的协议(AH或者ESP)BYTEmode;//安全联盟的工作模式(隧道模式或者传输模式)DWORDspi;//安全联盟的索引号BYTEalgAuth;//安全联盟所使用的认证算法名称计算机网络实验系统NetRiver2000--76BYTEalgEncry;//安全联盟所使用的加密算法名称structipsecSaKey*keyAuth;//安全认证密钥structipsecSaKey*keyEncry;//安全联盟加密密钥1(DES加密算法的密钥,3DES加密算法的密钥1)structipsecSaKey*keyEncry2;//安全联盟加密密钥2(3DES加密算法的密钥2)DWORDivLen;//安全联盟初始化向量长度(单位为字节)BYTEiv[20];//安全联盟初始化向量}IPSEC_ASSOC;系统定义了加密算法结构如下:typedefstructespAlgorithm{unsignedintivLen;//初始化向量长度(单位为字节)constchar*name;//算法名称/*加密算法函数指针*/int(*encrypt)(unsignedchar*plainText,unsignedintplainLen,unsignedchar*encryText,unsignedint*encryLen,char*pKeys,char*iv);/*解密算法函数指针*/int(*decrypt)(unsignedchar*pEncryText,unsignedintencryLen,unsignedchar*pPlainText,unsignedint*pPlainLen,char*pKeys,char*iv);/*填充函数指针*/int(*padding)(unsignedchar*pOriginalText,unsignedintoriginalLen,unsignedchar**pPaddingText,unsignedint*paddedLen,unsignedcharnxtHdr);}ESP_ALGORITHM;系统定义了认证算法结构如下:typedefstructahAlgorithm{unsignedintdigestSize;//认证摘要数据长度(单位为比特)unsignedintdataLen;//源数据长度(单位为比特)constchar*name;//认证算法名称void(*hashInit)(IKE_MD5_CTX*ctx_hash);/*initializecontext*/计算机网络实验系统NetRiver200077void(*hashUpdate)(IKE_MD5_CTX*ctx_hash,constunsignedchar*input,unsignedintlen);/*addinputtohash*/void(*hashFinal)(unsignedchar*output,IKE_MD5_CTX*ctx_hash);/*finalizehash*/}AH_ALGORITHM;系统定义了ESP协议结构如下:typedefstructipsec_esp{unsignedintspi;/*安全索引号*/unsignedintseq;/*序列号*/}IPSEC_ESP;系统定义了AH协议结构如下:typedefstructipsec_ah{BYTEah_nxt;//下一头BYTEah_len;//认证数据长度unsignedshortah_reserved;//保留位DWORDah_spi;//安全索引号DWORDah_seq;//序列号}IPSEC_AH;系统定义了如下宏:#defineIPSEC_AUTH_MD51//MD5认证算法#defineIPSEC_ENCRY_DES1//DES加密算法#defineIPSEC_ENCRY_3DES2//3DES加密算法#defineIPSEC_MODE_TUNNEL1//隧道模式#defineIPSEC_MODE_TRANSPORT2//传输模式#defineIPSEC_PROTO_AH1//AH协议#defineIPSEC_PROTO_ESP2//ESP协议9.
4.
4系统提供的接口函数及全局变量1)系统接收报文函数voidipsec_Receive_process(char*pBuffer,intdwLen)参数:计算机网络实验系统NetRiver2000--78pBuffer:指向当前解封装完毕报文的指针,从IP报头开始len:接收到解封装完毕报文长度返回值:无说明:学生在完成对IPSEC报文解封装后,将报文交给该函数进行处理.
2)系统发送报文函数voidipsec_Send_process(char*pBuffer,intiLen)参数:pBuffer:指向当前封装完毕报文的指针,从IP报头开始len:接收到解封装完毕报文长度返回值:无说明:学生在完成对普通报文的封装后,将报文交给该函数进行处理.
3)认证算法查找函数AH_ALGORITHM*ahAlgorithmLookup(unsignedcharalgAuth)参数:algAuth:认证算法名称返回值:存储有关认证算法信息的结构体指针说明:学生在从安全联盟中获得当前所使用的认证算法名称,通过该函数获得系统提供的认证算法函数接口以及相关信息.
4)加密算法查找函数ESP_ALGORITHM*espAlgorithmLookup(unsignedcharalgEncry)参数:algEncry:加密算法名称返回值:存储有关加密算法信息的结构体指针说明:学生在从安全联盟中获得当前所使用的加密算法名称,通过该函数获得计算机网络实验系统NetRiver200079系统提供的加密算法函数接口以及相关信息.
5)AH协议认证摘要计算函数intah4CalculateICV(unsignedchar*pPacketCpy,unsignedshorttotalLen,unsignedchar*pOutput,constAH_ALGORITHM*pAlg,IPSEC_ASSOC*pSA)参数:pPacketCpy:指向源报文拷贝的指针(请注意是源数据的拷贝,从IP报头开始)totalLen:源报文长度pOutput:指向存储计算出报文摘要信息的指针pAlg:认证算法结构体指针pSA:安全联盟指针返回值:失败:-1成功:0说明:学生根据系统提供的这个函数来计算当前AH协议报文中的认证数据摘要.
6)ESP协议认证摘要计算函数intespAuthCalculate(unsignedchar*pData,unsignedshortdataLen,unsignedchar*pOutput,AH_ALGORITHM*pAlg,IPSEC_ASSOC*pSA)参数:pData:指向源报文ESP报头的指针dataLen:需要计算认证摘要的报文长度pOutput:指向存储计算出的报文摘要信息的指针pAlg:认证算法结构体指针pSA:安全联盟指针返回值:失败:-1成功:0说明:计算机网络实验系统NetRiver2000--80学生根据系统提供的这个函数来计算当前ESP协议报文中的认证数据摘要.
7)ESP协议加密函数int(*encrypt)(unsignedchar*plainText,unsignedintplainLen,unsignedchar*encryText,unsignedint*encryLen,char*pKeys,char*iv);参数:plainText:指向需要加密的原文头指针(如果保护模式为隧道模式从IP报头开始,如果保护模式为传输模式从IP报文的有效载荷开始)plainLen:原文长度encryText:指向有效载荷加密后的指针encryLen:获取有效载荷加密后的数据长度的整型指针pKeys:指向加密密钥的指针iv:指向初始化向量的指针返回值:失败:-1成功:0说明:学生根据安全联盟提供的函数指针,利用系统提供的加密算法获得需要加密的报文部分的密文.
8)ESP协议解密函数int(*decrypt)(unsignedchar*pEncryText,unsignedintencryLen,unsignedchar*pPlainText,unsignedint*pPlainLen,char*pKeys,char*iv);参数:encryText:指向有效载荷密文的指针,指向ESP头部之后的数据encryLen:密文的长度plainText:指向解密后的原文指针plainLen:获取有效载荷解密后数据长度的整型指针pKeys:指向加密密钥的指针iv:指向初始化向量的指针返回值:失败:-1成功:0计算机网络实验系统NetRiver200081说明:学生根据安全联盟提供的函数指针,利用系统提供的解密算法获得需要解密报文部分的原文.
9)ESP协议填充函数int(*padding)(unsignedchar*pOriginalText,unsignedintoriginalLen,unsignedchar**pPaddingText,unsignedint*paddedLen,unsignedcharnxtHdr);参数:pOriginalText:指向源数据的指针(如果保护模式为隧道模式从IP报头开始,如果保护模式为传输模式从IP报文的有效载荷开始)originalLen:源数据的长度pPaddingText:获取填充后的报文拷贝指针(在函数内部为其分配内存,在函数外部需要释放)plainLen:获取有效载荷填充之后数据长度的整型指针nxtHdr:被加密报文的协议号(需要加入ESP协议填充头中下一头字段值)返回值:失败:-1成功:0说明:学生根据安全联盟提供的函数指针,由于ESP算法的加密数据块必须为32bit的整数倍,利用系统提供的填充函数,获取填充后的报文拷贝.
10)structipsecSpdHeader*g_ipsec_spd_in说明:该全局变量为接收IPsec报文时的安全策略数据库,数据流根据目的地址、源地址查询安全策略数据库,以决定该数据流是否被命中,如果命中使用该安全策略中IPSEC安全联盟对应的信息对报文解除IPSEC协议保护.
11)structipsecSpdHeader*g_ipsec_spd_out说明:该全局变量为转发正常报文时的安全策略数据库,数据流根据目的地址、源地址查询安全策略数据库,以决定该数据流是否被命中,如果命中使用该安全策略中IPSEC安全联盟提供的安全协议进行保护.
计算机网络实验系统NetRiver2000--8210移动IP协议实验10.
1实验目的移动IP是一种在全球因特网上提供移动功能的方案.
它使移动节点在切换链路时仍然可保持现有通信,并且,移动IP提供了一种IP路由机制,可以使移动节点以一个永久的IP地址连接到任何链路上.
本实验分"角色"(即MN(移动节点)、FA(外地代理)和HA(家乡代理)的实现移动IP的三个技术:代理搜索、注册和包传送.
通过本实验,学生可以理解移动IP的工作原理,掌握移动IP的主要技术.
10.
2实验要求充分理解移动IP协议,了解它的三个"角色"的主要作用,能够实现以下功能:1)代理搜索-移动节点功能的实现2)注册-移动节点功能的实现3)注册-外地代理功能的实现4)注册-家乡代理功能的实现5)包传送-家乡代理功能的实现6)包传送-外地代理功能的实现10.
3实验内容1)实现代理搜索过程MN的主要功能根据系统提供的参数组装并发送代理请求报文,收到代理应答消息后,判断出该代理是FA还是HA;2)实现注册过程中MN的主要功能根据系统提供的参数组装并发送注册请求消息,收到注册应答消息后,根据报文的内容修改MN的路由表;3)实现注册过程中FA的主要功能计算机网络实验系统NetRiver200083(a)收到注册请求报文后,通过查找路由表将该报文重新进行组装,然后中继到HA;(b)从HA收到注册应答后,判断本次注册过程是否成功,成功则需要修改FA的路由表,最后将该应答消息中继到MN.
4)实现注册过程中HA的主要功能对于收到的注册请求报文,进行合法性检查(只需检查要注册的MN是否合法),如果合法,则修改它的绑定表,最后发送注册应答消息给FA.
5)实现包传送中HA的主要功能如果收到目的地址是MN家乡地址的数据包,查找绑定表,将该包进行IP封装,然后发送给FA;否则,查找路由表,进行正常的IP转发.
6)实现包传送中FA的主要功能如果收到目的地址是MN家乡地址的数据包,查找路由表,将该包进行解封装,然后发送给MN.
10.
4实验帮助10.
4.
1移动IP协议介绍10.
4.
1.
1协议简述越来越多的网络用户通过无线技术接入网络,它有很多优点.
然而也存在着不足之处,当用户移到一个新网络时连接就会断开.
移动IP是一种网络标准,它实现跨越不同网络的无缝漫游功能.
用户跨越不同网络边界时,使用移动IP技术可以确保如网络技术、多媒体业务和虚拟专用网络等各种应用的永不中断连接.
采用传统IP技术的主机在移动到另外一个网段或者子网地时候,由于不同的网段对应于不同的IP地址,用户不能使用原有IP地址进行通信,必须修改主机IP地址为所在子网的IP地址,而且由于各种网络设置,用户一般不能继续访问原有网络的资源,其他用户也无法通过该用户原有的IP地址访问该用户.
所谓移动IP技术,是指移动用户可在跨网络随意移动和漫游中,使用基于TCP/IP协议的网络时,不用修改计算机原来的IP地址,同时,继续享计算机网络实验系统NetRiver2000--84有原网络中一切权限.
简单地说,移动IP就是实现网络全方位的移动或者漫游.
移动IP应用于所有基于TCP/IP网络环境中,它为人们提供了无限广阔的网络漫游服务.
譬如:在用户离开北京总公司,出差到上海分公司时,只要简单的将移动终端(便携笔记本电脑、PDA等所有基于IP的设备)连接至上海分公司网络上,不需要做其他任何改动,那么用户就可以享受到跟在北京总公司里一样的所有操作.
用户依旧能使用北京总公司的相关打印机;诸如此类的种种操作,让用户感觉不到自己身在外地.
换句话说:移动IP的应用让用户的"家"网络随处可以安"家".
10.
4.
1.
2移动IP的几种报文结构1.
代理请求消息和代理应答消息1)代理请求消息代理请求消息由20字节的IP头加上8字节的路由器广播消息组成.
见下表:服务类型总长度标识标记片偏移生存时间校验和源地址=移动节点的家乡地址目的地址=255.
255.
255.
255(广播)或224.
0.
0.
2(组播)类型=10Code=0校验和保留2)代理广播消息代理广播消息由IP报头、ICMP路由器广播和移动代理广播扩展以及其他一些可选扩展组成,本实验不考虑可选扩展.
本实验中,ICMP路由器广播域中地址数为1.
计算机网络实验系统NetRiver200085服务类型总长度标识标记片偏移生存时间校验和源地址=链路上的家乡或外地代理地址目的地址=255.
255.
255.
255(广播)或224.
0.
0.
2(组播)类型=10Code=0校验和地址数地址宽度生存时间路由器地址[1]优选级[1]………类型=16长度序号注册生存时间保留转交地址2.
注册请求和注册应答消息报文格式1)注册请求消息注册请求消息由IP头、UDP头、注册请求定长部分和认证扩展组成.
01234服务类型总长度标识标记片偏移生存时间校验和源地址=移动节点的家乡地址计算机网络实验系统NetRiver2000--86目的地址=255.
255.
255.
255(广播)或224.
0.
0.
2(组播)源端口目的端口=434长度校验和类型=1ignore生存时间移动节点家乡地址家乡代理地址转发地址标识类型长度安全参数索引认证算法2)注册应答消息类型=3Code生存时间移动节点家乡地址家乡代理地址标识计算机网络实验系统NetRiver20008710.
4.
2实验拓扑本实验的所有测试例,学生代码作为MN、FA或HA这三个功能实体中的某一个"角色",系统则作为其他两个"角色".
10.
4.
3需要实现的接口函数1)移动节点发送代理请求报文函数intstud_MN_icmp_send()参数:无返回值:0:成功发送报文1:发送失败说明:本函数和下一个函数是实现代理搜索中移动节点功能的函数.
本函数作用是发送一条代理请求消息.
另外注意ignore字段应填为0.
学生组装注册请求报文,然后调用系统给出的相关函数将报文发送出去.
2)移动节点接收代理应答报文函数intstud_MN_icmp_recv(char*buffer,unsignedshortlen)参数:buffer:指向接收到的icmp报文内容的指针len:接收到的报文的长度返回值:1:外地代理2:家乡代理说明:当系统接收到代理应答报文时,调用该函数,当根据该广播消息的源地址得出是外地代理,那么函数返回值为1;否则为家乡代理,返回值为2.
在本函数中调用getHAHaddress()函数获取家乡代理的地址.
3)移动节点发送注册应答报文函数intstud_MN_send_Regi_req(char*pdata,unsignedcharlen,unsignedshortttl,unsignedintHA_addr,unsignedintFA_addr,unsignedintMN_Haddr,unsignedintiden_low,unsignedintiden_high)参数:pdata:要发送的注册请求消息所携带的数据;Len:要发送的注册请求消息所携带的数据的长度;计算机网络实验系统NetRiver2000--88ttl:生存时间;HA_addr:家乡代理地址;FA_addr:外地代理地址;MN_Haddr:移动节点家乡地址;Iden_low:标识号的低32位;Iden_high:标识号的高32位返回值:0:成功发送报文1:发送失败说明:本函数和下一函数是移动节点注册功能的实现函数.
本函数的功能是发送一条注册请求消息.
4)移动节点接收注册应答报文函数intstud_MN_recv_Regi_rep(char*pbuffer,unsignedshortlen,unsignedintif_no)参数:pbuffer:指向接收的报文内容的指针len:接收的报文的长度if_no:接收报文的接口号返回值:0:成功发送报文1:发送失败说明:系统调用该函数完成移动节点接收注册应答消息,首先根据注册消息中的CODE值判断此次注册过程是成功还是失败,如果CODE值既不为1又不为0,那么函数返回1,否则修改MN的路由表,函数返回0.
5)外地代理接收注册请求报文函数intstud_FA_recv_Regi_req(char*pbuffer,unsignedshortlen,unsignedintmask,unsignedintif_no)参数:Pbuffer:指向接收的报文内容的指针Len:接收的报文的长度Mask:MN的掩码If_no:接收报文的接口号返回值:计算机网络实验系统NetRiver2000890:成功接收报文1:接收失败说明:本函数是完成FA接收注册请求消息的函数.
当接收到报文后,FA将该报文中继到HA,即需要改变原来的IP包头的源和目的地址,调用相应的系统函数将该注册消息中继到HA,并且要记录下MN地址、掩码、接收该报文的接口号.
6)外地代理接收注册应答报文函数intstud_FA_recv_Regi_rep(char*pbuffer,unsignedshortlen)参数:Pbuffer:指向接收的报文内容的指针Len:接收的报文的长度返回值:0:成功接收报文1:接收失败说明:本函数是实现FA处理从HA接收注册应答报文的功能的函数.
当接收到报文后,首先根据报文的CODE值判断本次注册过程是成功还是失败,(如果成功则需要增加一条到MN的特定主机路由)最后调用相应的系统函数将消息中继到MN.
7)家乡代理接收注册请求报文函数intstud_HA_recv_Regi_req(char*pbuffer,unsignedshortlen,unsignedintmask)参数:Pbuffer:指向接收的报文内容的指针Len:接收的报文的长度mask:FA的掩码返回值:0:成功接收报文1:接收失败说明:本函数是HA注册功能的实现函数.
本函数的功能是从系统(FA)接收一条注册请求报文,首先判断所要注册的MN地址是不是本地地址(本地MN地址由系统函数unsignedintgetMNHaddress()提供),如果不是,则将注册应答消息中CODE值置为131,代表本次注册过程失败;反之如果是,则将CODE值置为0,代表本次注册过程成功.
最后调用int计算机网络实验系统NetRiver2000--90HA_regi_sendIpPkt(unsignedchartype,unsignedcharcode,unsignedintdestadd,unsignedintsrcadd,unsignedintMn_addr,unsignedintHa_addr)将注册应答消息发送出去.
8)家乡代理接收发往MN的报文函数intstud_packertrans_HA_recv(char*pbuffer,unsignedshortlen)参数:Pbuffer:指向接收的报文内容的指针Len:接收的报文的长度返回值:0:成功接收报文1:接收失败说明:本函数是家乡代理包传送功能的实现函数.
当接收到一个数据包后,首先查看该包的目的地址是否是MN的地址,如果是,则查找"绑定"表,将该包进行IP封装,然后发送出去;否则,查找路由表,调用系统函数HA_forward_ipv4packet(pbuffer,len)进行正常的IP转发.
9)外地代理接收发往MN的封装报文函数intstud_packertrans_FA_recv(char*pbuffer,unsignedshortlen)参数:Pbuffer:指向接收的报文内容的指针Len:接收的报文的长度返回值:0:成功接收报文1:接收失败说明:本函数是外地代理包传送功能的实现函数.
当接收到一个数据包后,首先由包头的协议号判断是否是封装包,如果是,则进行解封装,然后查找"路由"表,然后调用相应的系统函数FA_send_ipv4_toMN(char*pBuffer,intlength)发送给MN.
10.
4.
4系统提供的全局变量externstructstud_MN_route_node*g_MN_route_table;该全局变量为系统中MN路由表链表的头指针.
externstructstud_FA_route_node*g_FA_route_table;该全局变量为系统中FA路由表链表的头指针.
计算机网络实验系统NetRiver200091externstructstud_HA_route_node*g_HA_route_table;该全局变量为系统中HA路由表链表的头指针.
系统以单向链表存储MN、FA、HA的路由表,学生根据需要修改对应的表项,供客户端软件检查.
其中,stud_MN_route_node、stud_FA_route_node、stud_HA_route_node分别定义如下:typedefstructstud_MN_route_node{unsignedintdest;unsignedintmask;unsignedintnexthop;unsignedintif_no;structstud_MN_route_node*next;};typedefstructstud_FA_route_node{unsignedintdest;unsignedintmask;unsignedintnexthop;unsignedintif_no;structstud_FA_route_node*next;};typedefstructstud_HA_route_node{unsignedintdest;unsignedintmask;unsignedintnexthop;unsignedintif_no;structstud_HA_route_node*next;};两个宏定义:#defineFA1计算机网络实验系统NetRiver2000--92#defineHA210.
4.
5系统提供的接口函数1)移动节点发送代理请求消息的系统函数voidicmp_sendIpPkt(unsignedchar*pData,unsignedshortlen)参数:Pbuffer:指向要发送的报文内容的指针Len:发送的报文的长度说明:在"移动节点代理请求功能的实现"测试例中,学生完成报文的组装后调用该函数发送代理请求消息.
2)发送移动节点注册请求消息的系统函数voidMN_regi_sendIpPkt(unsignedchar*pData,unsignedshortlen)参数:Pbuffer:指向要发送的报文内容的指针Len:发送的报文的长度说明:在"移动节点注册功能的实现"测试例中,学生完成报文的组装后调用该函数发送注册请求消息.
3)发送外地代理注册请求报文的系统函数VoidFA_sendregi_req(char*pData,unsignedshortlen,unsignedintdestadd,unsignedintsrcadd)参数:pData:指向注册请求消息后面所携带的附加信息的指针(除去IP头和UDP头)Len:发送的报文的长度destadd:目的IPv4地址srcadd:源IPv4地址说明:本函数用于"外地代理注册功能的实现"测试例中.
学生将收到的注册请求报文"中继"到家乡代理时调用该函数进行处理.
4)发送外地代理注册应答报文的系统函数VoidFA_sendregi_rep(char*pData,unsignedshortlen,unsignedintdestadd,unsignedintsrcadd)参数:计算机网络实验系统NetRiver200093pData:指向注册请求消息后面所携带的附加信息的指针(除去IP头和UDP头)Len:发送的报文的长度destadd:目的IPv4地址srcadd:源IPv4地址说明:本函数用于"外地代理注册功能的实现"测试例中.
学生将收到的注册应答报文进行重新"组装",发送到移动节点时调用该函数进行处理.
5)家乡代理发送注册应答报文的函数voidHA_regi_sendIpPkt(unsignedchartype,unsignedcharcode,unsignedintdestadd,unsignedintsrcadd,unsignedintMn_addr,unsignedintHa_addr)参数:type:报文的类型,是请求消息还是应答消息code:CODE值,说明注册是成功还是失败destadd:目的IPv4地址srcadd:源IPv4地址Mn_addr:MN家乡IPv4地址Ha_addr:家乡代理IPv4地址说明:本函数用于"家乡代理注册功能的实现"测试例中.
学生将要发送的注册应答消息调用该函数进行处理.
6)家乡代理发送封装包的函数intHA_send_Encap_packet(char*pbuffer,unsignedshortlen,unsignedintdstAddr,unsignedintsrcAddr)参数:pbuffer:指向要发送的报文的内容的指针len:报文的长度dstAddr:目的IPv4地址srcAddr:源IPv4地址说明:封装之后的包调用本函数进行发送.
7)外地代理发送解封装包的函数voidFA_send_ipv4_toMN(char*pBuffer,intlength)参数:pbuffer:指向要发送的报文的内容的指针计算机网络实验系统NetRiver2000--94length:报文的长度if_no:发送报文的接口号说明:解封装之后的包调用本函数进行发送.
8)家乡代理转发报文的函数voidHA_forward_ipv4packet(char*pBuffer,intlength)参数:pbuffer:指向要发送的报文的内容的指针length:报文的长度说明:在包传送-家乡代理功能的实现测试例中,转发不是发往移动节点的数据包调用该函数.
9)家乡代理丢弃报文的函数voidHA_DiscardPkt(char*pBuffer,intlength)参数:pbuffer:指向要丢弃的报文的内容的指针length:报文的长度说明:在包传送-家乡代理功能的实现测试例中,丢弃查不到对应路由表的数据包时调用该函数.
10)外地代理丢弃报文的函数externvoidFA_DiscardPkt(char*pBuffer,intlength)参数:pbuffer:指向要丢弃的报文的内容的指针length:报文的长度说明:在包传送-外地代理功能的实现测试例中,丢弃查不到对应路由表的数据包时调用该函数.
计算机网络实验系统NetRiver20009511IPv4协议交互实验11.
1实验目的IPv4协议是互联网的核心协议,它保证了网络节点(包括网络设备和主机)在网络层能够按照标准协议互相通信.
IPv4地址唯一标识了网络节点.
在我们日常使用的计算机的主机协议栈中,IPv4协议必不可少,它能够接收网络中传送给本机的分组,同时也能根据上层协议的要求将报文封装为IPv4分组发送出去.
本实验通过设计实现主机协议栈中的IPv4协议,让学生深入了解网络层协议的基本原理,学习IPv4协议基本的分组接收和发送流程.
11.
2实验要求根据计算机网络实验系统所提供的上下文,对给出的IP报文进行字段检查,如果出错指出其出错字段或组装一个正确的IP报头.
11.
3实验内容1)实现IPv4分组的基本接收处理功能对于接收到的IPv4分组,检查目的地址是否为本地地址,并检查IPv4分组头部中其它字段的合法性.
在选项中选择对应的项.
2)实现IPv4分组的封装发送根据题干中给出的上下文环境,封装IPv4分组,使用系统提供的发送IP报文界面将分组发送出去.
11.
4实验帮助在使用系统提供的发送IP报文界面(图9.
1发送IP报文界面)时,校验和字段的初始值为零.
如要计算正确的校验和则需使用ValidChecksum选项(图中用红色椭圆标注).
在打开该选项后,系统会自动计算IP头部的校验和(即时反应IP头部各个字段值的变化).
如需观察当前填充值下IP头部对应的十六进制和字符串表示,可点击Decode按钮,结果显示在图中蓝色方框标示的区域中.
计算机网络实验系统NetRiver2000--96图9.
1发送IP报文界面当在检查IP报文时,需通过使用ValidChecksum选项观察校验和显示是否发生变化.
如发生变化则说明该IP报文的校验和有错误.
校验和的原始值可在蓝色框中的十六进制显示中的相应字段找到.
计算机网络实验系统NetRiver20009712RIP协议交互实验12.
1实验目的通过简单实现路由协议RIP,深入理解计算机网络中的核心技术——路由技术,并了解计算机网络的路由转发原理.
12.
2实验要求充分理解RIP协议,根据RIP协议的流程设计RIP协议的报文处理和超时处理函数.
能够实现如下功能:1)RIP报文有效性检查2)处理Request报文3)处理Response报文4)路由表项超时删除5)路由表项定时发送12.
3实验内容1)对客户端接收到的RIP报文进行有效性检查对客户端接收到的RIP协议报文进行合法性检查,如果出错,指出错误原因;2)处理Request报文正确解析并处理RIP协议的Request报文,并能够根据报文的内容以及本地路由表组成相应的Response报文,回复给Request报文的发送者,并实现水平分割;3)处理Response报文正确解析并处理RIP协议的Response报文,并根据报文中携带的路由信息更新本地路由表;4)路由表项超时删除处理来自系统的路由表项超时消息,并能够删除指定的路由;5)路由表项定时发送实现定时对本地的路由进行广播的功能,并实现水平分割.
计算机网络实验系统NetRiver2000--9812.
4实验帮助12.
4.
1RIP协议介绍12.
4.
1.
1协议简述RIP协议采用的是距离-向量路由算法,该算法早在Internet的前身ARPANET网络中就已经被广泛采用.
在70年代中期,Xerox公司根据它们对互联网的研究成果提出了一套被称为XNS(XeroxNetworkSystem)的网络协议软件.
这套协议软件包含了XNSRIP协议,该协议就是现在所使用的RIP协议的最早原型.
80年代加州大学伯克利分校在开发Unix系统的同时,在routed程序中设计实现了RIP协议软件.
routed程序被绑定在BSDUnix系统中一起推出,被广泛的应用于早期网络中的机器之间交换路由信息.
尽管RIP/routed没有非常突出的优点,但是由于Unix操作系统的普及,RIP/routed也逐渐被推广出来,为许多人所接受,成为了中小型网络中最基本的路由协议/程序.
RIP协议的RFC文本在1988年6月被正式推出,它综合了实际应用中许多实现版本的特点,同时为版本的兼容互通性提供了可靠的依据.
由于RIPv1中存在着一些缺陷,再加上网络技术的发展,有必要对RIP版本进行相应的改进.
1994年11月,RFC1723对RIPv1的报文结构进行了扩展,增加一些新的网络功能.
1998年11月,RIPv2的标准RFC文本被正式提出,它在协议报文的路由表项中增加了子网掩码信息,同时增加了安全认证、不同路由协议交互等功能.
随着OSPF、IS-IS等域内路由协议的出现,许多人认为RIP协议软件已经过时.
尽管RIP在协议性能和网络适应能力上远远落后于后来提出的路由协议,但是RIP仍然具有自身的特点.
首先,在小型的网络环境中,从使用的网络带宽以及协议配置和管理复杂程度上看,RIP的运行开销很小;其次,与其他路由协议相比,RIP使用简单的距离-向量算法,实现更容易;最后,由于历史的原因,RIP的应用范围非常广,在未来的几年中仍然会使用在各种网络环境中.
因此,在路由器的设计中,RIP协议是不可缺少的路由协议之一,RIP协议的实现效率高低对路由器系统的路由性能起着重要的作用.
计算机网络实验系统NetRiver20009912.
4.
1.
2RIPv2协议的报文结构图10.
1RIPv2的报文结构RIPv2的报文结构如图10.
1所示.
每个报文都包括一个报文命令字段、一个报文版本字段、一个路由域字段、一个地址类字段、一个路由标记字段以及一些路由信息项(一个RIP报文中最多允许25个路由信息项),其中每个字段后括号中的数字表示该字段所占的字节数.
RIP报文的最大长度为4+20*25=504字节,加上UDP报头的8字节,一共是512字节.
如果路由表的路由表项数目大于25时,那么就需要多个RIP报文来完成路由信息的传播过程.
下面对报文字段进行逐一介绍:命令字段:表示RIP报文的类型,目前RIP只支持两种报文类型,分别是请求报文(request1)和响应(response2)报文.
版本字段:表示RIP报文的版本信息,RIPv2报文中此字段为2.
路由域字段:是一个选路守护程序的标识符,它指出了这个数据报的所有者.
在一个Unix实现中,它可以是选路守护程序的进程号.
该域允许管理者在单个路由器上运行多个RIP实例,每个实例在一个选路域内运行.
地址类字段:表示路由信息所属的地址族,目前RIP中规定此字段必须为2,表示使用IP地址族.
IP地址字段:表示路由信息对应的目的地IP地址,可以是网络地址、计算机网络实验系统NetRiver2000--100子网地址以及主机地址.
子网掩码字段:应用于IP地址产生非主机部分地址,为0时表示不包括子网掩码部分,使得RIP能够适应更多的环境.
下一站IP地址字段:下一驿站,可以对使用多路由协议的网络环境下的路由进行优化.
度量值字段:表示从本路由器到达目的地的距离,目前RIP将路由路径上经过的路由器数作为距离度量值.
一般来说,RIP发送的请求报文和响应报文都符合图7.
1的报文结构格式,但是当需要发送请求对方路由器全部路由表信息的请求报文时,RIP使用另一种报文结构,此报文结构中路由信息项的地址族标识符字段为0,目的地址字段为0,距离度量字段为16.
12.
4.
1.
3RIP协议的基本特点协议规定,RIP协议使用UDP的520端口进行路由信息的交互,交互的RIP信息报文主要是两种类型:请求(request)报文和响应(response)报文.
请求报文用来向相邻运行RIP的路由器请求路由信息,响应报文用来发送本地路由器的路由信息.
RIP协议使用距离-向量路由算法,因此发送的路由信息可以用序偶来表示,在实际报文中,vector用路由的目的地址address表示,而distance用该路由的距离度量值metric表示,metric值规定为从本机到达目的网络路径上经过的路由器数目,metric的有效值为1到16,其中16表示网络不可到达,可见RIP协议运行的网络规模是有限的.
当系统启动时,RIP协议处理模块在所有RIP配置运行的接口处发出request报文,然后RIP协议就进入了循环等待状态,等待外部RIP协议报文(包括请求报文和响应报文)的到来;而接收到request报文的路由器则应当发出包含它们路由表信息的response报文.
当发出请求的路由器接收到一个response报文后,它会逐一处理收到的路由表项内容.
如果报文中的表项为新的路由表项,那么就会向路由表加入该表项.
如果该报文表项已经在路由表中存在,那么首先判断这个收到的路由更新信息是哪个路由器发送过来的.
如果就是这个表项的源路由器(即当初发送相应路由信息从而导致这个路由表项的路由器),则无论该现有表项的距离度量值(metric)如何,都需要更新该表项;如果不是,那么只有当更新表项的metric值小于路由表中相应表项metric值时才需要替代原来的表计算机网络实验系统NetRiver2000101项.
此外,为了保证路由的有效性,RIP协议规定:每隔30秒,重新广播一次路由信息;若连续三次没有收到RIP广播的路由信息,则相应的路由信息失效.
12.
4.
1.
4水平分割水平分割是一种避免路由环的出现和加快路由汇聚的技术.
由于路由器可能收到它自己发送的路由信息,而这种信息是无用的,水平分割技术不反向通告任何从终端收到的路由更新信息,而只通告那些不会由于计数到无穷而清除的路由.
12.
4.
2实验拓扑客户端软件模拟一个网络中的路由器,在其中2个接口运行RIP协议,接口编号为1和2,每个接口均与其他路由器连接,通过RIP协议交互路由信息.
12.
4.
3实验界面界面上最多会有4个标签页:点击"Rip报文展示"标签可以查看接收到的RIP报文;点击"路由表"标签可以查看/编辑本地路由表;点击"发送RIP(接口1)"标签可以封装RIP报文并从接口1发送;点击"发送RIP(接口2)"标签可以封装RIP报文并从接口2发送.
其具体界面如下所示:计算机网络实验系统NetRiver2000--102图10.
2Rip报文展示图10.
3路由表如果想删除一条路由信息,可以在表格中选中该条路由,然后点击删除按钮,即可删除该条路由;如果想添加一条路由信息,可以先点击添加按钮,然后在表格下面的信息编辑区域填入相关的路有信息;如果想修改一条路由信息,可以先在表格中选中该条路由,然后在信息编辑区域编辑相关的信息.
可以使用发送RIP(接口1)/发送RIP(接口2)封装相应的RIP报文,并将其以相应的接口发送出去.
如图10.
4和图10.
5所示:计算机网络实验系统NetRiver2000103图10.
4发送RIP(接口1)图10.
5发送RIP(接口2)计算机网络实验系统NetRiver2000--10413IPv6协议交互实验13.
1实验目的现有的互联网是在IPv4协议的基础上运行.
IPv6是下一版本的互联网协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,地址空间的不足必将影响互联网的进一步发展.
为了扩大地址空间,拟通过IPv6重新定义地址空间.
IPv4采用32位地址长度,只有大约43亿个地址,估计在2005~2010年间将被分配完毕,而IPv6采用128位地址长度,几乎可以不受限制地提供地址.
本实验通过设计实现主机协议栈中的IPv6协议,让学生深入了解网络层协议的基本原理,学习IPv6协议基本的分组接收和发送流程.
13.
2实验要求根据计算机网络实验系统所提供的上下文,对给出的IPv6报文进行字段检查,如果出错指出其出错字段或组装一个正确的IPv6报头.
13.
3实验内容1)实现IPv4v6分组的基本接收处理功能对于接收到的IPv6分组,检查目的地址是否为本地地址,并检查IPv6分组头部中其它字段的合法性.
在选项中选择对应的项.
2)实现IPv6分组的封装发送根据题干中给出的上下文环境,封装IPv6分组,使用系统提供的发送IPv6报文界面将分组发送出去.
13.
4实验帮助界面上会显示接收到的IPv6报头(接收部分)或要填充的IPv6报头(发送部分),其内容展示分为字段意义显示和16进制显示,在字段意义显示部分可以看到接收到IPv6报头或要发送IPv6报头各个字段的数据值,在16进制显示部分会展示相应的IPv6报头的16进制显示.
计算机网络实验系统NetRiver2000105图11.
1IPv6报文发送界面图11.
2IPv6报文接收界面计算机网络实验系统NetRiver2000--10614TCP协议交互实验14.
1实验目的传输层是互联网协议栈的核心层次之一,它的任务是在源节点和目的节点间提供端到端的、高效的数据传输功能.
TCP协议是主要的传输层协议,它为两个任意处理速率的、使用不可靠IP连接的节点之间,提供了可靠的、具有流量控制和拥塞控制的、端到端的数据传输服务.
TCP协议不同于IP协议,它是有状态的,这也使其成为互联网协议栈中最复杂的协议之一.
网络上多数的应用程序都是基于TCP协议的,如HTTP、FTP等.
本实验的主要目的是学习和了解TCP协议的原理和设计实现的机制.
TCP协议中的状态控制机制和拥塞控制算法是协议的核心部分.
TCP协议的复杂性主要源于它是一个有状态的协议,需要进行状态的维护和变迁.
有限状态机可以很好的从逻辑上表示TCP协议的处理过程,理解和实现TCP协议状态机是本实验的重点内容.
另外,由于在网络层不能保证分组顺序到达,因而在传输层要处理分组的乱序问题.
只有在某个序号之前的所有分组都收到了,才能够将它们一起提交给应用层协议做进一步的处理.
2021年各大云服务商竞争尤为激烈,因为云服务商家的竞争我们可以选择更加便宜的VPS或云服务器,这样成本更低,选择空间更大。但是,如果我们是建站用途或者是稳定项目的,不要太过于追求便宜VPS或便宜云服务器,更需要追求稳定和服务。不同的商家有不同的特点,而且任何商家和线路不可能一直稳定,我们需要做的就是定期观察和数据定期备份。下面,请跟云服务器网(yuntue.com)小编来看一下2021年国内/国...
港云网络官方网站商家简介港云网络成立于2016年,拥有IDC/ISP/云计算资质,是正规的IDC公司,我们采用优质硬件和网络,为客户提供高速、稳定的云计算服务。公司拥有一流的技术团队,提供7*24小时1对1售后服务,让您无后顾之忧。我们目前提供高防空间、云服务器、物理服务器,高防IP等众多产品,为您提供轻松上云、安全防护。点击进入港云网络官方网站港云网络中秋福利1元领【每人限量1台】,售完下架,活...
妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...