转发的原理:交换机接收到源主机发送的数据帧后,在MAC地址表中查找数据帧中的目的MAC地址。如果找到,就将该数据帧发送到相应的端口;如果找不到,就向所有的端口发送。同时利用接收数据帧中的源MAC地址来建立MAC地址表。
选路和转发的区别主要是,选路在IP层,根据目的IP地址找到出接口;转发在数据链路层,根据MAC地址对数据进行转发。另外,转发表和路由表不同,转发表中的一行包括从网络号到发出接口的映射和一些MAC信息,而路由表是由路由选择算法建立的一个表,它通常包含从网络号到下一跳IP地址的映射,转发表可以由特殊的硬件来实现,而路由表很少这样。
为了实现三层交换技术,交换机将维护一张至少包括“目的IP地址,下一跳MAC地址”在内的硬件转发表。当交换机接收到数据时,根据报文中的“目的IP地址”查询硬件转发表,根据匹配结果进行相应的数据转发,并且采用硬件芯片或高速缓冲区支持,可以达到线速。
在交换机刚启动完毕时,交换机就把设备的软件路由表下载到ASIC芯片上。在需要进行三层交换的报文到达交换机后,交换机首先会查询最长匹配硬件转发表,但由于MAC地址是未知的,无法同时下载,此时的硬件转发表是无效的,所以无法进行硬件数据转发。因此,交换机将利用CPU对数据进行软件路由转发,交换机在数据转发过程中获取下一跳IP地址和数据转发出口的MAC地址,然后会被自动下载到三层硬件转发表,此时包含了下一跳IP地址和数据转发出口MAC地址的硬件转发表项才真正生效。在这之后,发往相同目的IP网段的报文到达交换机都可以直接通过最长匹配硬件转发表进行硬件转发,而其他网段的数据转发则需要重复上述过程。
8、设计IP检验和计算函数
原理:1、(1)把IP数据包的校验和字段置为0; (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和; (3)把得到的结果存入校验和字段中。 在这里仅给出计算过程。
9、略
10、可以考虑以IP地址为标准,构造平衡树。 优点:查询速度可以增快。
缺点:占用存储,且建立和调整树都是需要时间的。不能随机访问。
第五章
1、软件结构
图5-2描绘了ICMP软件中各个函数之间的调用关系。从图中我们可以看到,整个ICMP软件大概可以分为输入和输出两个部分。
udp_inicredirecticsetsrcicsetbuficmp_inicmpicerroklocal_outIP模块icsetdata
图5-2 ICMP软件结构
软件输出部分以icmp()函数为中心。当数据包在网络层、传输层甚至ICMP输入处理中发现出错时都会调用这个函数发送一个ICMP差错报告。icmp()函数通过icerrok()函数判断发送差错报告的条件是否满足,通过icsetbuf()为报文申请一个缓冲区,通过icsersrc()函数设定报文的源地址信息,并通过icsetdata()函数填写报文数据部分。
最后它将报文通过IP模块发送出去。
当网络层收到一个发给自己的ICMP报文时,它会通过local_out()函数将报文通过环回接口交付给ICMP协议软件中的icmp_in()函数进行处理,该函数会调用
icredirect()函数处理重定向报文。如果传入的ICMP报文有错,输入函数也会调用icmp()函数发送一个差错报告的。
2、说明ICMP五种差错报告报文分别在哪些情况下使用。
(1)终点不可达报文:当路由器不能为报文找到路由或者主机不能交付报文时,丢弃该报文并发送该类型报文给源主机;
(2)源点抑制报文:当路由器或主机因拥塞而丢弃报文时,向源主机发送该类型报文; (3)超时报文:当路由器收到TTL为零的报文或目的主机在规定的时间内没有收到所有的分片报文时,向源主机发送该类型报文;
(4)参数错误报文:当路由器或主机收到存在二义性或字段缺失的报文时,丢弃该报文并发送该类型报文;
(5)改变路由报文:当路由器收到本应发往其他路由器的报文时,把该报文发送给正确的路由器,并发送该类型报文通知源主机更正路由,以帮助更新路由。
3、简述PING程序的实现方式。
大多数内核ICMP软件都支持对ECHO请求的应答,所以只需实现客户端功能即可。 程序客户端的工作流程非常简单:程序首先构造一个ICMP Echo请求报文,填写基本首部,并将报文中的标识符字段设置为发送进程的进程号(这样可以在同一台主机上运行多个Ping程序),同时将序号字段初始化为0,随后还要在数据部分加上时间戳(另一种方法可以尝试使用IP的时间戳选项)。然后调用原始套接字接口发送请求报文。发送结束后程序会等待并试图接收来自远端主机的Echo回答报文,网络传输出现异常,中间路由器(或目的路由器)会向源端回复ICMP差错报告,程序会根据差错报告打印出错信息,否则程序将打印报文信息并估算往返时间。 4、略
5、当收到的报文时不可达报文时,设计报文处理流程及实现函数。
本题主要考查对ICMP报文处理流程的掌握程度。该情况报文处理流程可概括为:当函数接收到终点不可达报文时,首先累计不可达报文统计变量(SNMP使用该MIB变量进行网络管理工作),然后从该报文中提取出相关信息(报文类型、引起差错的原因等),通过消息队列把这些信息交付应用层协议,应用层协议会根据ICMP报文反馈的信息进行进一步处理。
6、了解时间戳请求报文的处理步骤,设计并实现时间戳请求与应答报文处理函数。
本题主要考查对时间戳请求/应答报文的掌握程度,使学生在全面理解的基础上提高独立设计该函数的能力。实现时间戳请求/应答处理函数的流程可概括为:(1)若该函数收到一个时间戳请求报文,则首先记录下收到该请求时其时钟所显示的通用时间,然后根据请求报文构造时间戳应答报文,将时间戳请求中的原始时间戳字段复制到应答报文中的原始时间戳字段,并填入接受时间戳,在应答报文发送离开时填入当前的通用时间,最后交由IP封装并发送;(2)若该函数收到一时间应答报文,则首先记录下收到该应答报文时所显示的通用时间T,然后提取出报文中的原始时间戳、接受时间戳、发送时间戳,计算可得:Time_S
=接受时间戳-原始时间戳;Time_R = T-发送时间戳。返回Time_S + Time_R即可。
第六章
1、软件结构
图6-2描绘了IGMP软件中各个函数之间的调用关系。从图中我们可以看到,IGMP软件大致分成三个部分:一组负责处理或发送IGMP报文的函数,一组用于维护主机群表的函数和一套通过TCP定时器完成定时发送的机制。
os内部消息队列发送消息 psendtcptimer到期tcp定时器设定tmset接收消息preceiveigmphgjoinhglookupigmp_inigmp_settimersigmp_update创建hginithgaddhgleavehgrandhgarpaddhgarpdellocal_outnetstartIP模块
图6-2 IGMP软件结构
主机端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报文时也可能会查询相关的主机群表。
2、为什么没有必要让IGMP报文在本地网络以外传送。
IGMP是路由器和内部子网之间维护组成员关系的一个协议,IGMP报文只需要在本地