day13、2 - 网络层--IP包头分析

一、IP包概述

1.网络层传输单元

  • 报文/IP包/包:由IP包头 + 上两层数据构成

    image-20211030143605609
  • 图示:(图中单位为bit)

    image-20211030145232513

2.IP包头格式

  • IP包头长度是可变的:最小长度为20,最大长度为60,但是大部分我们在网络中抓到的IP包头都是20个字节(可选项一般不会轻易被使用)。所以不管怎么样IP包头的前20字节是一定存在的
  1. 版本:占4bit;一般为0100和0110表示这个报文属于ipv4版本还是ipv6版本

  2. 首部长度:占4bit;表示IP包头一共有多少个字节。

    地位很重要:由于IP包头的长度是可变的,那么计算机在处理2进制时,是区分不了哪几位表示什么含义的,比如我们规定帧头为14字节长度,那么当计算机处理完前14字节长度后就知道帧头处理完了,该处理IP包头了,那么我们必须要告诉计算机IP包头的长度,让计算机知道IP包头是哪几位,处理完就该处理TCP/UDP头了

    4位全为1也才等于15,但是IP包头的长度范围为20-60字节,这不足以表示,那这个是怎么计算的呢?

    4位的每一位表示32bit即4字节,比如0001转化为十进制为1,由于每一位表示4字节,所以还要1*4=4,故如果首部长度为0001则,表示长度为4字节。同理:首部长度一般为0101,1*4 + 4*4 = 20,故0101表示首部长度为20字节(即IP包头最小长度);若首部长度为1111,1*4 + 2*4 + 4*4 + 8*4 = 60,则表示IP包头的最大长度60字节

  3. 优先级与服务类型:优先级占3bit,服务类型占4bit,最后一位保留还未启用;优先级表示所在帧在网络传输过程中的优先级;服务类型表示所在帧属于什么业务的数据需要使用什么服务类型。说白了8位就是起到了标识的作用(在默认情况下这几位都是0)

    优先级举例:比如小白在运营商那多交了钱,让自己的网速快一些,那么每次运营商路由器那收到来自小白的数据,就会通过一些技术把优先级这几位+1/+2/+3等操作,那么当数据到达下一个控制网速的设备,本来应该所有数据到了以后排队处理转发,但是收到了小白的数据,一看这个优先级高一些,就会让小白的数据从快速通道走

    服务类型举例:比如现在上海的公司和北京的分公司之间要有视频通信功能,正常来说一般都是买网络宽带,走互联网建立连接但是很慢,现在公司有钱的话可以购买专线,从上海直接连到北京,那么这条专线上就只会运输公司内部的一些业务所需要的信息,比如传文件、视频通信等公司业务。如果公司内视频业务很重要,那么就要告诉运营商,让运营商在专线的接入设备上记录这些业务的优先级,这属于优先级;除此之外专线的服务类型有低延迟服务类型、高通道服务类型,视频业务更需要低延迟,那么运营商就可以在设备上把视频业务标记到低延迟服务类型中去,那么当视频类型的数据流经专线接入设备,设备一看服务类型就不对该数据做过多的处理,直接从专线转发走了

  4. 总长度:占16bit;表示整个报文的总长度

    为什么要记录报文的总长度,因为帧头帧尾最大的运载数据大小为1500字节,假如现在有大于1500字节的数据,那么就要对报文分片,分成一组一组的,最后这一大段的报文被分成小段小段的分片封装成帧,在网络中传输,最终不按先后次序的到达,如果不记录总长度,那么接收方就无法得知数据有没有传输完整,会不会有几个分片丢了,所以要记录一下报文的总长度,最后全部到达再进行组装。理解详见二、IP分片

  5. 段偏移量:占13bit;表示该分片属于第几个分片,记录分片的先后顺序,确保组装分片时顺序不会错乱;大小只有1480、1480的倍数、0

    理解详见二、IP分片

  6. 标识符:占16bit;在报文进行IP分片后,标识同一报文的所有分片。最终接收方收到很多帧,根据标识符得知哪些分片属于同一个报文

  7. 标志:占3bit,其中第一个bit位未被启用永远为0;第二bit如果为0表示报文进行了分片,如果为1表示报文未进行分片;最后一个bit为1时表示不是最后一个分片,为0表示是最后一个分片。即如果标志位010那么标识符和段偏移量都为0

  8. TTL:占8bit;time to live生存时间,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量;TTL的作用为防止数据包在网络中永久的循环(范围0-255);且可以根据TTL得知下一跳是哪个设备,或者可以检测传输中哪一台设备出问题了,或者是否出现环路

    即如果TTL值为5,那么帧进过第一个路由器(第一个经过的肯定是网关),则路由器会将IP包头中的TTL值减1,再经过网络中下一个路由器,再减1,知道最后经过一个路由器将TTL值减为0,那么再下一个路由器收到帧后解封装获取到TTL的值为0,那么就会将帧丢弃,不再转发。

    一般ping对方,通过对方给我的回包中显式的TTL值可以判断对方主机属于什么操作系统:一般TTL小于100的,主机的操作系统为linux;一般大于100的为windows系统;为255则表示为网络设备

  9. 协议号:占8bit;识别上层协议:如果为6表示数据是使用二层的TCP协议传输到三层,那么接收方解封装或者去协议号为6后需要将数据传给上层的TCP协议处理;如果是17表示传给UDP;如果是1往同层的ICMP协议走。(与帧头中类型比较像:类型为0x0800表示要传给三层的IP协议;类型为0x0806表示要传给三层的ARP协议)

    总结:6–TCP;17–UDP;1–ICMP

  10. 首部校验和:占16bit;用于校验IP包头(20字节-60字节)的完整性(和FCS类似)

  11. 源地址和目标地址:各占32bit

  12. 可选项:有时候会被启用有时候不会,要看具体情况。

    这里举两个启用的情况,比如:我们ping一个服务器,最后服务器给我们的回包中带有服务器的TTL值,想一想假设服务器的TTL值为53,经过几个路由器传到我主机上,那么TTL的值会减少,那么最后主机上是如何得到服务器最初设定的TTL值的,所以有些设备发包会将TTL的值记录在可选项中;还有比如说我们要对一些内容进行加密,路由器是无法获取的,那么可以讲密钥等一些信息放到可选项供路由器解密使用

二、IP分片

1.为什么需要分片

  • 上三层的数据长度超过1500字节时,由于帧头帧尾之间最大运载量MTU为1500,那么这段数据靠一个帧是无法运输的,所以需要对报文按一定要求分组,再封装到多个帧进行运输,这项技术即为IP分片技术

2.如何分片

  • 图示:

    image-20211030173636092
  • 过程说明:

    • 现在5层需要传输的数据大小为4000字节,传到4层封装TCP或UDP头20字节(这里全部假设为最小长度,因为TCP/UDP头也是可变的),传到三层封装IP包头20字节,目前上三层数据的大小为4040字节,根据国家规定的MTU值判断超过了帧头帧尾的运载能力,所以需要对上三层数据进行分片

      不能直接平均分,不然分出来只有第一组包含了IP包头部分和TCP/UDP头,那么剩下后面的分组中只有5层数据,在网络传输过程中,路由器等设备发现帧中没有IP包头等信息,就会丢弃,无法传输

    • 先根据帧的MTU值(最大运载量,中国大部分设备默认为1500)计算应将报文分成几个分片:将报文除去IP包头剩下的部分分成几等分可以满足运送需求,此例4020分成3部分即可(组数:上两层数据大小除以1480向下取整)

    • 按照计算的分片片数,再将报文的IP包头(20字节)复制三份,分别作为这三个分片的IP包头,但是为了记录先后顺序,第一个分片的IP包头的段偏移量和标志分别设为0、001,第二个分别为1480、001,第三个分别为2960、000。最后接收方组装的时候会按照偏移量顺序组装(即三个复制的IP包头除了段偏移量不同,以及最后一个分片的标志的最后一bit为0,其它分片的为1外,其他部分相同

    • 然后将上两层数据进行IP分片,第一组大小为1480,拼接到第一个IP包头(20字节)后面组装成第一个分片;第二组大小为1480,拼接到第二个IP包头(20字节)后;第三组大小为1060,拼接到第三个IP包头(20字节)后组成第三个分片。

    • 最后这三个分片会封装成帧,传给数据链路层和网络层,再经过网络不分先后的传输到对方主机解封装,在网络层根据IP包头中的标识符将来自同一个报文的分片分到一起,再通过段偏移量按照先后顺序组装成完整的报文,再解封装运送到上层去

三、IP包相关攻击防御

1.泪滴攻击

  • ddos攻击的一种,泪滴攻击通过不断向攻击方发送伪造的、损坏的IP包,使对方永远无法将报文组装成功,会因为不断的组装–失败–组装–失败–组装–失败…最终CPU负载过高死机。虽然现在已经修复了这个漏洞,但是泪滴攻击依然存在。因为现在组装失败后就会丢弃,但是如果不断的大量的多攻击方的对一个目标攻击,那么这台机器的CPU就会一直处理组装报文,导致CPU会浪费时间处理不相干的工作

2.泪滴攻击的防御

  • 开启防火墙,防火墙会先试着组装,如果组装失败就丢弃,那么主机就不会花时间处理;但是也是相对的,通过不断的攻击会将防火墙的出口的带宽占满、将防火墙CPU内存占满,此时就需要请运营商对防火墙进行流量清洗:运营商会先于防火墙阻拦组装失败的分片
  • 现在有防御的手段,比如将分片交给第五层来做,即应用软件来对数据进行分片,即将数据分为1460字节每片(假设按照最小的字节大小添加TCP/UDP头和IP包头),传到四层加20字节TCP/UDP头,再传到三层加20字节,刚好1500字节,则无需进行分片,则IP包头总中标志为010。直接传给数据链路层。那么按照此原理,只要防火墙设置为防止伪造的报文(标志为000或者001)的报文通过即可。但是软件的负担会加大
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值