IP协议的主要特点:
- IP协议是一种无连接、不可靠的分组传送服务的协议。
- IP协议是点-点线路的网络层通信协议。IP协议是针对原主机-路由器、路由器-路由器、路由器-目标主机之间的数据传输的点-点线路的网络层通信协议。
- IP协议屏蔽了网络在数据链路层、物理层协议与实现技术上的差异。通过IP协议,网络层向传输层提供的是统一的IP分组,传输层不需要考虑互联网在数据链路层、物理层协议与实现技术上的差异,IP协议使得异构网络的互联变得容易了。
IP包头长度
ip包头的长度在20-60个字节间,一般是20字节(固定部分),可选项最大是40个字节(比较少用)。
第一行
版本
就是指出IP数据包是什么版本;常见的版本就是0100 IPV4和 0110 IPV6(常见的是IPV4)
首部长度
IP数据报首部中有一个首部长度字段,4 位长,可表示的最大十进制数字是15。因此首部长度的最大值是15个4字节长的字,即60字节。
首部长度是指IP首部占32bit字的数目,包括选项(如果有)。首部长度本身为4bit字段,能表示的二进制最大数为1111,换算成十进制为15,即首部最长为15个32bit长度=480bit,即最大长度60字节。
优先级与服务类型(3比特优先级,4比特服务类型,1比特保留)
该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型,最后1位没有定义。这些8位字段用于分配优先级、延迟、吞吐量以及可靠性。
总长度:
网络层IP报文的总长度超过1500就会进行分片(3、4、5层的总长度,data + TCP/UDP头+IP包头)
第二行
前置知识IP分片
IP分片产生原因 (来源)
我们假设要传输一个UDP数据包,以太网(一个帧)的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象
IP分片原理(来源)
IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。
图1
在IP首部有4个字节是用于分片的,如图1所示。前16位是IP数据报的标识,同一个数据报的各个分片的标识是一样的,目的端会根据这个标识来判断IP分片是否属于同一个IP数据报。中间3位是标志位,其中有1位用来表示是否有更多的分片,如果是最后一个分片,该标志位为0,否则为1。后面13位(段的偏移量)表示分片在原始数据的偏移,这里的原始数据是IP层收到的传输的TCP或UDP数据(TCP/UDP头 + 应用层数据(data)),不包含IP首部,如下图:。
需要注意的,在分片的数据中,传输层的首部(TCP/UDP)只会出现在第一个分片中,如图1所示。因为传输层的数据格式对IP层是透明的,传输层的首部只有在传输层才会有它的作用,IP层不知道也不需要保证在每个分片中都有传输层首部。所以,在网络上传输的数据包是有可能没有传输层首部的。
标识符:
同一IP报文的表示符是一致的,用来分类分片属于那个数据包
段的偏移量:
分片在数据包中的相对位置(IP分片的先后顺序),值为0就是第一个分片,1472的是第二个分片,2854就是第三个分片以此类推
标志(3bit):
- 第1个比特永远为0,代表不能启用
- 第2个比特值有两种:0或1 (0表示该IP包进行了分片,1 代表未分片,只有一个帧)
- 第3个比特是告诉pc该分片是否是最后一个值有两种:0或1 (0表示该分片值最后一个,1 代表在该分片后面还有分片)
攻击方式(泪滴攻击):
使用攻击工具伪造三个帧,标志为分别为:001、001、000,段偏量分别为:0 x(x<1472) x(x<=1472),会使计算机一直尝试重组数据,一直失败会导致PUC被占满。
防御:
最有效的方法就是在服务器前端加防火墙,过滤不安全的包
第三行
TTL(time to live)生存时间
TTL值对我们在进行网络故障分析时能起到很关键的作用,该字段表示一个IP数据报能够经过的最大的路由器跳数,TTL字段是由IP数据报发送端初始设置的。
每个处理该数据报的路由器都需要将其 TTL值减1,即当一个IP数据报每经过一个路由时,其TTL值会减1,当路由器收到一个TTL值为0的数据报时,路由器会将其丢弃。因此,TTL字段的目的是就是为了防止1个IP数据报网络中循环的流动。
例如:当路由器的路由表配置错误或网络设备接线错误是,则可能会造成网络环路,在这种情况下,路由器可能根据其路由表将该数据报一直循环转发下去,导致IP数据报一直在网络中发送。
因此,就需要一种机制来给这些循环传递的数据报上加上一个生存上限,以保证数据报不会无休止的发送,TTL字段正是用于实现这种机制的一种手段。
TTL值进行网络故障分析:
- 当我们在分析数据报的过程中如果发现TTL=1的IP数据包或者在科来网络分析系统的诊断下看到IP数据报生存周期太短的事件(组播数据报除外)时,我们就应该怀疑网络中是否存在环路了。
- 对于网络环路的分析,我们还应该结合报头中的标识字段来查找,如果发现数据报的标识符都相同,并且TTL值一直在递减,那么说明网络中一定存在环路的故障,这时,就应该检查网络设备是否出现有接错线或者路由配置出现问题。
利用TTL字段值判断操作系统:
一般在TTL字段值>100是微软的Windows主机,TTL字段值<100的linux主机
操作系统 | 默认操作系统的TTL |
微软 WINDOWS NT/2000 | 128 |
微软 WINDOWS 95/98 | 32 |
UNIX | 255 |
LINUX | 64 |
WIN7 | 64 |
Compaq Tru64 5.0 | 64 |
并不是100%准确,取相近值,TTL是可以改的,并且每经过一台路由器都会减一,只能用作参考
跟踪本机发送请求到目标IP,所经过的网关(路由器)
命令:tracert 目标IP/域名
协议号
表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
首部检验和(checksum)
用于校验数据报的首部(ip包头20字节这块),占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。
第四行
源地址
表示数据报的源 IP 地址,占 32 位。
第五行
目的地址
表示数据报的目的 IP 地址,占 32 位
第六行
可选字段
该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
第七行及以后
数据部分
表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。