ARP协议

概念

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。

注意:ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果不在一个局域网上,则需要将报文传输到路由器,由路由器转发到下一跳

帧格式

  • 目的MAC地址:请求报文为ff-ff-ff-ff-ff-ff,应答报文为请求端的MAC地址。
  • 源MAC地址:请求报文为请求端的MAC地址,应答报文为被请求的MAC地址。
  • 帧类型:长度为2个字节,取值为0x0806,代表ARP报文。
  • 硬件类型:长度为2个字节。表示网络类型;以太网取值为1。
  • 协议类型:长度为2个字节。表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800
  • 硬件地址长度(hln):长度为1个字节。表示硬件地址的长度;以太网中取值为6,表示MAC地址长度为6个字节。
  • 协议地址长度(pln):长度为1个字节。表示协议地址长度;取值为4表示IP地址长度为4个字节。
  • 操作类型(op):长度为2个字节,表示ARP报文的种类;取值为1表示是ARP请求报文。为2表示是ARP应答报文。
  • 发送端的MAC地址:请求报文为请求端的MAC地址;应答报文为被请求端的MAC地址。
  • 发送端的IP地址:请求报文为请求端的IP地址;应答报文为被请求端的IP地址。
  • 目的端MAC地址:请求端发出该请求时,还不知道该MAC地址。接收方忽略该字段。应答报文为请求端的MAC地址。
  • 目的端IP地址:请求端希望映射的IP地址,也就是被请求端的IP地址。应答报文为请求端的IP地址。

ICMP协议

概念

为了更有效地转发IP数据报和提高交付成功的机会,再网络层使用了ICMP协议(Internet Control Message Protocol,网际控制报文协议)。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告,ICMP不是高层协议(ICMP报文是装载IP数据报中,作为其数据部分,看起来像是高层协议)。

帧格式

ICMP报文有两种:ICMP差错报告报文和ICMP询问报文
ICMP报文的前4字节是统一的格式,即类型、代码和校验和,接着4字节和ICMP的类型有关,最后是数据字段,其长度取决于ICMP的类型。下图给出常见报文类型

差错报告报文介绍

  1. 终点不可达:当路由器或主机不能交付数据报时就向源点发送该报文
  2. 源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送该报文,使其知道应当把报文发送速率变慢
  3. 时间超过:当路由器收到TTL为0的数据报时,除了丢弃报文外,还向源点发送该报文,若终点再预定规定的时间内不能收到一个数据报的全部分片报文时,就把已经收到的分片全部丢弃,并向源点发送该报文
  4. 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时就丢弃报文,并向源点发送参数问题报文
  5. 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)

改变路由的简短解释:我们知道,在因特网中的主机也要有一个路由表。当主机要发送数据报时,首先查找主机自己的路由表,看应从哪个接收把报文发出。在因特网中主机数量远大于路由器,出于效率的考虑,主机不和链接在网络上的路由器定期交换路由信息。在主机刚工作时,一般都在路由表中设置一个默认路由器的IP地址(这个就是网关),不管数据报要发送到哪个目的地址,都一律先将数据报传送给网络上的这个默认路由器,而这个默认路由器知道每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由不是自己而是另一个路由器R,那么就用ICMP的改变路由报文告诉主机,于是主机就在其路由表中增加一个项目:到某某目的地址应经过路由器R(而不是默认路由器)。

所有的ICMP差错报文格式:把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。如下图所示

提取前8字节是为了获取端口号(对于TCP和UDP)以及报文的发送序号(对于TCP),这些信息对源点通知高层协议是有用的

询问报文介绍

  1. 回送请求和应答
    回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须源点发送ICMP回送应答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态

    ping命令就是典型的ICMP会送请求和应答

  2. 时间戳请求和回答
    请求某个主机或路由器回答当前的日期和时间。再ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。