(四)对IP协议的深入浅出

IP协议

一. 概要

  通过以太网协议了解数据帧的通讯,网络通讯实际是依靠MAC物理地址来交流的,通过广播发送给连接的设备,设备校验这个MAC地址是否与自己的MAC地址相同,如果相同就收下,不同就丢弃。

 但是,假设知道MAC地址,现在,想个问题,世界很大,计算机成千上万,如果你把数据广播出去后,那么每一台计算机都收到了数据包,网络线路瘫几乎无法避免。为了解决这类问题,对地区进行了划分,产生了子网概念,同个区域内的计算机属于同个子网,这样广播的数量从上千级别缩减到子网内的计算机,这样就很小了。
在这里插入图片描述

 那么问题来了,怎么规划子网?这就引入了IP协议了,当然,有IP协议就有对应的IP地址标准,目前拥有IPV4,以及IPV6。

二. IP地址结构

  • IPV4
  • 类型结构

    目前最流行的一种IP结构, 有十进制和二进制两种表示法

    1. 点分制,共四组,每一组范围为0~255,255.255.255.255
    2. 二进制,共四组,每一组八位, 11111111 11111111 11111111 11111111
    • 基于地址结构,分为网络号+主机号组成,共有五大类型ABCDE类。
      在这里插入图片描述
      • A类地址的二进制最高位为0,主机数,共有16777216地址。
      • B类地址的二进制最高位为10,主机数,共有65536地址。
      • C类地址的二进制最高位为110,主机数,共有256地址。
      • D类地址的二进制最高位为1110,用于广播或者组播地址。
      • E类地址的二进制最高位为11110,用于保留使用。
  • 子网划分(子网寻址)

     有了5大类型ABCDE,同个类型不同的网络号都占有一样的主机数,有些地方可能不需要那么多的主机号,而且分配Ip地址也很麻烦,每个区域的中心网络需要负责整个区域的IP分配,因此为了简化管理,在对区域进行细分子网,借用主机号的位数来充当子网位数,例如借用2位,跟借用3位,主机号的数量是不同的。以下是C类地址的借用。
    在这里插入图片描述

     也就是ABCDE类是大区域,借用主机号充当网络号就是对大区域进行划分,也就是子网划分,把ip地址分为了三级,网络号+子网id+主机id
     当拥有网络号地址时,网络管理人员可以分配他们网络号下的子网ID和对应的主机ID,能在子网数和每个子网中预期的主机数之间灵活划分,不需要与其他站点协调。
     因此子网寻址提供这种灵活性的代价是增加成本,一个站点的所有路由和主机需要用一种新的方式来确定地址中的子网部分和主机部分。因为在子网出现之前,使用IP地址首位判断哪一类地址就可以了。

  • 子网掩码

     有了5类IP地址,以及子网划分,那在网络通讯的时候,如何判断IP地址是哪一类地址的,以及是那个子网区域的。
      关于如何区别是哪一类地址的,可以根据ip地址二进制表示,看看二进制首位属于哪一类地址的,例如C类,首部是110。
     关于如何查看有多少子网,无法从二进制上查看,这时就出现了子网掩码了。子网掩码是跟IP地址配套出现的。例如下图
    在这里插入图片描述

    1. 子网掩码长度与它对于的ip地址一样,是32位。
    2. 包含连续的1或者0,其中1连续区域代表的是网络号+子网号,0连续区域代表的是主机号。
    3. 这样通过子网掩码,就知道了(网络号+子网号),以及主机号,其中(网络号+子网号)可以根据对IP首位判断是哪一类地址,得出网络号位数后,用(网络号+子网号)减去得出网络号,就知道了子网号了。
    4. 边界路由需要子网部分,以确定子网,但Internet路由系统不需要识别子网掩码,因为站点之外的路由器做出路由决策只基于地址的网络号部分,并不需要子网部分。也就是说,子网掩码就是站点内部问题。
  • 计算方式
    • 计算网络数,2的N次方,例如C类地址,网络号为21位,所以是2的21次方,2 21 ^{21} 21=2097152
    • 计算主机数,2的N次方,例如C类地址,主机号是8位,所以是2的8次方,2 8 ^{8} 8=256
    • 计算子网数,先通过把IP地址首位换算为二进制,查看是哪一类地址,知道了网络号,再通过子网掩码看下借用多少位,借用N位,2的N次方个,例如C类地址,借用2位,2 2 ^{2} 2=4
  • 注意
    1. 计算子网数时,全0和全1的不使用,防止重复,所以一般需要减去2.
    2. 计算主机数时,全0和全1的不使用,用来广播等,所以也需要减2.

三. 目前广泛使用的CIDR无类别域间路由

  • 概念

     将 IP 地址分为 A 类、B 类、C 类后,会造成 IP 地址的部分浪费,并且IPv4的地址也快消耗完,为了帮助换件IPv4地址的压力,出现了 CIDR(无类域间路由)。
     CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。
     CIDR地址块会向下兼容IPv4五类型的IP地址,只是消除了类型的区别,添加细分维度

  • 结构

     之前的网络号,被限定为ABCDE类型,在CIDR已经消除这种类型区别,采用斜杠表示法,形式为(xxx.xxx.xxx.xxx/ff)例如222.80.18.18/25,其中“/25”表示其前面地址中的前25位代表网络号,其余位数代表主机号.
     从网络号可以看出它的子网掩码是多少,例如222.80.18.18/25,其中“/25”代表的就是网络号部分,剩余的就是主机号, 11111111111111111111111110000000

  • 特殊用处地址
    • 127.0.0/8,范围127.0.0.1~127.255.255.255 这是回传本地地址,都会送回给本机。
    • 224.0.0.0/28 用于组播地址,224.0.0.0~239.255.255.255 这是原先的D类地址。
    • 用于广播的地址,当主机二进制全为1时,就是一个子网最大的主机地址,例如255,这个地址不会发送给路由器网关。
    • 还有之前E类的保留地址,范围240.0.0.0~247.255.255.255
  • 基于CIDR划分子网例子

    某机构拥有一块打CIDR地址块为206.0.64.0/18,现在有一首高校需要申请一块较大的CIDR地址分给四个系使用,ABCD系,每个系使用主机数量不一样,A>B>C=D,需要怎么分配?

    • 过程
      • 机构觉得后续可能有许多学校或者企业需要申请,把206.0.64.0/18,进行划分子网,把主机借用4位用来充当子网,206.0.64.0/22,所以多出16个子网。
      • 学校分配到了一个206.0.68.0/22子网,对这个地址块再继续分为4个系,由于考虑到ABCD系数量的不同,先从大的开始分。
      • 在206.0.68.0/22的基础上,向主机位借用1位作为子网号,多出两个子网
        206.0.68.0/23 与 206.00.70.0/23,每个子网共有518个地址。
        其中206.0.68.0/23排给A系。
      • 再拿206.0.70.0/23这个地址块进行划分子网,借用1位主机位作为子网号,多出两个子网。
        206.0.70.0/24 与 206.0.71.0/24,每个子网共有256个地址
        把206.0.70.0/24 分为B系
      • 再拿206.0.71.0/24这个地址进行子网划分,借一位主机位作为子网号,分为
        206.0.71.0/25 与 206.0.71.128/25,每个子网共有128个地址。
        把206.0.71.0/25派给C系
        把206.0.71.128/25派给D系
      • 至此地址已经分配完,当然各系部还可以继续从拿到的地址块再继续细分。
  • 计算方式

    就拿A系来说明下,A系拿到了206.0.68.0/23,这个地址块,那么

    • 计算最小地址把主机号都置为0:206.0.68.0/23 = 206.0.0100 0100.0000 0000/23
    • 计算最大地址把主机号都置为1:206.0.69.255/23 = 206.0.0100 0101.1111 1111/23
    • 拥有的地址数是,2的9次方,2 9 ^{9} 9=512,其中9是主机号。
  • 注意

     网络号与子网号是相对的,网络号与子网号的区别在于应用的场景,例如以上例子,机构拿到的206.0.64.0/18,这个18相当于网络号,在借用4位主机位,这是子网号,学校拿到了206.0.68.0/22这个子网,对于学校来说,这个22相当于网络号,再对其划分子网。

四. IPV6

为什么要使用IPV6呢,因为IPV4地址资源有限,几乎快饱满了,为了解决这类问题,提出IPV6协议。

  • 结构
    未来要普及的结构, 全长有128位,由八个字段组成,1个字段包含4个16位进制数。
    • 优先选用的结构为:X:X:X:X:X:X:X:X ,例如地址FF01:0:0:0:0:0:0:101
      可以把中间连续为0的符号简化为"::",形如 FF01::101
      对于IPV6,每一组数值前面的 0 可以省略。如 0008 写成 8
    • IPV6向下兼容IPV4,采用另一种表达方式,即 X:X:X:X:X:X:D.D.D.D,其中 X 是地址中 6 个高阶 16 位段的十六进制值, D 是地址中 4 个低阶 8 位字段的十进制值(按照 IPv4 标准表示)
      例如, 0:0:0:0:0:FFFF:202.201.32.30 嵌入 IPv4 地址的 IPv6 地址。
      依据IPV6的简写,可以简化为 ::FFFF.202.201.32.30
    • 划分机制
      可以说IPv6是IPv4的进阶,IPv4 子网划分同样适用IPv6,向下兼容。

五. IP协议

  IP(Internet Protocol)协议的英文名直译就是:因特网协议,简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP协议就可以与因特网互连互通。

  • 结构

    在这里插入图片描述

    • 版本号:4位(bit),如果是IPv4 则为0100,或者IPv6则为0110

    • 头部长度: 4位(bit),标识IP头部长度
      * 服务类型: 8位,结构如下
      在这里插入图片描述

    • 3位(0-2)的优先级字段和4位(3-6)的TOS字段,第8位代表保留字段,优先级的取值范围是0-8,当3-6的字段都为1时,代表低延迟,高吞吐,高可靠

    • 总长度:16位,指数据报的整体长度,包括IP协议头,通过总长度减去IP协议头长度可以获得数据部分长度,最大容纳65535字节(排除0字节)。

    • 标识,16位,因为为了符合以太网MTU传送大小,会对IP数据包进行切片,这个标识用来识别哪些分片属于同个IP数据包的。

    • 标志,3位,用来指示数据是否分片。
      在这里插入图片描述
      图中三位比特对应的代名词,第一位暂时不适用,第二位是DF,第三位是MF,当MF为0时,表示是最后一个分片。

    • 片偏移,13位,在接收方进行数据报重组时用来标识分片的顺序。用于指明分段起始点相对于报头起始点的偏移量,重组数据包,8个字节一个单位,2 13 ^{13} 13=8192,共有8192, 8192乘以8 =65536个字节,排除0字节,共有65535个字节。

    • 生存时间,8位,范围0~256,用于限制数据包可经过的路由器数量上限,每经过一个路由器,这个是数就减一,当为0时,该数据报生命周期结束,并发送给发送方一个ICMP发送失败消息。

    • 协议,8位,用来标识是哪个协议向IP传送数据。ICMP为1,IGMP为2,TCP为6,UDP为17,GRE为47,ESP为50。

    • 头部校验和,16位,仅计算”IPv4首部,只校验首部,并不检测数据部分。通过把首部转化为一系列16位二进制反码,不足16位补零,高位左移一位并加1,把它们合起来取反码,就是校验和,放入该字段,接收端用同样的方法计算,与记录的校验和比较,有错误,则认为数据包出问题了。

    • 源地址指发送端的IP地址。

    • 目标IP地址指接收端的IP地址。

    • 选项与填充这两个选项较少使用,只有某些特殊的封包需要特定的控制才会利用到。共32位,记录路径,时间戳,安全和处理限制等。这个字段会影响IP头部长度,默认为20个字节。

    • 数据部分,上一层交接的数据,TCP数据包,后者UDP数据。

六. IP数据分片

  • 概要
     IP协议理论上允许的最大IP数据报为65535(减去0)字节(16位来表示包总长)。但是因为协议栈网络层下面的数据链路层一般允许的帧长远远小于这个值,例如以太网的MTU(即Maximum Transmission Unit,最大传输单元)通常在1500字节左右。所以较大的IP数据包会被分片传递给数据链路层发送,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个完整的IP数据报,再提交给上层协议处理。
  • 分片与重组
     一个以太帧最大为1518字节 ,包含14个字节以太网首部还有CRC校验4个字节,20个字节IP首部,还有CRC校验4个字节,1518-14-20-4 =1480,IP数据部分最大等于1480字节,如果超过这个1500字节(包括IP头),例如发送3048个字节,超过1500字节的最大限制(MTU限制),那么这时就需要IP分片,分批进行传输。
    • 过程

      在这里插入图片描述
      在这里插入图片描述

    • 当大小为3008字节的数据报到达IP层时,检测数据是否要被分片,大于IP数据部分大小1480(1500-20)被分成3片,大小分为A = 1480,B=1480,C=48。

    • 每个分片打上ID标识符,用来识别是那个一个数据报的,方便重组,每发送一个数据报时会加1,到最大值后,会重置。

    • 标志第一位为0表示保留,第二位DF为0表示有分段 ,第三位是MF根据分片是否是最有一片决定,0为最后一个分片,1表示还有分片未收到。

    • 计算偏移量,8个字节为一个单位,那么,A片的偏移量为0/8 =0; B片的偏移量为1480/8=175;C片的偏移量为2960/8 = 370;

    • 每个分片加上IP数据头 ,大小分为,A = 1500, B = 1500, C = 68.

    • 经过数据链路层,以太网协议封装,加上帧头还有CRC校验(共18字节),那么A =1518,B = 1518 ,C = 86 (如果小于最小传送单位64,会填补0保证数据可以发送)

    • ABC每个IP数据包通过物理链路发送到接收端主机,接收端接收后,会首先查看第三位MF的标识符,如果为1,那么还有报文没收到,接收主机则将数据报放入缓存中,等待收到所有的数据报后(第三位MF为0)时重组数据,而且同时根据标识ID,开始缓存计时,如果超时还没收到其他分片,那么数据报会被认为丢失了。

    • 当数据分片陆续被收到,例如BAC,首先检查标志,然后会判断标识ID属于哪个数据报的缓存,B的偏移量会被取出来计算,175x8 = 1480,1480是B的偏移开始位置,把B放入缓存中,A同样的步骤放入0的位置,C放入2960 位置,而且C的MF为0,则这个报接收结束,开始重组,判断缓存还有没有空余,没有,则没有丢失分片,开始重组上交给上一层。

    • 总结

        IP分片依赖于MTU(1500字节)传送单元,注意在分片的时候,不是以整个IP数据报大小切分的,是根据IP数据部分大小对上一层下来的数据进行分割,再加上头部信息,达到1500字节。
        IP报文分片后需要进行重组,且只能在目标主机进行重组。分片重组时,采用了一缓存计时器,分片重组的控制主要通过数据首部中标识、标志、偏移字段进行重组。

  • 避免分片
    • 分片重传问题
       如果某个分片报文在网络传输过程中丢失,那么接收方将无法完成重组,如果应用进程要求重传的话,只能依赖上一层(TCP层,应用层等拥有重传机制)进行重传所有分片报文而不是仅重传被丢弃的那个分片报文,这种效率低下的重传行为会给端系统和网络资源带来额外的消耗。
    • 分片带来内存消耗
       分片对接收方内存资源的消耗较多,因为接收方要为接收到的每个分片报文分配内存空间用来缓存,以便于最后一个分片报文到达后完成重组。
    • 分片攻击
       黑客发送分片,这个分片不是最后一个分片,接收方收到后会开辟一个分配内存空间对齐进行缓存,同时开启一个缓存计时器,超时后会自动释放,但如果分片数量多,而且标识符不同,那么会分配很多内存空间,很容易让内存被占满,让接收方无法正确处理正常的信息。
       有些路由器或设备会做一些安全机制,来预防这类情况发生。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨守星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值