网络层
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 |
我们来对比目的地址与路由表中的目的地址的二进制:
1 | 132.19.237.5 1000 0100 0001 0011 1110 1101 0000 0101 |
我们发现,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 地址的转换:
由此可见,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 与子网掩码的计算
-
有效子网数:给定一 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,所以其有效子网数就等于 个,-2 的原因是去掉网络号及广播地址。注:子网号不能全为 0 或者全为 1,因为全为 0 的话,这个子网号就与网络号相同的,如果全为 1 的话,这个子网号就跟整个网络的广播地址一样了。


