IPV4

  • TCP/IP协议栈:ARP为IP提供服务,IP为ICMP、IGMP提供服务

一、IPv4 分组

  • IP数据报格式
    • 分为首部和数据部分,如下图
    • 下面就IP数据报首部详细说明
        1. 版本:占4bit,表明数据报是IPv4还是IPv6
        1. 首部长度:占4bit,单位是4B,因为固定部分长度为20B,所以首部长度最小值是5(没有可变部分),即0101,最大值为1111,那么说明最大首部长度为15*4=60B,固定部分占20B,说明可变部分最多为40B
        1. 区分服务:占8bit,指期望获得哪种类型的服务,如要求当前的数据报设置高优先级优先发送,一般情况下不使用该字段
        1. 总长度:占16bit,即首部+数据部分长度,单位是1B,可以表示的最大值为B
        1. 标识、标志、片偏移:与IP数据报分片有关
        • 标识:占16bit,同一数据报的分片使用同一标识
        • 标志:占3bit,只有后两位才有意义
          • 中间位DF(Don't Fragment),DF=1,禁止分片,DF=0,允许分片
          • 最低位MF(More Fragment),MF=1,后面“还有分片”,MF=0,代表最后一片(已经没有分片了)
        • 片偏移:指出较长分组分片后,某片在原分组中的相对位置。以8B为单位,除了最后一个分片,每个分片的长度一定是8B的整数倍
        1. 生存时间(TTL-Time To Live ):占8bit,IP分组的保质期。经过一个路由器-1,变成0则丢弃
        1. 协议:占8bit,数据部分使用的协议,常用的TCP的字段值是6(记:面向连接的服务非常6),UDP的字段值是17(记:不面向连接数据容易被遗弃即17)
        1. 首部检验和:只检验首部是否出错
        1. 源地址、目的地址:源IP地址和目的IP地址均为32bit
        1. 可选字段:0~40B,用来支持排错测量以及安全等措施
        1. 填充:全0,把首部填充成4B的整数倍,因为首部长度字段的单位就是4B
  • IP数据报分片例题

二、IPv4 地址与 NAT

IPv4地址

    1. IP地址:全世界唯一的32位/4字节标识符,标识路由器或主机的接口(一个路由器或主机有多个接口)
    1. 互联网中的IP地址 其中红色区域的为局域网LAN,其中前24位为网络号,后8位为主机号,同一个局域网的主机网络号要相同。其中绿色区域为无编号网络,路由器的每个端口都有一个不同的网络号的IP地址,所以说路由器可以分割广播域
    1. 分类的IP地址 通过前几位(类别为)对网络进行分类
    1. 特殊IP地址
    • 上图中网络号主机号全0,本网范围内表示主机(如果一台主机发送数据报或分组的时候不清楚自己的IP地址,则填全0)
    • 127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。
    1. 私有IP地址
    1. 最大可用网络/主机数
    • A类中网络号全0为本网络,全1为环回地址需要减2。主机号全0表示为本主机(网络号也要全0)或一个网络地址(网络号为特定值),全1为广播地址,需要减2
    • B类与C类没有A类中的环回地址,其他同A类一样

NAT

    1. 前景:路由器对目的地址是私有IP地址的数据报一律不进行转发,那么私有IP地址的主机是如何与因特网上的主机进行通信的呢?
    1. 网络地址转换NAT(Network Address Translation):在专用网连接到因特网的路由器上安装NAT软件,安装了NAT软件的路由器叫NAT路由器,它至少有一个外部全球的IP地址

如上图,当专用网的主机与因特网主机通信时,需要用NAT路由器提供的伪装的IP地址和端口号

三、子网划分、路由聚集、子网掩码与 CIDR

子网划分

    1. 前景:分类的IP地址的弱点
    • ①.IP地址空间的利用率有时很低(主机号的位数过多用不完)
    • ②.两级IP地址不够灵活(一个单位想要增加新的网络时要联系ISP(互联网服务提供商-Internet Service Provider)申请IP地址,过程太繁琐)
    1. 子网划分 其中主机号至少为2位,因为只有一位的话只能是0或1,均是特殊的IP地址 如上图,某单位的网络号为145.13.0.0,所有从外部过来的目的IP地址为145.13.x.x的分组只知道要要传给该路由器,但不知道要如何传给路由器内的哪个子网,子网内的哪个主机,这就需要用到子网掩码了

子网掩码

  • 从外部传输到目的路由器的分组需要找到目的子网的网络地址,需要通过分组携带的三级目的IP地址与三级IP地址的子网掩码相与,如上图
  • 使用子网时分组的转发
    • 路由转发分组的算法:
        1. 提取分组的目的IP地址
        1. 是否直接交付(是否可以直接给路由器所连的一个子网)
        1. 特定主机路由(路由表中有IP地址与目的地址一样的下一跳路由,那么按照路由表那行所要求的步骤进行)
        1. 检测路由表中有无路径(将目的地址与路由表每一行地址的子网掩码相与,看是否有相匹配的目的网络)
        1. 默认路由0.0.0.0(前面均无效则将分组给默认路由,默认路由会将分组发给另一个路由器,再循环上面的步骤)
        1. 到TTL,丢弃,报告转发分组出错

CIDR

    1. 无分类编址/无分类域间路由选择CIDR(Classless Inter-Domain Routing,读音“sider”),其特点有
    • ①:消除了传统的A类,B类和C类地址以及划分子网的概念 CIDR记法:IP地址后加上“/”,然后写上网络前缀(可以任意长度)的位数。 e.g. 128.14.32.0/20
    • ②:融合子网地址与子网掩码,方便子网划分。
      • CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”
    • ③例:地址192.199.170.82/27的一些问题
      • 该地址块包括多少IP地址:
      • 该地址块的最小地址:令后5位(主机号)为全0,最大地址:令后5位为全1
      • 该地址所在的CIDR地址块:令后5位的主机号全0即为该网络(该CIDR地址块)
      • 该地址所在的CIDR地址块的子网掩码/地址掩码:令前27位(网络前缀)为1,后5位为0
    1. 最长前缀匹配
    • 使用CIDR时,查找路由表可能得到几个匹配结果(跟网络掩码按位相与),应选择具有最长网络前缀的路由。前缀越长,地址块越小,路由越具体

路由聚集

    1. 概念:将多个子网聚合成一个较大的子网,叫做构成超网,或路由聚合/集,旨在缩小路由器中路由选择表的规模,以节省内存,并缩短IP对路由选择表进行分析以找出前往远程网络的路径所需的时间
    1. 方法:将网络前缀缩短(所有网络地址取交集),下面用一个图例来解释

如上图,有两个相连的路由器R1,R2,R2有多个端口,其中两个端口一个连着网络1,一个连着网络2。R1路由器的路由表有两项,分别表示要到目的网络(网络1,网络2)都要从接口a走。那么就可以将这两项走相同接口a的目的网络前缀缩短,即网络1+2的合体,即是路由聚合,聚合后目的网络地址为206.1.0.1/16

四、ARP 协议、DHCP 协议与 ICMP 协议

APR协议

    1. 前景:由于在实际网络的链路上传送数据时,最终必须使用MAC地址,因此要用ARP协议
    1. ARP协议(Address Resolution Protocol地址解析协议):完成主机或路由器IP地址到MAC地址的映射(即解决下一跳走哪的问题)
    1. ARP协议的使用过程:检查ARP高速缓存(每个局域网都有一个ARP高速缓存),有对应表项则写入MAC帧,没有则用目的MAC地址为FF-FF-FF-FF-FF-FF的帧封装并广播ARP请求分组同一局域网中所有主机都能收到请求。目的主机收到请求后就会向源主机单播一个ARP响应分组,源主机收到后将此映射写入ARP缓存(10-20min更新一次)
    1. ARP协议4种典型情况:
    • ①.主机A发给本网络上的主机B:用ARP找到主机B的硬件地址(MAC地址)
    • ②.主机A发给另一网络上的主机B:用APR找到本网络上一个路由器(网关)的硬件地址
    • ③.路由器发给本网络的主机A:用ARP找到主机A的硬件地址
    • ④.路由器发给另一网络的主机B:用ARP找到本网络上的一个路由器的硬件地址 下面以一个图例来解释清楚ARP协议的工作流程 如上图:两个路由器分隔成三个局域网。对于每一个主机或每一个路由器,都会有一个ARP高速缓存(类似自己的一个仓库,里面有IP地址与MAC地址映射),所有的ARP高速缓存存储的表项都是一个局域网内部的。
    1. 主机1要向主机3发送一个pdf文件,如下图。传输层根据应用层文件\报文数据大小决定是否分段,图中分为3个报文段。只考虑第一个报文段,网络层中,将1号报文段进行封装,加上源主机IP地址IP1,和目的主机IP地址IP3(由传输层的DNS协议得到),封装后叫做IP数据报,IP数据报分片后叫分组(根据链路层的传输协议--最大传输单元MTU来决定是否要在网络层分片),假设不分片。 到链路层封装即加上MAC地址,要加上源MAC地址MAC1,因为主机1和主机3在一个局域网内,所以要加上目的MAC地址直接加上MAC3即可,分为下面2种情况:
    • 主机1的ARP高速缓存中有3号主机的IP3地址与MA3C地址映射,那么继续封装填入MAC3然后放入物理层传输即可,如下图
    • 主机1的ARP高速缓存中没有3号主机的IP3地址与MAC3地址映射,那么就要用ARP协议了
      • 主机1发送一个数据帧--广播ARP请求分组,主机3收到后返回一个单播ARP响应分组(映射),如下图
      • 主机1将该映射写入自己的ARP高速缓存并填上得到的MAC3继续传输
    1. 主机1要向主机5发送文件,类似的数据封装如下

下面就是要得到MAC5的步骤了

  • ①主机1先用目的IP地址IP5与自己的子网掩码相与,发现主机5并不在自己的局域网内,那么查询主机1默认网关(该局域网与路由器的接口,只有主机和路由器接口有MAC地址,交换机没有)的MAC地址即MAC6,因此主机1填的目的MAC地址应该是下一跳MAC6,获取MAC6的方法即用一次ARP协议,如下图
  • ②数据传送到路由器MAC6时,需要对数据自下而上进行解封装,解封装到网络层为止,因为路由器是一个3层设备。解封装到网络层后再对数据自下而上进行封装,源MAC地址和目的MAC地址分别变为MAC7和MAC8(使用ARP协议获取MAC8),如下
  • ③数据传输到路由器MAC8时同样进行解封装和再封装,封装后源MAC地址和目的MAC地址分别为MAC9和MAC5(使用ARP协议获取MAC5),如下

DHCP协议

主机获取IP地址的办法

    1. 静态配置(如机房电脑):需要给主机配置
    • IP地址
    • 子网掩码
    • 默认网关(某局域网与外界交流的关口,即局域网连接的那个路由器的接口)
    1. 动态配置:即DHCP协议,需要用到DHCP服务器
  • DHCP协议:动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是应用层协议,使用客户/服务器方式,客服端和服务端通过广播方式进行交互,基于UDP(User Datagram Protocol用户数据报协议)。DHCP提供即插即用(主机或设备进入了DHCP服务器管辖的局域网内,就可以动态的分配到一个地址),主机可以从服务器动态获取IP地址、子网掩码、默认网关、DNS服务器名称与IP地址,允许地址重用(每个DHCP都有一个地址池,一个地址池有多个IP地址,一个主机进入后分配一个IP地址,离开后可以把刚刚的IP地址分配给后面来的主机),支持移动用户加入网络,支持在用地址续租(DHCP服务器分配地址有多种方式,其中最常用的一种是有时间性的,过了租用期后主机可以重新请求一个IP地址或者续租)

  • DHCP工作流程

      1. 主机广播DHCP发现报文:试图找到网络中的服务器,服务器获得一个IP地址(在地址池中为主机找到一个可用的IP地址)
      1. DHCP服务器广播DHCP提供报文:服务器拟分配给主机一个IP地址及相关配置,先到先得(主机用最先到的IP地址)
      1. 主机广播DHCP请求报文:主机向服务器请求提供IP地址,同时拒绝其他DHCP服务器的IP地址
      1. DHCP服务器广播DHCP确认报文:正式将IP地址分配给主机

ICMP协议

    1. ICMP协议(Internet Control Message Protocol网际控制报文协议)支持主机或路由器:作用有
    • 差错报告:发送ICMP差错报文
    • 网络探询:发送ICMP询问报文
    1. ICMP报文格式 ICMP报文是IP数据报中的数据部分,是网络层的协议
    • 其中第一行4B分别为类型(区分ICMP报文是哪类)、代码(进一步区分某种类型不同情况)、检验和(检验整个ICMP报文),所有ICMP报文的第一行(前4字节)都是一样的
    • 第二行4字节取决于ICMP报文的类型
    • 第三行为ICMp的数据部分:由收到的IP数据报(出现差错的那个数据报)的首部和IP数据报的数据字段的前8个字节组成,如下图
    1. ICMP差错报告报文的5种类型
    • 终点不可达(无法交付):当路由器或主机不能交付数据报时就向源点发送终点不可达报文
    • 源点抑制(拥塞丢数据):当路由器或主机由于拥塞而丢弃数据报时,就向源点 发送源点抑制报文,使源点知道应当把数据报的发送速率放慢(该报文现在基本不用了)
    • 时间超过:当路由器收到生存时间TTL=0的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先的时间内不能收到一个数据报的全部数据片时,就把已经收到的数据报片都丢弃,并向源点发送时间超过报文
    • 参数问题(首部字段有问题):当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文
    • 改变路由/重定向(值得更好的路由):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
    1. 不应发送ICMP差错报告报文的情况
    • ①对ICMP差错报告报文不再发送ICMP差错报告报文(不会对ICMP的差错进行差错报告)
    • ②对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文(只对第一个数据报片发送ICMP差错报告报文)
    • ③对具有组播地址的数据报都不发送ICMP差错报告报文
    • ④对具有特殊地址(如环回地址127.0.0.1或0.0.0.0)的数据报不发送ICMP差错报告报文
    1. ICMP询问报文
    • 回送请求报文和回送回答报文(两个报文搭配使用):主机或路由器向特定目的主机发出回送请求报文,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文(测试目的站是否可达以及了解其相关状态,如ping)
    • 时间戳-请求和回答报文:请某个主机或路由器回答当前的日期和时间(用来进行时钟同步和测量时间)
    • 掩码-请求和回答报文(不再使用)
    • 路由器-询问和通告报文(不再使用)
    1. ICMP的应用
    • PING:测试两个主机的连通性,使用了ICMP回送请求和回答报文(ICMP询问报文)
    • Traceroute:跟踪一个分组从源点到终点的路径,使用了ICMP时间超过差错报告报文(ICMP差错报告报文) Traceroute工作原理
      Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器...... traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢? Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。

本文章使用limfx的vscode插件快速发布