网络层知识梳理
目录
概述
主要功能
- 存储转发功能:路由器会对传入的包进行存储,再根据目的IP地址转发到达目的地
- 路由选择功能:通过路由选择使发的包能通过物理网络(例如:以太网,令牌环网)到达目的地
网络类型
- 数据报
- 无连接服务
- 包每到一个路由器都看一下往哪里走
- 包在路由器间走的每一步相对独立
- 不保证带宽,尽最大可能发送
- 出现故障以后能够灵活地进行处理
- 虚电路
- 分类
- 交换式(switched)虚电路:发送完毕后目标向源发信号释放虚电路;
- 永久(permanent)虚电路:发送完毕后不释放虚电路(相当于专线发送)
- 特点:
- 面向连接
- 可以通过VCI控制每条线路访问量
- 可以保证带宽,但如果某条线路出现故障,代价很大
IP协议
数据报格式
ip数据报是由IP头部和具体的数据两部分构成
- Ver(4b): 说明IP版本
- IHL(4b):说明IP首部的长度
- Type of Service(8b):说明服务类型
- Total length(16b):整个IP数据报的长度,理论上最大长度为65535字节,然而数据报很少有超过1500字节的
- Identification:标识是哪个IP数据报
- DF:为1说明不允许分段;为0说明允许分段
- MF:为1说明这一个IP的数据并不完整,还有数据在后面的IP包;为0说明数据已经发完,这是最后一部分的数据
- Fragment offset:将数据进行分段后,说明每段数据距离第一段数据的偏移量
- TTL: 生存期,每经过一个路由器就减1。如果TTL减到0,路由器直接丢包,同时发送ICMP消息给回源主机。windows和Linux一般为64,Unix为255
- protocol:上层协议,比如TCP、UDP
- header checksum:头部校验和,对于IP的头部进行校验。如果头部校验和出错路由器直接丢包
- source IP addresses(32b):源地址
- destination IP addresses(32b):目的地址,中间路由器会根据目的地址进行包的转发
- option + padding:选项 + 填充。每行32位,最多10行*
编址规则
- 在IPV4中,IP地址一共有32位,采用点分十进制的表达方式
- 分成两部分:网络部分(network prefix)和主机部分(host identifier)
- 网络部分(也称为网络ID(network ID),网络号(network number))主要用于标识所处的网络
- 主机部分用于标识在该网络中是哪台主机。在不同网络中网络部分不同,在同一个网络中网络部分相同;在同一个网络中的IP的主机部分是唯一的
- 种类
-
有类网
A类网:第一位为0:后面的7位为网络部分(最多容纳128个网段,但1600万+的主机)
B类网:前两位为10:后面14位为网络部分(16384个网段,65534个主机)
C类网:前三位为110:后面21位为网络部分
D类网:前四位为1110:后面全为多播地址
E类网:前四位1111:被保留 -
无类网
原因:有类网IP地址浪费严重;路由表项太多,管理不便;IP地址不够用
解决方法:
1. ipv6,增加IP位数
2. 私有IP地址,NAT
3. 将有类网进行拆分,利用可变长子网掩码(VLSM variable length subnet mask)与无类域间路由选择(CIDR: classless inter-domain routing)将有类网通过子网掩码的方式进行拆分与合并。在无类网中网络部分没有限定范围,网络部分的范围为子网掩码为1的范围,剩下的部分为主机部分
举个例子:
假设192.168.1.0这个C类网要划分成四个子网分别容纳100台、60台、25台、10台主机应该怎样进行划分?
192.168.1.0/24 子网容纳量 判断 子网划分 范围 100台 64(2^6)<100<128(2^7) 192.168.1.0/25 192.168.1.1-192.168.1.127 60台 64(2^5)<60<128(2^6) 192.168.1.128/26 192.168.1.129-192.168.1.191 25台 64(2^4)<25<128(2^5) 192.168.1.192/27 192.168.1.1-193.168.1.223 10台 64(2^3)<10<128(2^4) 192.168.1.224/28 192.168.1.225-192.168.1.239 -
查表规则:
得到IP分组以后取出目的地址
1. 目的地址和子网掩码相与
2. 得到的结果与目的网络号进行匹配
3. 如果存在匹配项看是否有下一跳的跳点
最长匹配原则:如果有多个匹配项看子网掩码哪个1的个数多就匹配那一项(地址更加具体)
存在默认路径一定与任何项进行匹配,保证一定发出去
4. 如有下一跳的跳点就往下一跳发,如果没有下一跳的跳点就往对应主机发
没有下一个跳点说明已到该网段,就将主机部分往下传 -
特殊的IP地址
32位全0:网络中的匿名主机,只能当成源主机进行使用
网络部分全0,只有主机部分:本网络中的主机,只能当成源主机进行使用
32位全1:本网络内广播
主机部分全1:在目标子网内广播
主机部分全0:表示网络号
172.0.0.1:回环接口的IP,可用于测试
分组处理规则
- 数据分段方法
-
原因:
链路层对传输的帧大小有限制,因而限定了帧内部数据的大小,但是如果一个完整的数据块超出了限定的帧内的数据大小就有可能会被分段,我们称这个大小为MTU,最大传输单元。如果DF=1,表明不能分段,那么数据长度超过MTU的数据会被直接丢弃。 -
实现
为了保证最终接收者能够理解数据的真实含义,在分段过程中必须标明offset、MF等信息,从而接收者可以正确还原
- 接受者将ID相同的收下,根据offset和MF信息进行组装
- 从收到第一段开始接收者就启动计时器,如果计时器到时还没有收到全部的数据就认为传输失败 -
对于分段的IP包来说,只有四个部分有区别:
MF, offset, total length, header checksum -
* offset的确定方法*
offset由于只有13位,因此最终记录下的为离原IP数据帧头部的偏移量除以8以后的结果。因此在IP数据帧拆分的时候要保证数据长度可以被8字节整除。
路由选择协议
将网络分块,每一块称为一个自治系统(AS, Autonomous System),也称为自治域
- 自治域内通过路由协议建路由,通过内部网关协议(IGP, Interior Gateway Protocol)建路由
常用的内部网关协议有RIP协议、OSPF协议
路由器只用保存本自治域内的拓扑信息 - 自治域间有网关,网关和网关之间通过**外部网关协议(**EGP, External Gateway Protocol)建路由
常用的外部网关协议有BGP协议
路径选择
自治系统内部的路由选择
- LS协议,链路状态协议——所有路由器都保存了全网的拓扑和每条链路的权值(OSPF协议)
- DV协议,距离向量协议——每个路由器只知道到邻居的权值(RIP协议)
RIP
routing information protocol:路由选择信息协议, 是一个距离向量协议(DV协议)
目的:通过距离向量方法在自治域内部建立动态路由
寻路原理:询问邻居路由到目的地的距离并结合到邻居的距离计算自己到目的地的距离
实现
RIP响应报文(RIP通告)
RIP请求报文(请求其邻居到目的目的地的费用)
每个路由器维护一张路由选择表的RIP表
目的子网 | 下一个路由器 | 到目的地的跳数 |
---|
- 初始时每个路由器只有自己直连网的路由
- 每30s左右会将自己的路由表送给邻居,邻居收到以后更新自己的路由表
每项直连网的路由的距离均为1。默认相邻两个路由器之间的距离为1,因此在这里距离也就是跳数
默认16跳为无穷大,不可达 - 一台路由器一旦超过180s没有从邻居听到报文,该邻居被认为不可达(死机或者链路中断)
RIP修改本地路由选择表,然后通过向相邻路由器发送通过来传播该信息。 - 距离设成无穷大的路由在240s内没有更新则删除该项路由
- 更改距离为无穷大的路由表项在180s内不能进行更新
路由表学习
- 原来没有某个网络的路由,现在邻居传来一个那个网络的路由:添加进路由表中,下一跳修改为邻居,跳数+1
- 原来有某个网络的路由
- 原来就是从邻居A学来的,现在邻居A再传来一个该网络的路由:无条件更新,下一跳修改为邻居,跳数+1
- 原来不是从邻居A学来的,现在邻居A再传来一个该网络的路由:比较后更新,保留跳数最小的那个
慢收敛问题
一个新网的加入到整个自治域的路由器知道新网的存在需要经历很长的时间
解决方案 | 描述 | 问题 |
---|---|---|
触发更新 | 一个路由器的路由发生变化立即传到全网,整个自治域内所有的路由器秒学,用多播或者广播的形式立即传给邻居路由器 | 那都有触发更新了,那还需不需要30s向邻居发送路由表 |
计数到无穷问题
当R1与N1的链路中断,R1会将对应的路由表项设为无穷大或者删除。
在还没有出现触发更新机制前,如果R1往R2送路由表送慢了,R2先送路由表会出现什么问题?
R1会更新路由表项,认为R1到N1是可达的。
解决方案 | 描述 | 问题 |
---|---|---|
水平分割 | 从某个接口那里学来的路由表项不要从那个接口发回去 | 为什么是接口,不是路由器?能不能解决全部计数到无穷的问题? |
带毒型反转的水平分割 | 从某个接口那里学来的路由表项不要会从那个接口发回去,但是该项距离设置为无穷大 | |
hold down | 更改距离为无穷大的路由表项在180s内不能进行更新 | |
触发更新机制 | 一个路由器的路由发生变化立即传到全网 | 锐捷交换机不支持触发更新机制 |
自动汇总 | 应用RIP V2的路由器在开启自动汇总以后会将多个子网汇总成一个有类网,发布在其它有类网中 |
OSPF
open shortest path first: 开放最短路优先
与OSPF密切相关的路由选择协议是IS-IS协议
核心是一个使用洪泛链路状态信息的链路状态协议和一个Dijkstra最低费用路径算法。利用OSPF,一台路由器构建了一幅关于整个自治系统的完整拓扑图。然后本地使用Dijkstra的最短路径算法,确定以自身为根节点的到所有子网的最短路径树。
怎样成图
- 末端网
要么只连接了一台路由器,要么连接的多台路由器间不完全相邻 中转网
连接多台完全相邻的路由器的多路访问网络,而这些路由器间的流量称为中转流量(transit traffic)
中转流量:从链路层的角度看不从终端发出,同时不发往终端的流量点到点网
连接两台完全相邻的路由器的由串行电缆进行连接的网络
该网同样既可以作为起点或者作为终点,也可以作为中转
怎样让全网的路由器学习到这样一个图
从路由器发出的边
说明与自己相连的网络的距离和类型
由路由器进行收集以后进行处理
这个消息称为路由器链路状态通告(router LSA, router link state announcement )-
从网络发出的边
说明与自己相连的路由器的距离
这个消息称为网络链路状态通告(network LSA, network link state announcement )
网络链路状态通告需要指定一台路由器进行收集并且发出去(为了避免出现异常会有一个备用指定路由器)- 先看优先级。如果优先级为0不参与选举过程
- 再选择router ID最大的那个
Router ID 选取方法
除了重启路由器,对应router ID的端口断开或该端口上IP更改,强制使用指令更改router ID外,router ID不会改变
- 首先看有没有强制给某个路由器分配router ID
- 再看回环接口中IP地址最大的那个
- 最后看其它物理接口中IP地址最大的那个
网络链路状态通告生成发布
邻居发现(Discover Neighbor).经过邻居发现以后路由器才知道自己所连的中转网还连了哪些路由器(这些路由器称为它的邻居路由器)
方法
- 每10秒广播一个hello包。Hello包里面包含邻居、DR(指定路由器)、 BDR(备用指定路由器)等信息
- 如果40秒内没有从某个端口收到hello包,认为该端口没有邻居路由器与之相连。
发现指定路由器出现异常就是采用这种办法 - 发送方式为多播,目的地址224.0.0.5,多播给所有启用OSPF的路由器
发布规则
- 每30分钟或是路由有更新时全网发布路由器链路状态通告和网络链路状态通告(存在触发更新机制)
- 每个路由器都会将收到的这些信息保存在数据库中以成图,60分钟内没有更新会删除
- 所有路由器通过多播224.0.0.6的方式向所有的指定路由器和备用指定路由器发布自己收到的路由器链路状态通告和网络链路状态通告。指定路由器单播确认收到信息
- 指定路由器再通过多播224.0.0.5的方式向所有的路由器发布自己收到的路由器链路状态通告和网络链路状态通告
- 在发送时先在相互间发送LSA数据库描述包(DD, Database Description Packet)。
如果发现有不一样的,先发送链路状态请求包(link state request)向相邻路由器请求传送指定LSA;接收方收到后会通过链路状态更新包(link state update)将指定LSA传回;最后还需要通过链路状态确认包(link state acknowledge)进行确认。 - 保证LSA完全一致,这种状态称为全相邻(full adjacency)
通过什么计算方法学习路由
- 成图后每个路由器都保存了全网的结构图
- 路由器将采用最短路径算法计算路由规则并加入到自己的路由表中
- OSPF不交换路由表,路由表是每个路由器自己计算出来的
自治系统间的路由选择
BGP
跨越多个AS的源和目的对之间确定了路径。
每个自治域内部都有至少一个网关路由器
实现
- 从相邻的AS处获取可达性信息
- 向本AS内部的所有路由器传播这些可达信息
- 基于可达性信息和AS策略,决定到达子网的“好”路由
属性
- AS-PATH:避免环路。依次记录了已经通知过的自治域
- Next HOP:这个前缀的下一跳点是什么
- 外部BGP(eBGP):这种在BGP之间进行传输。使得每个自治域知道通过它的邻居自治域能到达哪些目的地
- 内部BGP(iBGP):负责自治域内部的BGP信息传输
广播与多播的路由选择
- 广播路由选择,网络层提供了一种源结点到网络中的所有其他结点交付分组的服务
N次单播
无控制洪泛:洪泛,广播风暴
受控洪泛:序号控制洪泛,反向路径转发RPF、RPB,不能控制冗余广播分组的传输
生成树广播:最小生成树 - 多播路由选择,使单个源结点能够像其他网络结点的一个自己发送分组的副本。
剪枝
其它重要协议
ICMP协议
Internet控制报文协议: Internet control message protocol。
ping -t 192.168.100.1
主要进行网络诊断。
源主机可以知道位于它与目的主机之间的路由器数量和标识,以及两台主机之间的往返时延。
主要功能:
1)确认网络是否正常工作,即确认IP包是否成功送达目标地址;
2)ICMP报文分两类遇到异常时进行问题诊断。
ICMP报文分两类:
1)通知出错的差错报告报文;
2)用于诊断的查询报文。
常见ICMP差错报文:
目标不可达、原点抑制、重定向、回送请求、路由器请求、超时等。
ARP协议
ARP地址解析协议: address resolution protocol。
当路由器要在链路层上通过局域网(LAN)进行数据传输时需要通过ARP协议在本子网内广播ARP帧询问MAC地址,进行IP地址和MAC地址的映射
- 这里特别注意:只有发送接口是局域网接口的时候才会发送ARP帧。而且ARP帧不会超时重发
- 链路层传输的是帧,识别的是MAC地址;网络层传输的IP包,识别的是IP地址
- ARP请求帧中包含源主机的IP,MAC地址和目标主机的IP地址
从网络层到链路层
网络层的设备路由器看的是IP包,拿出包的目的地址通过查路由表决定接下来的行为
- 没有对应的路由表项:丢包
- 有对应的路由表项
有下一个跳点:如果转发端口接的是局域网通过发送ARP帧询问下一跳点对应的MAC地址再进行链路层的发送
没有下一个跳点:如果转发端口接的是局域网通过发送ARP帧询问目的地址对应的MAC地址再进行链路层的发送- 如果路由器已经有对应的MAC地址缓存就不需要发ARP帧
- 如果接的不是局域网那么不会发ARP,而根据具体协议的规定进行转发(比如说你们的串口线发送)
DHCP协议
DHCP动态主机设置协议: dynamic host configuration protocol。
主要进行IP地址的动态分配和续租
步骤
1. DHCP发现
一个新到的主机首要任务是发现一个要与其交互的DHCP服务器,通过DHCP发现报文来完成。通过UDP的67端口发送。广播目的地址255.255.255.255;“本主机”源地址0.0.0.0
2. DHCP提供
DHCP服务器收到DHCP发现报文时,用一个DHCP提供报文向客户做出响应。广播目的地址255.255.255.255。
3. DHCP请求
客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用一个DHCP请求报文进行响应,回显配置参数。
4. DHCP ACK
服务器用DHCP ACK报文对DHCP请求报文进行响应,证实所要求的参数
网络地址转换
NAT, network address translation
NAT路由器对外界行为反过来就如同一个具有单一IP地址的单一设备。
UPnP
通用即插即用
是一种允许主机发现并配置临近NAT的协议。