网络层
网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务
IP协议可以将异构的物理网络连接起来,看起来就像是一个统一的网络
- 数据平面:控制数据报从路由器输入链路转发到输出链路
- 控制平面:控制数据在端到端之间的路由方式,有手动配置路由表或由软件定义的方式来实现
路由器工作原理
分组转发流程
输入
- 线路链接
- 对数据报进行拆封
- 查找转发排队
路由器通过IP的前缀来确定数据包的转发目的地,当前缀存在重叠时,使用最长前缀
这里路由器还会对数据包进行一些必要的检查,还会重写TTL和校验和
交换
- 通过内存转发
- 通过总线转发
- 通过互联网络转发
前两种在同一时刻内只有一个分组能被处理,最后一种如果输出端口不同,则能并行转发
分组调度
- 先进先出
- 优先权排队
- 即分为两个队列,一个优先级较高,较高优先级的队列如果有分组,则立马处理
- 循环和加权公平排队
- 优先级队列不固定,在各个队列之间的轮流
ECMP
- equal-cost multi-path
可以让路由器同时使用多条链路,一方面极大地提升了网络带宽,而另一方面也带来了新的挑战,也就是网络路径的数量上升了一个数量级,排错的复杂度也明显上升
网际协议
IPV4数据报格式
---title: IPV4数据报格式---packet-beta 0-4: "版本号" 5-8: "首部长度" 9-16: "区分服务" 17-31: "总长度" 32-48: "标识" 49-52: "标志" 53-63: "片偏移" 64-72: "生存时间" 73-80: "协议" 81-95: "首部检验和" 96-127: "源IP地址" 128-159: "目的IP地址" 160-191: "选项与填充(可变长度)" 192-255: "数据部分(可变长度)"
- 版本号 固定为4
- 首部长度 用来确定载荷开始的偏移量
- 区分服务 分离实时流量与非实时流量
- 总长度 IP数据报的总长度 理论最大为65535字节 由于链路层的限制 一般不会超过1500
- 标识 标志 片偏移 用来处理数据分片的情况
- 生存时间 数据报每经过一台路由器 改值会被减1 当为0时会被丢弃 主要是为了防止在网络中循环
- 协议 6代表TCP 17代表UDP
- 首部校验和 将首部里的每2个字节当做一个数 使用反码算术进行求和
- 源和目的地址 也就是32位的IP地址
分片
由于某些链路的帧可承载的字节比某些链路更小,故在路由器会将数据载荷分为几个部分,后一一发送,并把组装数据的任务交给接收端
IPV4编址
分类
由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的
子网划分
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址
无分类
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀
通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网
网络地址转换NAT
IPV6
---title: IPv6数据报格式---packet-beta 0-3: "版本号" 4-11: "流量类别" 12-31: "流标签" 32-47: "有效载荷长度" 48-55: "下一个头部" 56-63: "跳数限制" 64-191: "源地址" 192-319: "目的地址" 320-383: "扩展头部和数据部分(可变长度)"
相比于IPV4:
- 更大的地址空间
- 简洁高效的首部
- 使用流标签标志流数据(语音流、视频流)
- 不允许在路由器进行分片与组装
- 去除了首部校验和
- 去除了选项
路由选择算法
- 集中式与分散式
- 迪杰斯特拉算法得出最短路径 必须要有整个网络的全局状态信息
- 距离向量算法 局部最优
- 静态路由与动态路由
- 手工编辑
- 随网络流量变化而更改路由策略
- 负载敏感与负载迟钝
- 对于网络拥塞会做出反应与否
内部网关协议RIP
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址
距离向量算法
- 只存储距离信息没有拓扑信息
每个节点都会不断地从邻居那里获得最新的距离信息,然后尝试更新自己的距离矩阵,如果发现自己的距离矩阵有变化,才会通知邻居
但这个算法如果没有做跳数限制,由于没有路由拓扑信息,当某个链路断掉后,无法扩散出去,会造成路由环路,无限计算
内部网关协议OSPF
自治系统内部的路由选择,路由器会周期性或者当链路发生变化时向系统内的所有路由器广播路由选择信息,这样每台路由器都有整个自治系统的完整链路图
- 集中式算法,使用[Dijkstra算法](/算法与数据结构/图.html#Dijkstra算法)
链路状态算法
- 发现节点
直接向网络广播一条hello消息,我们称为hello包。所有能直接收到这条消息的一定都是一跳的邻居
- 测量链路成本
每个节点只需要统计一下自己从发出 echo 到收到 echo 的时间差,就可以用它来估计和邻居之间的网络传输时延
- 封装链路状态包
把每个节点已知的信息封装成一个数据包,本机 ID、序号、生存期、邻居|成本,使用序号是为了防止网络阻塞导致老数据比新数据还晚到达
- 泛洪广播当链路状态包
每个节点都会把自己封装好的包和收到的包,发送或转发给所有除了该包发送方的节点,逐渐扩散,像Goossip协议
广播的时机:
- 定时的周期,如30s
- 节点上下线,网络变化
使用这样的算法可以达到动态变化网络拓扑,提升网络的利用率,避免拥塞
外部网关协议BGP
除了是自治系统之间的路由选择协议,BGP还能被用于IP任播:就像IP地址为8.8.8.8的DNS服务器,访问它时并不会真的通过这个IP找到一台物理唯一的服务器,而是通过路由选择在附近找到一台自称是这个IP的DNS服务器
SDN
软件定义网络(Software Defined Network,SDN)是由美国斯坦福大学CLean State课题研究组提出的一种新型网络创新架构,是网络虚拟化的一种实现方式。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台
跨越层次,功能更加强大的转发,不仅可以选择丢弃、复制、转发到特定端口,也就是拥有可被编程的能力,
ServiceMesh是SDN在应用层的扩展
特征
- 基于流的转发 横跨多个协议层 能获取到的信息更多
- 数据平面与控制平面分离
- 网络控制
- 南向接口与北向接口使得网络可编程
实现
ICMP
---title: ICMP报文格式---packet-beta 0-8: "类型" 9-15: "代码" 16-31: "校验和" 32-63: "标识(取决于ICMP报文的类型)" 64-127: "ICMP的数据部分(长度取决于类型)"
- 差错报告 如路由器发现某个主机不可达时 就会回送一个错误报文给源主机
- 询问报文 如ping就是发送一个echo报文 主机收到这个报文再回送一个echo
- 源抑制报文 很少使用 路由器发送一条报文来要求某一主机降低发送速率 拥塞控制在[运输层](/计算机网络/运输层.html)已经做了而且做的更好
ICMP报文种类 | 类型值 | ICMP报文类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达 |
差错报告报文 | 11 | 超时 |
差错报告报文 | 12 | 参数问题 |
差错报告报文 | 5 | 改变路由(Redirect) |
询问报文 | 8或0 | 回送请求或回答 |
询问报文 | 13或14 | 时间戳请求或回答 |
traceroute
发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文
当TTL为0时,路由器将不会继续转发报文,traceroute通过第一次将TTL设为1,然后把报文发送给下一台路由器,路由器将ttl-1之后告诉主机报文不可达,这样以此类推得到整个路由链路
SNMP
简单网络管理协议, 一般使用UDP,所以会出现不可靠的问题,所以必须要安全幂等地重试
使用的请求响应模型,跟HTTP一样
虚拟专用网VPN
IPSec
在网络层提供的了CIA保障
多协议标签交换(MPLS,Multi-Protocol Label Switching):在原始的 IP 头之外,多了 MPLS 的头,支持这个头的路由器,就可以采取跟传统IP层不同的转发策略,提高转发效率