网络。
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层只需要在转发数据时搜索路由表即可。