网络层

0x00 功能

  • 异构网络互连

    异构网络指的是数据链路层和物理层均不同的网络

  • 路由(选择)和(分组)转发

  • 拥塞控制

    • 判断拥塞:网络负载增加,网络吞吐量明显小于正常吞吐量,或下降就可能进入了拥塞状态,下降为0,则进入死锁状态

    有如下2种方法

    • 开环控制:静态预防,力求不产生拥塞

    • 闭环控制:采用监测网络去监测,基于反馈环路,是一种动态的方法

流量控制是点对点之间对通信量的控制,拥塞控制是为了确保通信子网能够传送待发送的数据

网络层的主要目的是在任意结点之间进行数据报传输(不一定是可靠的哦)

0x01 路由算法

路由算法可以分为:

  • 静态路由算法:又称非自适应路由算法,人工手动配置路由表

  • 动态路由算法:又称自适应路由算法,相互连接的路由器彼此交换信息

动态路由算法又可以分为:

  • 距离-向量路由算法:所有结点定期(每隔30秒)以广播的形式将整个路由表传给相邻的结点,同时如果一个路由在180s内未被更新则将相应的距离设置为无穷大(即16)并从路由表中删除该项,最常见的距离向量算法是RIP算法 路由表包含:

    • 路径目的地

    • 路径代价:即跳数,每经过一个路由器跳数+1,直连跳数为1,当代价数为16时表示当前结点不可达

    更新路由表的时机:

    • 被告知一条新的路由,且该路由在本节点的路由表中不存在

    • 有一个可以以更小的代价抵达某一结点的路由信息

    显然更新报文的大小和通信子网的结点数成正比,而且所有结点都会参加路由信息交换,通信子网上传递的路由选择信息数量容易变得很大,且此方法有可能遇到路由环路的问题,且RIP只适用于小型互联网,RIP使用UDP传输数据,且RIP是应用层协议,其选择的路径不一定是时间最短的,但一定具有最短的路由路径,RIP最大的优点是实现简单,开销少,收敛过程块,有如下缺点:

    • 限制了网络规模:最大距离为15

    • 路由器之间交换的是完整的路由表,所以网络规模越大,开销越大

  • 链路状态路由算法:每个参与算法的结点都有完全的网络拓扑信息,典型的链路状态算法是OSPF算法,链路状态路由算法使用Dijkstra算法寻求最短路径,其有如下3个基本特征:

    • 采用泛洪法本自治系统中所有结点发送信息,泛洪法就是所有路由器向相邻结点发送信息,然后这些相邻结点又向他们的相邻结点接着发送

    • 发送的信息是与路由器相连的所有路由器的链路状态,链路状态指的是链路状态的度量,即为费用、距离、时延、宽带等信息

    • 只有当链路状态发生变化时,路由器才向所有路由器发送消息

    OSPF有如下5种分组类型:

    • 问候分组:用来发现维持邻站的可达性,通常每隔10s每两个相邻路由器要交换一次问候分组,以便知道哪些站可达

    • 数据库描述分组:向邻站给出自己的链路状态数据库中所有的链路状态项目的摘要信息

    • 链路状态请求分组

    • 链路状态更新分组:泛洪法发送对全网更新链路状态

    • 链路状态确认分组

    其有如下几个优点:

    • 链路状态报文不加以改变地传输

    • 易于查找故障

    • 每个路由结点使用同样的原始状态信息独立地计算路径,不依赖中间结点

    • 当同一目的网络有相同代价的路径时,OSPF可依据通信量分配给这几条路径,以实现负载均衡

    • 支持CIDR和可变长度的子网划分

    • OSPF没有“坏消息传的慢”的问题

    通过划分区域可以使OSPF适用于规模较大的自治系统,使得采用泛洪法交换信息的OSPF算法可以使每一个区域内部交换路由信息的通信量大大减少,这同样会使OSPF协议变得复杂。在一个区域内部的路由器只知道本区域的网络拓扑而不知道其他区域的网络拓扑,这样在自治系统内部有如下4种路由器:

    • 区域内部路由器

    • 主干路由器:在主干区域的路由器

    • 区域边界路由器:用于连接主干区域和其他下层区域(连接各个域之间)

    • 自治域边界路由器

    主干区域路由器指的是只要在主干区域的路由器都算主干路由器,区域边界路由器也连接了主干区域,所以主干区域路由器也可以做区域边界路由器

两种动态路由算法的比较:

交谈对象

告知内容

距离-向量

直接相邻结点

从自己到其他所有结点的最低代价

链路状态

广播的方式与其他所有结点

与它直接相连的链路的代价

层次路由:将互联网划分为许多小的自治系统(每个自治系统包含很多局域网),每个自治系统有权决定内部的路由选择协议(内部网关协议IGP),自治系统之间使用外部网关协议(EGP)

IGP有RIP和OSPF两种协议,EGP有BGP协议

路由器的交付:

  • 直接交付:直接给当前路由器所连主机

  • 间接交付:还需要跳跃路由器

判断是直接交付还是间接交付:将分组的源IP地址目的IP地址分别与子网掩码进行与操作,如果得到的子网地址相同,则使用直接交付,否则使用间接交付

此处的分组的源IP地址也就是路由器接收端口的IP地址

路由收敛指网络的拓扑结构发生变化后,路由表重新建立到发送再到学习直至稳定,并通告网络中所有相关路由器都得知该变化的过程。也就是网络拓扑变化引起的通过重新计算路由而发现替代路由的行为。收敛有一个现象就是“好消息传得快,坏消息传得慢”,这就导致了当路由信息发生变化时,该变化未能及时地被所有路由器知道,且仍然可能在路由器之间进行传递,这就是慢收敛慢收敛是导致路由回路的根本原因

自治系统是在单一技术管理下的一组路由器一个自治系统内的所有路由器在本自治系统内必须都是连通的。自治系统内部使用IGP内部网关协议(例如RIP协议和OSPF协议),自治系统之间使用EGP外部网关协议(例如BGP-4协议)

这里说一下用于自治系统之间的外部网关协议BGP:

BGP采用路径向量路由选择协议,BGP协议属应用层协议,基于TCP

几种路由协议的比较:

协议

RIP

OSPF

BGP

应用层

网络层

应用层

发送

UDP(520端口)

直接使用IP数据报

TCP

更新时间

每隔30s固定

当链路状态发生变化

每隔30s固定

CIDR

不支持

支持

支持

交换结点

本结点的相邻结点

网络中所有路由器

本结点的相邻结点

交换内容

自己全部的路由表

相邻路由器链路状态

首次和非首次

路径选择

跳数最少

代价最低

较好,非最佳

算法

距离-向量

链路状态

路径-向量

BGP协议首次交换的为整个路由表,非首次为有变化的部分。其交换的网络可达性信息是到达某个网络所经过的路径(自治系统序列)。

0x02 IPv4

一个IP分组分为首部和数据两部分,IP首部的重要字段如下:

  • 首部长度:占4位,首部的固定部分长度为20B以4B为基本单位,算上首部的可选字段长度(可变)首部长度的最大值为60B

  • 占16位

  • 占3位,MF=1表示后面还有分片,MF=0表示这是最后一个分片,DF=0是允许分片

  • 总长度:占16位,故数据报的最大长度为65535B,总长度的基本单位为1B

    数据报的总长度(包含首部和数据部分)不能超过数据链路层的MTU(最大传送单元)的大小,比如以太网的MTU为1500字节,则一个IP数据报封装成帧之后的大小就比如小于等于1500字节,数据部分多的就只能分片

  • 片偏移:占13位,较长的分组在分片后,某片在原分组中的相对位置以8B为偏移单位,也就是每个分片的长度也一定是8B的整数倍

  • 首部检验和:占16位,只检验首部而不检验数据

  • 协议:占8位,IP数据报中的协议字段指的是上层协议,也就是分组所携带数据是使用的何种协议,例如值6代表TCP,值17代表UDP

分片:

  • 片在目的地的网络层被重新组装

  • 当收到一批分片时,通过标识号来确定哪些分片是属于一个IP数据报

  • 使用片偏移字段来确定该分片在原始数据报中的位置

网络层的分组转发:

  • 提取目的地址D,与子网掩码进行与运算得出目的网络地址N

  • 如果网络N与此路由器直连,那么把数据报直接交付给目的主机

  • 如果有目的地址为D的特定主机路由,则把数据报传给下一路由器

  • 否则传给路由表中指明的默认路由器

IP地址:

  • 主机号全为0代表本网络,全为1代表广播地址

  • 127.0.0.0的网络是环回自检地址

  • 0.0.0.0代表本网络上的本主机

  • 255.255.255.255代表整个TCP/IP网络的广播地址,因路由器会隔离广播域,所以其等效为本网络的广播地址

  • IP地址管理单位只分配网络号,主机号由本单位自行分配

0x03 ICMP

ICMP协议是IP层协议,其报文分为两种:

  • ICMP差错报告报文:用于目标主机或路由器向源主机报告差错和异常情况,共有如下5种类型:

    • 终点不可达:路由器和主机不能交付数据报

    • 源点抑制:路由器和主机由于拥塞而丢弃数据报

    • 时间超时:路由器收到TTL为0的数据报

    • 改变路由(重定向):让主机知道下次就别发给他了,有更好的路由

    不发送ICMP差错报文的几种情况

    • 对ICMP差错报文不发送ICMP差错报文

    • 对第一个分片的数据报片的所有后续数据报片不发送ICMP差错报文

    • 具有组播地址的数据报不发送ICMP差错报文

    • 特殊地址(如127.0.0.0或0.0.0.0)不发送ICMP差错报文

  • ICMP询问报文

    • 回送请求和回答报文

    • 时间戳请求和回答报文

    • 掩码地址请求和回答报文

    • 路由器询问和通告报文

ping工作在应用层直接使用网络层的ICMP协议的回送请求和回答报文,traceroute工作在网络层,使用的ICMP协议的超时报文

0x04 ARP和DHCP

IP地址是网络层使用的地址,由于路由器的隔离,IP网络中无法依靠MAC地址来完成跨网络的寻址,因此在网络层只能使用IP地址来完成寻址。路由器由于互联多个网络,因此他不仅有多个IP地址,同时也有多个硬件地址

ARP协议完成从IP到MAC地址的映射,其工作在网络层,ARP会通过查询ARP高速缓存来确定有无目的主机的MAC地址,如果没有,使用目的MAC地址为FF-FF-FF-FF-FF-FF的帧封装并广播ARP请求分组。ARP的响应分组为单播

DHCP用于动态分配IP地址,DHCP是基于UDP的应用层协议

0x05 IPv6

解决IP耗尽的问题有三种办法:

  • 使用IPv6:从根本上解决

  • 使用无类别编址CIDR:使IP分配更加合理

  • 使用NAT技术:节省IP地址

IPv6有128位的地址位,只有在包的源结点才能进行分片,是端到端的,传输路径中的路由器不能分片(路由器碰到较大的IPv6数据报不能直接转发到链路上时,选择直接丢弃分组,并发送一个指示分组过大的ICMP报文)。IPv6的首部长度以8B为基本单位。相对于IPv4还增加了安全性身份验证保密功能,同时相对于IPv4减少了头部字段,为了效率IPv6没有头部校验和字段(因为数据链路层和传输层都有自己的校验,所以在这一层出现差错的几率较低)。

IPv6的地址中,可以使用"::"双冒号表示法来省略其中不定位数的一些0,但是双冒号表示法只能使用一次

IPv4向IPv6的过渡可以使用双协议栈隧道技术

0x06 移动IP

移动IP指的是移动结点以固定的IP地址实现跨不同网段的漫游功能。使用移动IP一个结点可以在不改变其IP地址的情况下改变其驻留位置。当一个主机移动到了另一个LAN中,如果一个分组到达了它原来所在的LAN中,分组会被转发给移动IP的本地代理,此时其既不可以直接接收分组也不可以直接发送分组,需要通过转交地址来间接接收和发送分组。

0x07 计算

0x00 最长前缀匹配原则

选择下一跳路由器的时候,使用最长前缀匹配原则:

例如某分组的目的地址为132.19.237.5,路由表如下:

目的地址

下一跳

132.0.0.0/8

R1

132.19.0.0/11

R2

132.19.232.0/22

R3

0.0.0.0/0

R4

我们来对比目的地址与路由表中的目的地址的二进制:

132.19.237.5 1000 0100 0001 0011 ‭1110 1101‬ 0000 ‭0101‬
132.19.0.0/8 1000 0100 0000 0000 0000 0000 0000 0000 <- 8
132.19.0.0/11 1000 0100 ‭0001 0011‬ 0000 0000 0000 0000 <- 11
132.19.232.0/22 1000 0100 ‭0001 0011‬ ‭1110 1000‬ 0000 0000 <- 21
0.0.0.0/0 0000 0000 0000 0000 0000 0000 0000 0000 <- 0

我们发现,132.19.232.0/22的二进制的前21位都是与132.19.237.5的二进制序列是一样的,而且是最长匹配,注意这里的最长匹配前缀要在子网掩码的覆盖范围之内,也就是主机号最长匹配的位数

0x01 给定IP判断是否属于某一子网

现给定IP,86.33.224.123以及86.79.65.126判断二者是否属于子网86.32.0.0/12:

对于子网86.32.0.0/12我们先来获取其主机号,对于两个给定的IP其二进制的前8位都是一样的(86),所以我们只需判断中间几位:对于子网号86.32.0.0/12中间的8位为‭0010 0000‬,前四位即主机号的部分即为0010

求得86.33.224.123的中间八位为0010 0001,作为主机号的前四位为0010,与给定子网号相同,故86.33.224.123属于子网86.32.0.0/12

求得86.79.65.126的中间八位为‭0100 1111‬,作为主机号的前四位为0100与目的子网0010不匹配,所以86.79.65.126不属于子网86.32.0.0/12

0x02 单播 组播 广播 任播

单播就是一对一发送,目标地址仅对应一台主机

组播又称为多播,顾名思义,组播可以让源主机将分组发送给一组设备,组播地址范围为224.0.0.0~239.255.255.255,组播设备是一组设备,因此组播地址只能用于目的地址,源地址通常为单播地址。组播IP地址也需要相应的组播MAC地址在本地网络中实际传送帧。组播MAC地址以十六进制值01-00-5E打头,余下的6个十六进制位是根据IP组播组地址的最后23位转换得到的,组播一定仅适用于UDP,因此组播也是尽最大可能交付,不提供可靠交付,且对组播数据报不产生ICMP差错报文,因此ping一个组播地址永远不会收到响应,路由器的组播路由选择协议采用IGMP协议,其为TCP/IP的一部分

组播IP和MAC地址的转换:

IP224.215.145.230MAC22421521101 011100101 01110101 0111165721452301691E601-00-5E01-00-5E-57-91-E6假设给定\text{IP}地址224.215.145.230将其转换为组播\text{MAC}地址 \\ 首先不管第一组数224 \\ 将215转化为2进制为1101~0111,将其第一位改为0得0101~0111 \\ 将0101~0111转化为16进制为57 \\ 将后2组数据145和230分别转化为16进制得到91和\text{E6} \\ 在前面加上通用的头部\text{01-00-5E} \\ 得到结果\text{01-00-5E-57-91-E6}

由此可见,32个组播地址可映射成一个MAC地址,所以两个不同的IP地址转换成的组播MAC地址可能是相同的

10进制转换成16进制可以使用类似于10进制转换成2进制的短除法,只不过10进制转换成16进制短除的余数是从上往下写的,而10进制转换为2进制短除的余数是从下往上写的

2进制转换为16进制,可直接4个一组分,然后转换拼接

如二进制0101 0111转换为16进制:

0101->5,0111->7,转换的16进制结果即为57

广播分组的目标IP地址的主机号全为1,这意味着本地网络(广播域)中的所有主机都将接收并查看该分组,不要以为广播地址末尾就一定是255,你看这个192.168.24.59/30这也是一个广播地址哦!

IPv6下多了一种任播:目的站是一组计算机,但数据报在交付时只交付其中的一个,往往是距离最近的一个

0x03 ABC类IP地址

IP地址范围

私有IP地址范围

子网掩码

A

0.0.0.0-127.255.255.255

10.0.0.0-10.255.255.255

255.0.0.0

B

128.0.0.0-191.255.255.255

172.16.0.0-172.31.255.255

255.255.0.0

C

192.0.0.0-223.255.255.255

192.168.0.0-192.168.255.255

255.255.255.0

可以这样记忆地址范围,A类是从0-127,B类是在127的基础上加了64,C类是在B类末尾的基础上加了32

要注意不一类IP地址有不一样的默认子网掩码,例如IP:110.47.10.0,看开头的110可知这是A类IP地址,所以其子网掩码为255.0.0.0,所以其网络号为110,主机号为47.10.0,其可以分配给某一特定主机

0x04 IP与子网掩码的计算

  1. 有效子网数:给定一IP地址,以及其对应的子网掩码,求其有效子网数: 假设给定IP:136.62.2.55以及子网掩码255.255.128.0: 首先目测IP地址发现其为B类IP,B类IP对应的子网掩码是255.255.0.0,有16个1,其给定的子网掩码为255.255.128.0有17个1,所以其有效子网数就等于 217162=02^{17-16}-2=0 个,-2的原因是去掉网络号及广播地址。

    注:子网号不能全为0或者全为1,因为全为0的话,这个子网号就与网络号相同的,如果全为1的话,这个子网号就跟整个网络的广播地址一样了。