网络层
概述
- 对于不同帧使用同一方案进行处理
- 希望通过路由选择算法进行路径选择和转发,对第二层是透明的
- 只能避免拥塞,不能流量控制
职责
- 使用分层寻址方案,方便逐步细化目的地地址
- 细分网络并控制流量
- 减少交通堵塞,基于IP做分段和传达,用来减少拥塞
- 与其他网络交谈
- 对于不同的数据链路层的帧,第三层基于IP协议,来实现跨介质的逻辑理解和互通
负责进行连通和传达,数据可靠性由终端设备(第四层及以上)来进行保证
路由器
- 互连网段或网络(分割网段)
- 根据IP地址做出合理的决定
- 根据路由表确定最佳路径
- 将数据报从入站端口切换到出站端口
- 如果A网段的设备向路由器发送了一个B网段的广播地址,那么路由器会进行转发
- 如果A网段的设备发送的是本网段的广播地址,那么路由器不会进行转发(广播域划分)
IP协议
网际协议IP是TCP/IP体系中两个最主要的协议之一,配套使用的还有三个协议:
- 地址解析协议ARP(Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Message Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol)
IP数据报格式
数据格式常以32位(4字节)为单位来描述
- 首部的前一部分是固定长度,共20字节
- 首部固定部分后面是一些可选字段,长度可变
首部固定部分中的各字段:
版本:IP协议的版本,共4位,广泛使用的版本是IPv4
首部长度:首部长度的表示单位是32位字(4字节),可表示的最大十进制数值是15,共4位
- 由于首部的固定长度是20字节,所以首部长度字段最小值为5,最大值为60字节($15 \times 4 = 60$)
- IP分组的首部长度不是4的字节时,必须利用最后的填充字段加以填充,因此数据部分永远在4字节的整数倍开始
- 最常用的是20字节,即首部长度为0101
区分服务:在旧标准中叫做服务类型,共8位,一般情况不使用这个字段
总长度:首部和数据部分的长度和,单位为字节,共16位
- 数据链路层设置了最大传输单元MTU,因此数据报的总长度不能超过规定的MTU值,不然会将数据报进行分片处理
标识(identification):IP软件在存储器中维持一个计数器,每产生一个数据报计数器+1,并将此值赋给标识字段,当产生分片时就将标识字段的值复制给每一个分片,便于重装为完整的数据报,共16位
标志(flag):共3位,但只有两位有意义
- 最低位为MF(More Fragment),MF = 1表示后面还有分片,MF = 0表示这时若干数据报片的最后一个
- 中间一位是DF(Don’t Fragment),表示不能分片,只有DF = 0才允许分片
片偏移:指出分片在原分组的相对位置(相对于起点在何处开始),偏移单位为8字节,共13位
生存时间:数据报在网络中的寿命,防止无法交付的数据报无限制地在互联网中兜圈子,现在功能为跳数限制(至多可经过几个路由器),共8位
协议:指出数据报携带的数据是使用何种协议,共8位
首部校验和: 这个字段只检验数据报的首部,共16位
源地址:共32位
目的地址:共32位
首部可变部分:
可变部分就是一个选项字段,选项字段用来支持排错、测量以及安全等措施,内容很丰富,最后用全0的填充字段补齐成为4字节的整数倍
IP地址
IP地址就是给互联网上的每一台主机(或路由器)的每一个端口分配一个在全世界范围内唯一的32位标识符
IP地址分为若干类,但都由两个固定长度的字段组成,分别是网络号和主机号
- D类地址为组播/多播(一对多)
- 通常写法是点分十进制(每8位二进制加一个点)
A类:0 ~127
B类:128~191
C类:192~223
D类:224~239
E类:240~255
A类网络号只有7位可指派,但是一般不能指派全0和全1
- 全0表示本网络
- 全1用于环回测试(根本不是一个网络地址)
B类网络号只有14位可指派,但是网络地址128.0.0.0是不指派的
- B类开始IP地址是128.0.0.1
C类网络号只有21位可指派,但是网络地址192.0.0.0是不指派的
- C类开始IP地址是192.0.0.1
主机号一般不能取全0,也不能取全1
- 全0用来标识网段地址
- 全1用来表示网段的广播地址
- 用交换机或网桥连接起来的若干个局域网仍属于一个网络
- IP地址是一种逻辑地址
划分子网和构造超网
早期IP地址的设计不够合理,主要体现在:
- IP地址空间利用率有时很低
- 两级IP地址不够灵活
划分子网(subnetting):在IP地址中增加一个子网号字段,也叫做子网寻址或者子网路由选择
- 从主机号借用若干位作为子网号,从而变成三级IP地址:网络号、子网号、主机号
- 减小了广播域,提高网络利用率
子网可以借用的位数:
- 最小位数是2:当只借用1位时就只能表示本网络和广播
- 最大位数可以是保留至少2位主机号的任何数字
- A类20位
- B类14位
- C类6位
- 借用4位是最高效率的
32位IP地址本身以及数据报首部都没有包含任何有关子网划分的信息,因此我们可以使用子网掩码(subnet mask)来确认数据报属于哪个子网
- 把网络号和子网号全赋1,主机号全赋0
子网掩码和IP地址逐位相与,就可以得到子网的网络地址
- 不管有没有划分子网,与运算后都能得出网络地址
默认子网掩码:
- A类:255.0.0.0
- B类:255.255.0.0
- C类:255.255.255.0
子网数 = $2 ^ n$ - 2
- 子网号有n位
- 除去全0和全1(实际上在CIDR协议中已经可以使用这两种情况了)
无分类编制CIDR(构建超网):
在一个划分子网的网络中可同时使用几个不同的子网掩码,使用可变子网掩码VLSM(Variable Length Subnet Mask)可进一步提高IP地址资源利用率。在VLSM的基础上又进一步研究出无分类编制路由选择CIDR(Classless Inter-Domain Routing)
网络前缀
CIDR消除了传统的A类、B类、C类地址以及划分子网的概念,而是把互联网地址分为网络前缀和主机号
- 使用斜计线法(CIDR记法),即在IP地址后面加上斜线“\”,然后写上网络前缀所占的位数
把网络前缀相同的连续IP地址组成一个“CIDR地址块”,我们只要知道CIDR地址块中任何一个地址,就可以知道起始地址和最大地址以及地址数
为了更方便的进行路由选择,CIDR使用32位的地址掩码(address mask),也可以继续称作子网掩码
- 网络前缀赋为1,主机号赋为0
分配到地址块后仍可以划分子网,但是借用的位应当加入到网络前缀
路由表利用CIDR地址块查找目的网络,这种地址的聚合常称为路由聚合(route aggregation),也称为构成超网
CIDR记法有多种形式:
- 地址块10.0.0.0/10可以简写为10/10,也就是把点分十进制中低位连续的0省略
在网络前缀的后面加个*,例如00001010 00*,意思是*之前是网络前缀,*之后是主机号,可以是任意数字
从表格可以看出,除了最后几行,CIDR地址块都包含了多个C类地址($2^n$倍),这就是构成超网一词的由来
- 网络前缀越短,包含的地址数越多
最长前缀匹配(最长匹配/最佳匹配)
路由表项目和由网络前缀和下一跳地址组成- 可能查找路由表时不止一个结果
应该在匹配结果中选择具有最长网络前缀的路由
- 利用二叉线索查找路由表
先找出对应于每一个IP地址的唯一前缀- 唯一前缀就是在表中所有IP地址中,该前缀是唯一的
路由器
路由器有两个功能:路径选择、分组转发
分组转发
- 在分类子网划分时,全0代表本机地址,全1代表广播地址
- 做转发根据的是网段而不是具体的IP
路径选择
路由器根据路由规范,选择他当时认为最合适的路径- 选择数据包到达目的地的路径中的下一跳
路由器端口:
接口是路由器连接到网络的附件,在IP路由中也可以称为端口
- 这个IP地址往往被称作这个网络的网关
- 每个接口必须有一个单独的唯一网络地址
- 比如S1和S2不能相同
- 路由器的连接的网段一定要不同·
- 路由器端口记录了网段的IP地址(和连接的地方是相同的)
- 在计算需要分配的端口总数时,注意路由器的端口也需要算上
IP地址分配:
静态地址分配(Static addressing)
- 为每个单独的设备配置一个IP地址
- 保证不重复
- 需要知道规范,通过命令行进行分配
动态地址分配(Dynamic addressing)
- 反向地址解析RARP(Reverse Address Resolution Protocol):发起请求根据IP地址信息来分配
- BOOTStrap协议(BOOTP):用于工作栈
- 动态主机配置协议DHCP(Dtnamic Host Configuration Protocol):IP地址和掩码处理后得到网络地址,保证每个网段中的主机的网段地址一致
地址解析协议ARP
ARP协议通过IP地址解析出MAC地址
- 在IP层抽象的互联网上只能看到IP数据报
- 在局域网的链路层只能看见MAC帧
ARP协议在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且动态更新
- 每台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网各主机和路由的IP地址到硬件地址的映射表(已知)
主机A向本局域网上的主机B发送IP数据报过程:
先在ARP高速缓存中查看有无主机B的IP地址
- 如果有就查出硬件地址并写入MAC帧,然后发送
- 如果无就进行下面步骤
广播发送ARP请求分组,内容为自身IP地址、自身硬件地址、想知道IP地址为xxx的主机的硬件地址
- 写入自身信息是便于以后主机B向主机A发送数据报
IP地址一致的主机B收下ARP请求分组,并发送ARP响应分组,内容是自身IP地址、自身硬件地址
- ARP响应分组是单播
主机A收到ARP响应分组后就写入ARP高速缓存
主机发送给另一个网络上的另一主机数据报时,应该先找到相应的路由器进行转发,这时需要把路由器的IP地址解析为硬件地址
为了使设备与另一网络上的零一设备通信,必须提供默认网关
- 默认网关就是路由器连接到源主机所在网段的接口的IP地址
ARP四种典型情况:
主机$H_1$发送数据报到同一网络上的另一主机$H_2$。这时$H_1$发送ARP请求分组,找到$H_2$的硬件地址
主机$H_1$发送数据报到零一网络上的另一主机$H_3$或$H_4$,这时$H_1$发送ARP请求分组,找到路由器$R_1$的硬件地址,剩下的交给$R_1$,即下面的3和4
路由器$R_1$把数据报转发到与$R_1$相连的网2的主机$H_3$,这时$R_1$发送ARP请求分组,找到$H_3$的硬件地址
$R_1$要把数据报发送到网3上的主机$H_4$,这时$R_4$发送ARP请求分组,找到$R_2$的硬件地址,剩下的交给$R_2$
网络层设备
面向连接的网络服务
在任何发送数据的行为之前,要先建立好连接,协商好参数才会开始传输,所有数据有序传输
- 网络情况导致数据出现问题,需要接收方进行一定处理来保证数据正确
- 传输过程要保持连接距离,只有完成传输才能断开连接
- 传输比较可靠,代价高
无连接的网络服务
不要求发送方和及受访在发送前先建立一个连接,分别对待每一个数据包,系统不需要进行大量的数据保留,不需要很多的缓存
- 局域网使用比较多,可靠性比较低,不处理报文丢失
- 少量报文使用无连接可以调高效率(可靠网)
IP就是提供无连接的网络服务
电路交换(Circuit Switched)
电路交换要先建立一个虚电路关系,之后报文走对应的虚电路
- 所有数据包依次在同一虚拟通道上传播
- 电路利用效率低
- 可能是分段建立,可能局部可以复用,但是整体不可以复用
- 虚电路强于面向连接,传输更可靠,保证传输先后关系
报文交换(Packet Switched
当数据包从源传递到目标时,它们可以:
- 切换到其他路径(根据当前的网络情况,进行路由选择)
- 乱序到达
将原始数据分为很多子报文,每个子报文自己选择路径进行发送
- 设备根据各种标准为每个数据包确定路径,某些标准可能因分组而异
- 大部分无连接网络都是基于报文交换实现的,可以控制网络拥塞
- 出现问题时只需要重传对应部分的报文
网络协议操作
被动路由协议用于路由器之间,保证路由器之间连通
主动路由用于做各自路由表的生成,路由器彼此交换信息
routed protocol是用来使用路由表的
routing protocol是用来生成路由表的
routing protocol决定routed protocol
- 存在冗余,A转发给B是由当前网络状况处理
- ABC之间都是通过帧来今进行计算的
被动可路由协议Routed protocol
路由协议或可路由协议是为网络层提供支持的协议
- IP是网络层协议,因此它可以通过互联网进行路由(routed)
不可路由协议Non-routable protocol
不可路由协议是不支持第三层的协议,最常见的是NetBEUI
- 直接根据目的方的地址在局域网中进行生成定位
- 跨局域网也不支持第三层
- NetBEUI仅限于在一个网段上运行
routing protocol是主动可路由协议也就是Dynamic routes
被动可路由协议的寻址:
将目的主机和子网掩码进行逻辑与运算得到对应的网段,然后请求路由表可以发现某个端口为目的网段,接着将报文封装转发给对应的主机
- 路由表存储在内存中
路由协议的分类
静态路由:
网络管理员在路由器中手动输入路由信息- 用于隐藏部分网络,安全(不进行路由表交换)
- 测试网络中的特定链接
- 用于仅在到达目标网络的路径时维护路由表
动态路由:
路由器在运行过程中互相学习信息,使用路由协议更新路由信息,如RIP、IGRP、EIGRP、OSPF等,人工维护代价比较大- 维护路由表
- 以路由更新的形式即使分发信息
- 路由器可以调整以适应不停变化的网络状况
- 打开后会启动进程,按照不同的协议和网上的不同设备学习信息,然后根据算法生成路由表
主动路由协议Routing protocol也是动态路由
- 路由协议确定路由协议遵循的到达目的地的路径
- 用来构建路由表
- 公平、简单、适应变化
动态路由协议分类
内部网关协议(Interior Gateway Protocols):
例如RIP,IGRP,EIGRP,OSPF等,可在自治系统中使用
- 自治系统是逻辑的划分,而不是物理层次的划分
IGP是内部确定的管理规则
分类:
距离矢量协议DVP(Distance-Vector Protocols)
例如RIP、IGRP
- 从邻居的角度查看网络拓扑(不是全局)
- 在路由器之间添加距离向量(根据跳数决定和)
- 经常会定期更新
将路由表副本传递到邻居路由器
示例:
- 只知道最少跳数(不知道最佳路径)
- 定时路由表会相互交换给邻居
DVP的代表RIP(Routing Information Protocol):
基于距离矢量的内部网关协议,唯一指标是跳数,选择走跳数最短的路径而非最快的路径,最受欢迎
- 最大跳数是15
- 每30秒更新一次(广播),可以修改
- RIP v2是RIP v1的改进版本,更加常用
IGRP(Interior Gateway Routing Protocol) 和 EIGRP(Enhanced IGRP):
基于距离矢量的内部网关协议,指标由带宽、负载、延迟、可靠性组成,EIGRP是IGRP的高级版本,它是混合路由协议(不全根据跳数计算)
- IGRP最大跳数为255
- 每90秒更新一次
链路状态协议LSP(Link State Protocols)
例如OSPF
- 获取整个网络拓扑的通用视图(全局)
- 计算到其他路由器的最短路径
- 事件触发的更新
将链路状态路由更新传递给其他路由器
LSP操作过程:
- 相互交换彼此学到对应的Topological Database(全局)
- 使用SPF算法,以自己为根,通过最短路径优先算法,生成以自己为根的树
根据这一个树再生成路由表,逻辑是树的逻辑
示例:
- 彼此交换连接状态
- LSP不是定时进行交换的,而是初始的时候进行交换,稳定之后根据事件触发的时候才会更新数据
- 更新后发送给所有路由器,需要将Database发送给所有路由器
- 根据Database更新自己的树,然后再次生成路由表
- 从所有可达的道路上找到代价最小的路径
LSP的代表OSPF(Open Shortest Path First)
- 最短路径优先协议
- 本科阶段指标只考虑带宽
外部网关协议(Exterior Gateway Protocols):例如EGP、BGP,用于自治系统之间路由数据报
- 通过BGP,让其他自治系统了解自己的自治系统中的网段(不同系统)
因特网控制报文协议ICMP
ICMP为了提高IP数据报交付成功的机会,允许主机或路由器报告差错情况和提供有关异常情况的报告,一般路由器在丢弃报文的时候,都会返回一个ICMP差错报文
- ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去
- ICMP只是IP层的协议
ICMP报文格式:
数据字段如下:
- 一般会把原始的 IP 数据报文的数据报首部 + 8 字节(数据的,可能会包含端口信息)作为 ICMP 的数据部分
- ICMP 的前 8 个字节的是确定的(前 4 个字节是类型,校验位,后面四个字节是确定的)
- 然后添加一个首部作为 IP 数据报进行发送。
两种ICMP报文:
- 查询报文:不是很多
- 差错报告报文:比较多
目的站不可到达
- 网络不可到达(net unreachable)
- 主机不可到达(host unreachable)
- 协议不可到达(protocol unreachable)
- 端口不可到达(port unreachable)
- 源路由选择不能完成(source route failed)
- 目的网络不可知(unknown destination network)
- 目的主机不可知(unknown destination host)
- 不可知是完全不可以解析,不可达是可以解析但是不可以到达
下面几种情况不应该发送ICMP差错报文:
- 对ICMP差错报文不再发送
- 对第一个分片的数据报片的所有后续数据报片
- 对具有多播地址的数据报
- 对具有特殊地址的数据报
PING(Packet InterNet Groper)
- PING 用来测试两个主机之间的连通性,一般是用来检查局域网的连通性:PING 不通,不仅仅是发送不过去,有可能是应答不回来
- PING 使用了ICMP 回送请求与回送回答报文
- PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或 UDP