网络协议与分析课后习题 下载本文

网络。

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()函数将数据包交付网络接口模块(注意这里的网络接口既有可能是物理接口,也有可能是环回接口)。

ospf,tcp,udp,icmp,igmpipnet2hipredirectiph2netipsend发送数据包isbrcipdbcipprocipgetp获取数据包IP输入队列发送数据包创建ipputpcksumip_innetstartni_in网络接口模块 图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数据包交付上层协议软件。

ipdbcipprocTCP,UDP,ICMP,IGMP,OSPFipfhcopyipfconsipputpipfsendipfjoinipfaddnetwriteipreasslocal_out网络接口驱动 图4-3 IP软件输出模块结构

除了以上我们提到的函数之外,IP软件中还提供了一组用于访问路由表的接口函数。这组函数主要包括rtadd()函数、rtdel()函数、rtget()函数和rttimer()函数。它们分别用于添加、删除、获取以及定时刷新路由表。

2、根据IPV6首部设计其IP数据报首部数据结构 1)IPV6的数据报首部为:

struct

ip {

/* IP version & header length (in longs)*/ /* type of service */

/* total packet length (in octets) */

/* datagram id */ /* fragment offset (in 8-octet's)

*/

char ip_verlen;

char ip_tos; short short short

ip_len; ip_id; ip_fragoff;

char ip_ttl; /* time to live, in gateway hops */ char ip_proto; /* IP protocol (see IPT_* above) */ short IPaddr

ip_cksum; ip_src;

/* header checksum

*/ */

/* IP address of source

IPaddr ip_dst; char ip_data[1]; };

/* IP address of destination */ /* 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层只需要在转发数据时搜索路由表即可。