网络协议与分析课后习题讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章
1、异构网络互连的问题是什么?试举例说明。
举例来说,用户A可以通过接入使用以太网技术的校园网,与另外一个使用电话点对点拨号上网的用户B之间进行邮件通信,同时还和一个坐在时速300公里的高铁上的使用WCDMA手机进行3G上网的用户C进行QQ聊天。
但问题的关键在于,这些采用不同技术的异构网络之间存在着很大差异:它们的信道访问方式和数据传送方式不同,其帧格式和物理地址形式也各不相同。
2、请描述图1-2中,用户A和用户C进行QQ聊天似的数据转换和传输过程。
用户A的主机将发送的邮件数据先封装到IP数据包中,在封装到以太帧中,发送到其接入的以太网中,并到达路由器R1。
路由器R1从以太帧中提取IP数据包,根据目标IP地址选择合适的路径,再将其封装成SDH 帧,转发到因特网主干网中,经过因特网主干网中若干路由器的选路和转发,到达路由器R3
路由器R3从SDH帧中提取IP数据包,转换成WCDMA帧,发送到3G网络中,到达用户C的主机。
用户C的主机提取出IP数据包,最总交付到上层的邮件应用程序,显示给用户C。
3、TCP/IP协议族中的协议主要有哪些?请列举出协议的名称并查找其对应的最新RFC编号。
768 UDP 用户数据报协议
791 IP Internet协议
792 ICMP 网际控制报文协议
793 TCP 传输控制协议
826 ARP 地址解析协议
959 FTP 文件传输协议
4、画出TCP/IP模型和OSI模型之间的层次对应关系,并举例TCP/IP模型中各层次上的协议。
应用层:应用层对应OSI模型的上面三层。
应用层是用户和网络的接口,TCP/IP简化了OSI的会话层和表示层,将其融合到了应用层,使得通信的层次减少,提高通信的效率。
应用层包含了一些常用的、基于传输层的网络应用协议,如Telnet、DNS、DHCP、FTP、SMTP、POP3、HTTP、SNMP、RIP、BGP等。
传输层:传输层位于IP层之上,为两台主机上的应用程序提供端到端的通信服务。
目前,应用最广泛的传输层协议是TCP和UDP。
网络层:网络层又称为网际层、互联网层或IP层,是TCP/IP模型的关键部分。
该层主要完成IP数据包的封装、传输、选路和转发,使其尽可能到达目的主机。
该层包括的协议主要有IP、ARP、RARP、ICMP和IGMP,其中,IP协议是网络层的核心。
网络接口层:网络接口层对应OSI模型中的物理层和数据链路层,只要底层网络技术和标准支持数据帧的发送和接收,就可以作为TCP/IP的网络接口,包括前面提到的各种局域网、城域网、广域网技术,如以太网、电话拨号、3G网络等。
5、例举出某一个具体网络通信过程中的多路复用和多路分解过程,并说明……
多路复用是指多个上层协议复用同一层底层协议数据包
多路分解是指从底层协议数据包解封数据
第二章
1、简述HDLC是什么?有什么应用?
是什么:
高级数据链路控制(High-Level Data Link Control, HDLC)协议是由ISO标准化组织制定的一个面向比特的同步数据链路层协议。
它是由IBM的同步链路控制(Synchronous Data Link Control,SDLC)协议发展而来的。
HDLC协议提供了面向连接和无连接两种服务;它既可以工作在点到点线路方式,也可以工作在点到多点线路方式。
HDLC协议不依赖于任何一种字符编码集;数据报文可透明传输;既支持半双工,也支持全双工通信,有较高的数据链路传输效率;所有帧采用了流量控制和差错控制,传输可靠性高;传输控制与处理分离,具有较大的灵活性。
应用:
广泛应用于数据通信领域、X.25网络、帧中继网络以及作为数据链路层协议连接服务
器到广域网中。
2、简述PPP协议在SLIP的基础上做了哪些改进?查找资料,说明PPPoE协议和PPP协议的关系,PPPoE的工作流程、帧结构及其应用?
1)改进
SLIP(串行线路因特网协议)协议是一种简单的帧封装方法,有许多缺陷,比如SLIP 不支持IP地址分配;SLIP帧中无类型字段,无法同时传输多个上层协议;SLIP中没有校验字段,链路层上无法检测出由于线路噪声导致的差错。
PPP协议克服了SLIP协议中的所有缺陷,它支持多种网络协议、多种数据压缩方法、多种身份认证方式、动态地址分配、差错控制和数据加密等。
2)PPPoE全称为Point to Point Protocol over Ethernet(以太网上的点对点协议),简单地说,就是以太网和PPP结合后的协议,目前广泛应用在ADSL接入方式中,用于宽带拨号上网,使连接在以太网上的许多主机共享一条物理线路接入到因特网。
3、CSMA/CD和CSMA/CA分别是什么?有什么区别?
答:CSMA/CD载波侦听多路访问/冲突检测协议,是一种分布式介质访问控制协议。
其原理如下:
(1)多个站点平等的接入到共享访问介质(多路访问)。
(2)每个站在发送帧之前,首先要监听访问介质,只有访问介质空闲时,才允许发送帧(载波监听)。
(3)如果两个以上的站同时监听到访问介质空闲并发送帧,则会产生冲突现象。
因此要求每个站在发送数据的同时,仍然继续监听访问介质(冲突检测)。
如果出
现冲突,则发送站要发送干扰信号以使所有其它主机都能接收到冲突信号。
然
后每一个发送站随机延时一段时间后,再次重新发送帧。
和采用总线拓扑结构的以太网类似,无线局域网中的传输介质也是共享的,需要一定的介质访问控制协议来避免冲突。
但是由于在无线传输中有“隐藏站”问题,无线局域网没有采用基于冲突检测的CSMA/CD技术,而是设计了一种避免冲突的CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance,载波侦听多路访问/冲突避免)协议。
CSMA/CA工作原理如下:
(1)发送站在检测到介质空闲后,先发送一个请求发送帧(RTS),帧中存放了它需要占用介质的时间。
(2)接收站收到请求RTS后,发送准备发送帧(CTS),所有站点都会收到该帧,知道了介质会被占用一段时间。
(3)发送站发送数据帧。
(4)接收站确认所收到的数据。
区别
① CSMA/CD可以一边检测冲突,一边收发数据,一旦检测到冲突,立刻停止数据收发。
CSMA/CA则是必须先检测是否有冲突,得到对端确认后,再发送数据,而不能同时进行,是根据无线网络的特点设计出来的。
②两者的传输介质不同,CSMA/CD用于总线式以太网,而CSMA/CA则用于无线局域网。
③检测方式不同,CSMA/CD通过电缆中电压的变化来检测,当数据发生碰撞时,电缆中的电压就会随着发生变化;而CSMA/CA采用能量检测(ED)、载波检测(CS)和能量载波混合检测三种检测信道空闲的方式。
第三章
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报文处理算法分为以下几个部分:
1)A要发送数据报文时,会先在arp缓存中找。
若存在对应项,直接提取即可。
(这样可以节省时间)
若arp缓存中没有该IP对应项,则将一个针对特定IP地址的ARP请求通过广播发送到本地
2)本地网络的主机会接收到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数据包的过程。
个人觉得
1)数据封装成IP数据包
2)IP数据包在底层没法发送。
应该是先运行arp协议得到硬件地址,然后发送到对应的硬件地址的主机。
当IP模块需要调用netwrite()函数通过网络接口发送或转发IP数据包时,需要调用arpfind()函数查询当前ARP缓存中是否存在对应数据包下一跳协议地址的物理地址,若查询失败,应该调用arpalloc()函数创建一个空的ARP缓存记录并通过arpsend()函数发送一个ARP请求报文。
(这一段很重要哦)
可以分析下:即便是网络之间的传输也是要通过一次又一次点对点的发送,最终到达目的地。
4、略
5、简述ARP攻击的原理,并根据你对ARP攻击的理解提出一些改进方案
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP 通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP 缓存中的IP-MAC条目,造成网络中断或中间人攻击。
改进方案:
1、不要把你的网络安全信任关系建立在IP基础上或MAC基础上,(rarp同样存在欺骗的问题),理想的关系应该建立在IP+MAC基础上。
2、设置静态的MAC-->IP对应表,不要让主机刷新你设定好的转换表。
3、除非很有必要,否则停止使用ARP,将ARP做为永久条目保存在对应表中。
4、使用ARP服务器。
通过该服务器查找自己的ARP转换表来响应其他机器的ARP广播。
确保这台ARP服务器不被黑。
5、使用硬件屏蔽主机。
设置好你的路由,确保IP地址能到达合法的路径。
(静态配置路由ARP条目),注意,使用交换集线器和网桥无法阻止ARP欺骗。
6、管理员定期用响应的IP包中获得一个rarp请求,然后检查ARP响应的真实性。
通过以上的方法可以大大降低你受ARP攻击的可能。
1、试描述IP软件结构,说明函数之间的调用关系。
图4-2显示了IP软件中各个函数之间的调用关系。
为了方便IP与其他协议的交互,同时为了增强软件内部模块的耦合性,IP软件采用了独立IP进程的设计方式。
从图4-2中我们可以看到,整个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()函数将数据包交付网络接口模块(注意这里的网络接口既有可能是物理接口,也有可能是环回接口)。
图4-2 IP软件总体结构
当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数据包交付上层协议软件。
ipdbc ipproc
ipputp ipfsend
ipfhcopy
netwrite
local_out
ipreass
ipfcons
ipfjoin ipfadd
TCP,UDP,ICMP,IGMP,OSPF
网络接口驱动
图4-3 IP软件输出模块结构
除了以上我们提到的函数之外,IP软件中还提供了一组用于访问路由表的接口函数。
这组函数主要包括rtadd()函数、rtdel()函数、rtget()函数和rttimer()函数。
它们分别用于添加、删除、获取以及定时刷新路由表。
2、根据IPV6首部设计其IP数据报首部数据结构
1)IPV6的数据报首部为:
struct ip {
char ip_verlen; /* IP version & header length (in longs)*/
char ip_tos; /* type of service */
short ip_len; /* total packet length (in octets) */
short ip_id; /* datagram id */
short ip_fragoff; /* fragment offset (in 8-octet's) */
char ip_ttl; /* time to live, in gateway hops */
char ip_proto; /* IP protocol (see IPT_* above) */
short ip_cksum; /* header checksum */
IPaddr ip_src; /* IP address of source */
IPaddr ip_dst; /* IP address of destination */
char ip_data[1]; /* variable length data */
};
版本(4 位)指明协议的版本对IPv6 该字段总是6。
流量类型(8位)区分不同IPv6 数据报的类别或优先级。
相当于IPv4的“区分服务”字段。
流标号(20位):源端标记那些要求路由器提供服务质量支持的数据报属于同一个流的数据报的流标号相同。
有效载荷长度(16位)指IPv6数据报除基本首部以外的字节数最大值是64 KB。
下一个首部(8位)指该数据报中的数据要交付给哪个高层协议相当于IPv4 的协议字段。
跳数限制(8位)相当于IPv4的TTL字段。
源地址(128 位)是数据报的发送站的IP 地址。
目的地址(128 位)是数据报的接收站的IP 地址。
3、简述IP分片重组算法。
在数据报长度超过传输网络的限制时,若允许分片,对数据报进行分片。
同一个数据包的所有分片使用同一个标识。
所有分片标识为分片。
计算本数据包中的数据与起始端的偏移并存储。
然后按照正常的数据发送方式发送这些包。
接收时,需等到一个数据报的所有分片到齐,当内存足够时,一次性交给内存进行重组。
并提交给相关应用。
4、IP数据报首部中哪些字段在经过每一个路由器时会发生变化?
IP数据报转发过程中,TTL会发生变化,这样会导致检验和变化;如果IP数据报产生分片,则IP数据报长度字段、标识字段、标志字段、分片偏移字段也会发生变化;如果IP 数据报首部存在分片,则首部长度字段有可能发生变化。
5、设计字节序转换函数
由于网络字节序采用的就是大端字节序,所以都统一到大端字节序。
其中不同位数的转换不同。
16位转换宏如下:
#if BYTE_ORDER == LITTLE_ENDIAN
#define hs2net(x) (unsigned) ((((x)>>8) &0xff) | (((x) & 0xff)<<8))
#define net2hs(x) hs2net(x)
#endif
#if BYTE_ORDER == BIG_ENDIAN
#define hs2net(x) (x)
#define net2hs(x) (x)
#endif
6、不看
7、选路和转发的主要差异是什么?现在网络中普遍存在三层转发设备,请考虑三层转发的实现方式。
选路和转发的主要差异及三层转发的实现方式如下:
选路的原理:当路由器收到一个需要它转发的IP数据报时,它会根据数据报中的目的IP地址搜索路由表,找到相关的路由表项,并根据路由中的<目的地址,下一跳,出接口>三元组将数据报从相关的出接口转发。
而路由表的维护是由专门的路由选择协议来进行的,IP层只需要在转发数据时搜索路由表即可。
转发的原理:交换机接收到源主机发送的数据帧后,在MAC地址表中查找数据帧中的目的MAC地址。
如果找到,就将该数据帧发送到相应的端口;如果找不到,就向所有的端口发送。
同时利用接收数据帧中的源MAC地址来建立MAC地址表。
选路和转发的区别主要是,选路在IP层,根据目的IP地址找到出接口;转发在数据链路层,根据MAC地址对数据进行转发。
另外,转发表和路由表不同,转发表中的一行包括从网络号到发出接口的映射和一些MAC信息,而路由表是由路由选择算法建立的一个表,它通常包含从网络号到下一跳IP地址的映射,转发表可以由特殊的硬件来实现,而路由表很少这样。
为了实现三层交换技术,交换机将维护一张至少包括“目的IP地址,下一跳MAC地址”在内的硬件转发表。
当交换机接收到数据时,根据报文中的“目的IP地址”查询硬件转发表,根据匹配结果进行相应的数据转发,并且采用硬件芯片或高速缓冲区支持,可以达到线速。
在交换机刚启动完毕时,交换机就把设备的软件路由表下载到ASIC芯片上。
在需要进行三层交换的报文到达交换机后,交换机首先会查询最长匹配硬件转发表,但由于MAC地址是未知的,无法同时下载,此时的硬件转发表是无效的,所以无法进行硬件数据转发。
因此,交换机将利用CPU对数据进行软件路由转发,交换机在数据转发过程中获取下一跳IP 地址和数据转发出口的MAC地址,然后会被自动下载到三层硬件转发表,此时包含了下一跳IP地址和数据转发出口MAC地址的硬件转发表项才真正生效。
在这之后,发往相同目的IP网段的报文到达交换机都可以直接通过最长匹配硬件转发表进行硬件转发,而其他网段的数据转发则需要重复上述过程。
8、设计IP检验和计算函数
在这里仅给出计算过程。
9、略
10、可以考虑以IP地址为标准,构造平衡树。
优点:查询速度可以增快。
缺点:占用存储,且建立和调整树都是需要时间的。
不能随机访问。
第五章
1、软件结构
图5-2描绘了ICMP软件中各个函数之间的调用关系。
从图中我们可以看到,整个ICMP 软件大概可以分为输入和输出两个部分。
icredirect icsetsrc
icmp_in
local_out
icmp
udp_in
icsetbuf
icerrok
icsetdata IP模块
图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定时器完成定时发送的机制。
图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报文只需要在本地。