网络考试Word格式.docx
《网络考试Word格式.docx》由会员分享,可在线阅读,更多相关《网络考试Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
网络接口层对应OSI模型中的物理层和数据链路层,只要底层网络技术和标准支持数据帧的发送和接收,就可以作为TCP/IP的网络接口,包括前面提到的各种局域网、城域网、广域网技术,如以太网、电话拨号、3G网络等。
第二章1、简述HDLC是什么?
有什么应用?
高级数据链路控制(High-LevelDataLinkControl,HDLC)协议是由ISO标准化组织制定的一个面向比特的同步数据链路层协议。
它是由IBM的同步链路控制(SynchronousDataLinkControl,SDLC)协议发展而来的。
HDLC协议提供了面向连接和无连接两种服务;
它既可以工作在点到点线路方式,也可以工作在点到多点线路方式。
HDLC协议不依赖于任何一种字符编码集;
数据报文可透明传输;
既支持半双工,也支持全双工通信,有较高的数据链路传输效率;
所有帧采用了流量控制和差错控制,传输可靠性高;
传输控制与处理分离,具有较大的灵活性。
广泛应用于数据通信领域、X.25网络、帧中继网络以及作为数据链路层协议连接服务器到广域网中。
2、PPP协议在SLIP基础上做了哪些改进?
查找资料,说明PPPoE协议和PPP协议的关系,PPPoE的工作流程、帧结构及其应用?
1)改进:
SLIP(串行线路因特网协议)协议是一种简单的帧封装方法,有许多缺陷,比如SLIP不支持IP地址分配;
SLIP帧中无类型字段,无法同时传输多个上层协议;
SLIP中没有校验字段,链路层上无法检测出由于线路噪声导致的差错。
PPP协议克服了SLIP协议中的所有缺陷,它支持多种网络协议、多种数据压缩方法、多种身份认证方式、动态地址分配、差错控制和数据加密等。
2)PPPoE全称为PointtoPointProtocoloverEthernet(以太网上的点对点协议),简单地说,就是以太网和PPP结合后的协议,目前广泛应用在ADSL接入方式中,用于宽带拨号上网,使连接在以太网上的许多主机共享一条物理线路接入到因特网。
4:
阅读ether\lance目录下ethdemux函数代码,说明处理流程
XINU操作系统源代码ether\lance目录下存放的是AMD7990Lance以太网控制器驱动实现程序源代码,其中ethdemux函数实现了该控制器接收到以太帧后所要进行的多路分解操作。
该函数首先进行一些检查,然后进行数据帧的复制,并最终转入ni_in()函数,进行网络接口层的多路分解。
第三章1、试描述ARP协议软件架构,说明函数间的调用关系。
ARP软件初始化是伴随着系统网络模块初始化进行的,网络初始化函数netstart()会调用arpinit()函数初始化ARP软件,同时会创建slowtimer(网络计时器)进程,该进程用于维护ARP缓存、IP分片队列和IP路由表信息。
ARP软件中用于维护ARP缓存信息的函数为arptimer(),该函数通过定期遍历ARP缓存记录的状态释放超时的ARP缓存(通过arpdq()函数),或者重新发送ARP请求数据包(通过arpsend()函数)。
当IP模块需要调用netwrite()函数通过网络接口发送或转发IP数据包时,需要调用arpfind()函数查询当前ARP缓存中是否存在对应数据包下一跳协议地址的物理地址,若查询失败,应该调用arpalloc()函数创建一个空的ARP缓存记录并通过arpsend()函数发送一个ARP请求报文。
当网络接口收到一个ARP数据包时,网卡驱动会调用数据包复用函数ni_in(),该函数会调用ARP输入处理函数arp_in(),arp_in()函数会查询相关的ARP缓存记录(arpfind()函数),根据收到的ARP报文添加ARP缓存记录(arpadd()函数)或者发送获得解析地址的IP数据包(arpqsend()函数)。
2、理解ARP报文处理算法,分析其利弊。
ARP是一个网络层协议,功能是将网络协议地址转换为物理地址。
不妨设为IP转换为MAC地址。
即ARP算法的前提是知道目标IP地址。
ARP报文处理算法分为以下几个部分:
A要发送数据报文时,会先在arp缓存中找。
若存在对应项,直接提取即可。
若arp缓存中没有该IP对应项,则将一个针对特定IP地址的ARP请求通过广播发送到本地网络。
本地网络的主机会接收到arp请求报文,会对IP地址进行匹配,若是自己的则把自己的mac作为数据发送arp回应报文给A。
并在arp缓存中添加(更新)A的Ip的相关项,且在这个过程中若arp缓存中存在A相关的项,收到该请求报文的主机在简单的判断该报文的协议,地址类型,接口层定义等信息之后都会更新自己的arp缓存,更新跟A的IP相关的选项。
即无论arp报文是不是发送给自己的,都更新相关项。
这样可以防止突然的硬件地址的改变并节约时间。
另外若是不在本网,则路由器相关接口会相应。
3)ARP缓存表采用了老化机制(即设置了生存时间TTL),在一段时间内(一般15到20分钟)如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
利:
在网络环境安全的情况下,是一种效率很高的处理方法。
弊:
ARP报文处理算法无条件的将一个看似合法的记录加入到缓冲区中,这种做法是十分危险的,网络攻击者可以构造看似合法的ARP请求报文,进行ARP欺骗攻击。
3、简述主机发送IP数据包的过程。
数据封装成IP数据包,IP数据包在底层没法发送。
应该是先运行arp协议得到硬件地址,然后发送到对应的硬件地址的主机。
(这一段很重要哦)。
可以分析下:
即便是网络之间的传输也是要通过一次又一次点对点的发送,最终到达目的地。
4)阅读arpalloc.c文件,理解ARP缓存的分配算法
在ARP缓冲区表中分配一个表项,缓冲区表中所指的当前表项,这里采用的是循环队列的数据结构,故需要记录当前表项所处的位置,循环遍历ARP缓冲区表,若找到未使用表项,则直接跳出使用这个表项,否则,继续遍历,若寻找到了未使用的表项,则使用该表项,否则使用第一个表项,若该表项尚未收到ARP应答报文且队列中尚存等待发送的报文,则销毁队列,然后返回新分配的表项,并设置状态为尚未收到ARP应答报文。
第四章1)试描述IP软件结构,说明函数之间的调用关系。
如图所示整个IP软件以IP进程ipproc为中心,ipproc由网络初始化函数netstart()创建。
当一个IP数据包到达网络接口后,网络接口驱动会通过网络数据包解复用函数ni_in()调用IP数据包入口函数ip_in()。
ip_in()函数会将传入的数据包放在系统内部的一个IP输入队列中。
这个输入队列不仅仅存放从网络中传入的数据包,同时它还存放上层协议希望通过ipsend()函数发送的IP数据包。
IP进程会周期性的调用ipgetp()函数从队列中获取待处理的数据包。
获取到数据包以后,它会分别调用ipnet2h()和cksum()函数转换首部字节序以及计算检验和。
此外,它还会通过ipdbc()函数和ipredirect()函数处理定向广播报文以及发送ICMP重定向报文。
如果处理的IP数据包需要被发送或者转发,ipproc可能会调用iph2net()函数将数据包首部字节序转换为网络序。
最后进程会调用ipputp()函数将数据包交付网络接口模块
当IP进程将数据包交给ipputp()函数处理后,如图4-3,ipputp()函数根据数据包的去向将其交给物理网络接口发送,或者通过环回接口将数据包交付上层协议。
在发送/转发过程中,数据包可能会被分片。
此时,ipputp()函数会调用ipfsend()函数进行相关的分片处理,期间它们可能会调用ipfhcopy()将原来的数据包首部拷贝到分片数据包上。
随后,IP软件会调用netwrite()函数将数据包交付网络接口发送。
如果当前数据包需要从物理网络接口发送,netwrite()函数会调用相应的网络接口驱动发送数据包;
若数据包需要交付上层协议,netwrite()函数会调用local_out()函数将数据包通过环回接口交付。
由于此时需要将数据包交付更高层协议,因而IP软件需要对到达的分片数据包进行重组。
在IP软件中,local_out()函数会调用ipress()函数处理收到的分片数据包。
ipress()函数会通过ipfadd()函数将分片信息放入分片队列中,并调用ipfjoin()函数查看是否所有的分片都已经到达。
若分片到齐,ipfjoin()函数会调用ipfcons()函数重组分片。
最后,local_out()函数会将完整的IP数据包交付上层协议软件。
3、简述IP分片重组算法。
在数据报长度超过传输网络的限制时,若允许分片,对数据报进行分片。
同一个数据包的所有分片使用同一个标识。
所有分片标识为分片。
计算本数据包中的数据与起始端的偏移并存储。
然后按照正常的数据发送方式发送这些包。
接收时,需等到一个数据报的所有分片到齐,当内存足够时,一次性交给内存进行重组。
并提交给相关应用。
5、设计字节序转换函数
由于网络字节序采用的就是大端字节序,所以都统一到大端字节序。
其中不同位数的转换不同。
16位转换宏如下:
#ifBYTE_ORDER==LITTLE_ENDIAN
#definehs2net(x)(unsigned)((((x)>
>
8)&
0xff)|(((x)&
0xff)<
<
8))
#definenet2hs(x)hs2net(x)
#endif
#ifBYTE_ORDER==BIG_ENDIAN
#definehs2net(x)(x)
#definenet2hs(x)(x)
6、XINU操作系统中环回接口的实现方案如下:
我们从IP数据的流向图理解环回接口的实现,IP输入队列中的数据来源有两种:
一种是网络中输入的报文,一种是上层协议希望通过ipsend()函数发送的报文。
这两种报文经过ipproc()函数处理后调用ipputp()函数发送,报文有两个去向:
一个是交付物理网络接口发送,一个是通过环回接口交付上层协议。
所以在IP层数据的流向有4种:
第一种是1→3,内部数据发送给内部数据;
第二种是2→3,将外部接收到的数据向上层协议发送;
第三种是1→4,将来自上层协议的数据向外发送;
第四种是2→4,只是将收到的数据转发出去。
当ipputp()函数调用netwrite()函数发送一个报文时,若路由中提供的报文出接口为本地环回接口,则netwrite()函数会调用local_out()函数将IP数据报交付上层协议,即6图示中的3。
local_out()函数先是将IP数据报的字节序转换为主机字节序,然后将收到的数据帧重组,再处理IP数据报的选项部分,最后根据协议字段将数据发送给UDP、ICMP、TCP等上层协议。
如果协议字段有错误,就发送ICMP不可达报文。
因此,local_out()函数处理的是本机接收的数据,这个数据有可能是自己产生的,也可能是网络中收到的数据。
8、设计IP检验和计算函数
原理:
1、
(1)把IP数据包的校验和字段置为0;
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
(3)把得到的结果存入校验和字段中。
在这里仅给出计算过程。
第五章
图5-2描绘了ICMP软件中各个函数之间的调用关系。
从图中我们可以看到,整个ICMP软件大概可以分为输入和输出两个部分。
软件输出部分以icmp()函数为中心。
当数据包在网络层、传输层甚至ICMP输入处理中发现出错时都会调用这个函数发送一个ICMP差错报告。
icmp()函数通过icerrok()函数判断发送差错报告的条件是否满足,通过icsetbuf()为报文申请一个缓冲区,通过icsersrc()函数设定报文的源地址信息,并通过icsetdata()函数填写报文数据部分。
最后它将报文通过IP模块发送出去。
当网络层收到一个发给自己的ICMP报文时,它会通过local_out()函数将报文通过环回接口交付给ICMP协议软件中的icmp_in()函数进行处理,该函数会调用icredirect()函数处理重定向报文。
如果传入的ICMP报文有错,输入函数也会调用icmp()函数发送一个差错报告的。
3、简述PING程序的实现方式。
大多数内核ICMP软件都支持对ECHO请求的应答,所以只需实现客户端功能即可。
程序客户端的工作流程非常简单:
程序首先构造一个ICMPEcho请求报文,填写基本首部,并将报文中的标识符字段设置为发送进程的进程号(这样可以在同一台主机上运行多个Ping程序),同时将序号字段初始化为0,随后还要在数据部分加上时间戳。
然后调用原始套接字接口发送请求报文。
发送结束后程序会等待并试图接收来自远端主机的Echo回答报文,网络传输出现异常,中间路由器(或目的路由器)会向源端回复ICMP差错报告,程序会根据差错报告打印出错信息,否则程序将打印报文信息并估算往返时间。
4:
icsetbuf.c文件的源代码如下。
icsetbuf()函数为ICMP报文分配缓冲区,设置了两个变量,其中一个变量指出该报文是否是一个差错报告报文(或是一个信息请求);
而另一个指出这个报文的类型是否是对上一个请求做出的应答。
该函数很直观,具体分四种情况:
对绝大多数的应答,icsetbuf()函数重新利用抵达的请求报文占用的缓冲区(即返回由入口参数pa1提供的地址);
对于没有具体实现的报文类型,icsetbuf()函数释放引起差错的报文,返回SYSERR;
对含有大量数据的ICMP报文,icsetbuf()函数为其分配一个大缓冲区;
对其他不能利用原缓冲区的报文,icsetbuf()函数为它们分配一个标准缓冲区。
icsetdata.c文件的源代码如下。
第六章
图6-2描绘了IGMP软件中各个函数之间的调用关系。
从图中我们可以看到,IGMP软件大致分成三个部分:
一组负责处理或发送IGMP报文的函数,一组用于维护主机群表的函数和一套通过TCP定时器完成定时发送的机制。
主机端IGMP的输入处理和输出处理非常简单:
应用进程会调用igmp()函数发送一个IGMP成员关系报告,该函数直接通过IP模块将数据包发送出去。
若IP层收到一个IGMP报文则会将其上送给协议软件的igmp_in()函数,igmp_in()函数会根据IGMP报文类型选择合适操作。
若主机需要回复一个IGMP成员关系报告时igmp_in()函数会调用igmp_settimers()函数启动一个定时事件。
软件中用于维护定时事件的是igmp_update进程,这个进程在网络初始化函数netstart()初始化主机群表时(hginit()函数)被创建。
当IGMP软件需要启动定时事件时,他会调用TCP的定时器接口tmset()函数启动一个定时器。
当定时器到期后,TCP定时器进程tcptimer会通过消息通道发送一个定时消息,igmp_update进程会监听、获取并处理该消息(处理消息的方式即发送等待发送的成员关系报告)。
IGMP软件中还需要提供一套用于维护主机群表项的接口,其中主要包括hglookup()函数、hgjoin()函数和hgleave()函数。
他们分别用于在主机群表中查找特定的表项以及处理应用进程加入/离开某个主机群的请求。
hgjoin()函数需要调用hgadd()函数在主机群表中加入一条记录。
此外,在添加/删除主机群表项时需要通过hgarpadd()和hgarpdel()函数在ARP缓存中添加/删除特定组地址的ARP映射。
从图中我们可以看到,无论是加入还是删除一条表项都需要通过hglookup()函数遍历主机群表。
此外,当igmp_in()函数处理收到的IGMP报文时也可能会查询相关的主机群表。
4、比较主机端的IGMP和路由器端的IGMP管理组成员的异同点。
最主要的差别:
主机端负责通知本地子网中的路由器其加入某个多播组或离开某个多播组;
路由器负责维护多播组中的成员列表。
所以在存储的信息(群组信息和组成员信息),定时器(看是否需要应答,看是否有人应答)等问题上存在差异。
且路由器要比主机端多出一些功能。
路由器端要实现以下功能:
查询器的选择、维护各个接口下的主机群表项、与组播路由选择协议交互等;
状态机的状态和影响状态转移的主要事件不同。
但是相同的是都使用状态机机制来实现对组成员的管理。
7、主机群表的遍历算法怎么实现的,能进一步实现改进和优化吗?
XINU:
操作系统中主机群表相关操作的代码是igmp目录下以hg开头的一些文件。
其中hglookup.c是用来查询遍历的,它利用数组来实现,可以通过使用其他的数据结构,如有序表、散列表等提高查找速度。
第七章
简述RIP软件的基本架构,以及其函数之间的相互调用关系。
图7-2描绘了RIP软件中各个函数之间的调用关系。
从图中我们可以看到,RIP软件大体分成两个部分:
输入处理和输出处理。
软件的输入部分以rip进程为中心,rip进程由网络初始化函数netstart()创建。
它从创建一个UDP套接字并从中获取RIP报文,随后rip进程会调用ripcheck()函数检查报文首部的有效性。
最后,它会根据传入数据包的类型调用合适的处理函数。
riprepl()函数用于处理传入的RIP请求数据包。
此时该函数可能会通过ripsend()函数发送一个带有完整路由表信息的RIP通告报文或者通过UDP模块发送一个针对特定目的网络的RIP通告报文。
riprecv()函数用于处理传入的RIP通告报文,在处理报文中各个路由通告时它会调用ropok()函数检查路由信息结构的有效性。
软件的输出部分以输出进程ripout为中心,ripout进程由rip进程在必要时创建(这取决于是否需要当前路由器发送定时通告)。
ripout函数会通过ripsend()函数发送通告报文,在发送通告报文期间ripsend()函数首先会调用ripifset()函数为每个接口创建一个接口输出控制结构,随后它会调用ripadd()函数将路由信息添加到RIP通告报文中。
此时,ripadd()函数还要根据实际情况通过ripstart()函数创建一个空的RIP通告报文。
同时,它还需要利用ripmetric()函数为各个路由信息计算相关的度量值。
最后ripsend()函数会通过UDP模块发送构建好的RIP通告报文。
3、阅读代码回代RIP中存在的定时器种类以及它们的作用。
4个定时器:
更新定时器、无效定时器、保持定时器、刷新定时器
更新定时器用于每30秒发送路由更新报文。
无效定时器用于路由信息失效前的180秒的计时,每次收到路由信息的更新信息就将该计数器复位。
刷新定时器和保持定时器同时用于将失效的路由信息删除前的计时:
在保持定时器的时间内,失效的路由信息不能被接收到的新信息所更新;
在刷新定时器计时器超时后,失效的路由信息被删除。
第八章
4、简述Traceroute程序的实现方式。
Traceroute是UDP及ICMP应用的一个典型例子,用来跟踪IP数据包从一台主机到另一台主机所经过的路由。
程序首先发送一个UDP报文到目的主机,这个报文中的IP首部TTL字段为1,而UDP首部的目的端口号为一个不可能用到的值(一般大于30000)。
此时程序会等待目的主机或中间路由器的回复,数据包经过第一跳之后到达一个路由器,由于TTL值的限制,此时路由器将发回一个ICMP错误消息,以说明这个数据包不能继续向前传送。
然后traceroute程序又发出一个TTL为2的数据包,这个数据包经过两次跳跃后其TTL过期。
这个过程不断重复,直到数据包到达目的主机。
此过程的目的就是要记录下所有发出ICMP超时消息的消息源,据此就可以确定出数据包到达目的主机的路径了。
当报文到达目的主机时,由于目的主机没有应用程序使用报文中的端口号,主机会向源端回复一个ICMP端口不可达报文,而此时程序可通过收到的端口不可达报文确定之前的数据包已经到达目的主机,即路由跟踪完成。
5、简述主机端的路由端IGMP输入处理的状态,及影响状态转移的主要事件(参考教材9.8.1节和9.8.2节。
)