在网络层中,有我们大名鼎鼎的IP协议,当然在网络层中,除了IP协议外还有很多其他的协议。比如ICMP协议,ARP协议,RARP协议等。我们会对这一层的这几个协议做简单的介绍,让我们了解他们都是干什么用的。
ICMP协议
ICMP是(Internet Control Message Protocol)网际控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP的包头只有8个字节,其中前四个字节是固定的,一个字是类型,一个字节是代码,两个字节是校验和。后4个字节根据ICMP包的类型而取不同的值。其中,在类型中如果type=8代表的是请求包,即发出的报文,如果type=0则代表返回包是我们访问的主机对我们的回应。
type |
code |
check sum |
date |
在我们ping的时候会发现一个参数ttl
ttl=生存时间,其实就是经过的路由器数量。每一个计算机都会有一个初始值,我们收到的别人的ttl可能和自己的不一样
我们可以使用一个命令查看我们和目的主机到底中间隔了几个路由器
traceroute 查看经过多少路由器
-d
tcpdump Linux的字符抓包工具
由于有些网络高手可以通过ICMP报文对计算机发起网络攻击,所以有一些公司会禁止ICMP的功能,让其他人在ping的时候收不到返回包,让人们误以为这个地址是不存在的,也就降低了主机的风险。其实,我们不仅可以关闭icmp,还可以伪造ttl,让别人查不到我们主机到底在哪里。
禁止ping
/proc/sys/net/ipv4/icmp_ignore_all 默认0
echo 1 > /proc/sys/net/ipv4/icmp_ignore_all
伪造ttl
echo 128 > /proc/sys/net/ipv4/ip_default_ttl
ping -f 发送大量的数据包
ping -f 172.17.251.97 -s 8000 –f
ARP协议
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
由于ARP协议发送的是广播,所以它不能跨路由器,这一点很重要。
上图很好的说明了我们的ARP协议是如何工作的。如果我们想要给某一台主机发送数据,我们已经知道了它的IP地址,但是我们并不知道它的MAC地址,此时,我们需要先找出它的MAC地址才能真正的给它发送数据,这样就用到了我们的ARP协议。
首先,我们先发送ARP报文,在一个局域网内广播,如果找到了在此局域网内用于相应IP的主机,主机在收到报文后,会对相应的主机发送一个回应报文,告诉此机器它的MAC地址是什么,当源主机得到该MAC地址之后,会把它存在自己的ARP表中,将IP与相对应的MAC地址对应起来,等下一次需要找到这个诸主机时就不必再重新寻找。但是,ARP表示有限的,当表满了之后,如果有新的主机对应进来,就会把老的对应关系给顶替掉。只保留最常用的对用关系。
我们可以使用命令查看我们的ARP包
Windows:arp –a
Linux:ip neigh/arp –n
同样的,我们也可以向ARP表中删除和手动添加一个对应关系
删除命令:
arp –d 137.23.76.23
添加命令:
arp -s 192.168.1.123 d3.43.d4.a2.b7.dd
接下来我们以跨越两个路由的示例来说明,我们是如何使用ARP找到目的主机MAC以便于通信的。
A主机想要和B主机通信,主机A知道主机B的IP但是不知道主机B MAC,所以我们现在要获取的是主机B的MAC地址,但是ARP寻找主机MAC是通过广播的模式,这就意味着不能跨路由器,那么我们该如何实现呢?接下来我们进行讲解。
1.主机A知道路由的IP地址,因为离主机A配置有IP,所以是知道最近的路由的网关IP的。主机A先发一个广播找到最近路由的MAC:
165.23.231.11 |
IP (A) |
00:0c:29:84:00:B4 |
00:00:00:00:00:00 |
2.主机A找到最近路由的MAC之后,开始向最近路由发送ARP广播:
165.23.231.11 |
172.22.127.32 |
00:0c:29:84:00:B4 |
MAC(A) |
3.路由网关A点收到广播,看到IP不是找自己的,于是就在B口发送ARP广播,报文格式如下:
165.23.231.11 |
172.22.127.32 |
MAC(B) |
MAC(C) |
4.下一个路由在网关C处收到广播,路由器由于和主机B在一个网段,并且路由有记录功能,直接广播给主机B,格式如下:
165.23.231.11 |
172.22.127.32 |
MAC(D) |
db:c0:13:66:f2:32 |
5.主机B看到ARP广播是找自己的,就把自己的MAC写入ARP,进行回复:
172.22.127.32 |
165.23.231.11 |
db:c0:13:66:f2:32 |
00:0c:29:84:00:B4 |
当主机A收到主机B的MAC的地址后就开始和主机B建立连接,传输数据,具体过程参考主机到主机的包传递
RARP反向地址转换协议
反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。 RARP 可以使用于以太网、光纤分布式数据接口及令牌环 LAN
IP协议
版本:
占4位,指 IP 协议的版本目前的IP协议版本号为4
首部长度:
占4位,可表示的最大数值是15个单位,一个单位为4字节,因此IP 的首部长度的最大值是60字节
区分服务:
占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.后改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下都不使用
总长度:
占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节.总长度必须不超过最大传送单元 MTU
标识:
占16位,它是一个计数器,通常,每发送一个报文,改值会加1, 也用于数据包分片,在同一个包的若干分片中,该值是相同的
标志(flag):
占3位,目前只有后两位有意义
DF: Don‘t Fragment,中间的一位,只有当 DF=0 时才允许分片
MF: More Fragment,最高位, MF=1表示后面还有分片。 MF=0表示最后一个分片
片偏移:
占12位,指较长的分组在分片后,该分片在原分组中的相对位置.片偏移以8个字节为偏移单位
生存时间:
占8位,记为TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为64.发送 ICMP 回显应答时经常把 TTL 设为最大值 255
协议:
占8位,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程, 1表示为 ICMP协议, 2表示为 IGMP 协议, 6表示为 TCP 协议, 17表示为UDP 协议
首部检验和:
占16位,只检验数据报的首部不检验数据部分.这里不采用 CRC 检验码而采用简单的计算方法
源地址和目的地址:
都各占4字节,分别记录源地址和目的地址
有时候我们的IP数据报太长,为了保证数据能最大可能的到达目的主机,我们需要将IP数据报进行分片,因为片偏移是以8字节为单位的,所以我们在计算便宜量时需要除以8。