导学
- 网络层是通信子网的最高层,解决的是数据在网络中传输路径的问题(数据路由)
- 本篇主要从IP协议入手,逐步深入分析网络层的功能实现
虚拟互连网络
- 实际的网络连接是很复杂的,数据可能经过WiFi、电缆的多次传递
- IP协议提出了虚拟互连网络的概念,使得网络层可以屏蔽底层细节而专注于网络层数据转发
- 准确的说,是IP协议的实现,让用户实现了虚拟互连,你只管入网,其他交给IP
- 因此,IP协议的任务就是:解决虚拟网络中数据报传输路径的问题
IP协议
- IP地址
- 物理层有MAC地址,每台电脑都有一个全球唯一的不可变的MAC Address
- IP地址使用点分十进制表示(192.168.6.6),32位(IPV4),最多可表示232个
- 物理层有MAC地址,每台电脑都有一个全球唯一的不可变的MAC Address
- 帧数据格式
- 从帧数据中拆出IP数据报(注意这个叫法):
- IP数据报内又包含首部+数据部分(传输层报文)
- 从帧数据中拆出IP数据报(注意这个叫法):
- 首部详解(要考)
- 总长度,首部+数据长度;最大数值位65536,但如果超过MTU,要进行分片
- 标识:分片后组装时使用的序号,这个序号是存储器维护的一个计数器的值(当然,无连接服务不存在按序接收的问题)
- 标志:
- 最低位为MF(More Fragment),MF=1即表示后面还有分片,MF=0表示这已是若干数据报片中的最后一片
- 中间的一位为DF(Don’t Fragment),意思是“不能分片”,只有当DF=0时才允许分片
- 最高位没用到
- 片偏移:某片在原分组中的相对位置(相对此分组头)
- 即标识和片偏移还原分组
- TTL:此报文在网络中的寿命(避免无限传输),每经过一个设备-1
- 协议:表示IP数据所携带的具体数据是什么协议的(指明这个报文是干嘛的)
- ICMP就是报告错误的,TCP/UDP就是上面传来通信的…
数据报转发流程
- 在网络接口层有MAC地址表,回顾他的转发流程:
- 这个流程很重要,也涉及到使用ARP协议
- 路由表
- 类似的,计算机和路由器都拥有路由表:
- 此时跨域访问,数链层就无能为力了
- 类似的,计算机和路由器都拥有路由表:
- 转发流程
- A给数据帧到本网路由器(忽略物理层比特流传输)
- 每一次传递MAC地址都会变化:
- IP地址始终不变
- A给数据帧到本网路由器(忽略物理层比特流传输)
- 理清这两个流程很重要!!!
ARP协议
- 上面两个流程中,内网转发要查MAC表,外网要改MAC地址到下一跳,都要用到MAC
- 如果找不到MAC地址呢?这就要用到地址解析协议(Address Resolution Protocol)
- 先说正常情况下,查找ARP缓存表:
- Windows使用
arp -a
查看
- Windows使用
- 如果没有缓存:
- 一方面,缓存是有期限的,MAC不变IP变呀
- 新加入的主机没来得及缓存
- 怎么办呢?发送ARP广播报文,作用是:谁是这个IP?快把你MAC给我
- 报文格式:
- RARP(逆地址解析协议)
- 作用:
- 作用:
子网划分
- 分类的IP地址
- IP地址是要分到每个主机的,每台电脑需要全球唯一的IP进行寻址通信,分类的IP采用网络号+主机号构成:
- 仔细看,每类地址前面有几位是固定的(可用来识别是哪类网络),当然这也限制了IP数(8/16/24变成了1/14/21)
- 如图,A的网络号第一位必须是0,所以最大只能到127,而不是255
- 这样划分便于某些机构,例如学校,需要申请一定数量的IP给旗下的主机,可以直接扔个某一类网络号
- 理论上总结如下:
- 这里可能会犯的错误:8位二进制1最大表示255而非256,能表示的状态数是256
- 还有一些特殊的主机号:
- 主机号全为0,表示当前网段(网段指一个计算机网络中使用同一物理层设备能够直接通讯的那一部分,即同一网络号下的所有主机)
- 主机号全为1,表示广播地址,向当前网段所有主机发消息时使用
- 特殊的网络号
- A类的全0和
01111111
(127表示回环地址) - B类的
128.0
也不可使用 - C类的
192.0.0
也不可使用
- A类的全0和
- 因此,要修改IP分类范围
- 好了,这个是最终版了,知道怎么来的才能记住
- 解释一下回环地址:
- 还有两类特殊使用的地址:
- D类主要是多点广播,用来一次寻址一组计算机,所以说视频会议之类的的用的多
- IP地址是要分到每个主机的,每台电脑需要全球唯一的IP进行寻址通信,分类的IP采用网络号+主机号构成:
- 子网和掩码
- 先不考虑私有网络划分,看这样一个问题:一个公司有256台电脑需要联网,应该分配个哪类网络号呢?答案:只能是B类,C类的一个网络号最多连接254个主机
- 但这会造成大量IP的浪费,都这么造,面临IP资源枯竭的问题
- 怎么办?划分子网,从主机号中取出任意位,作为网络号,这个新的网络号就叫做子网
- 以一个C类地址为例:
- 我们取主机号中的最高一位加入网络号,此时网络号(网段)可以分为
193.10.10.0
和193.10.10.1
连个网段,主机号的数量都变为128 - 此时,如果某个公司需要100个IP,只需分配某个网段,节省了一般的IP地址,香!
- 我们取主机号中的最高一位加入网络号,此时网络号(网段)可以分为
- 但是,怎么知道哪几位主机号加入网络号了呢?或者说怎么判断属于哪一个网段?这就需要子网掩码
- 掩码由具有网络号位数个连续的1组成
- 使用方法:
CIDR
- 无分类编址
- 虽然与运算很快,但子网划分毕竟还是复杂,CIDR取消了分类IP的概念,类似子网的原理,使用网络前缀+主机号表示IP
- 网络前缀可理解成一个CIDR地址快
- 斜线记法
- 记一下这个表是方便做题的
- 记一下这个表是方便做题的
- 超网:把小网络整合成一个大网络,没啥稀奇的
- IP地址有40多亿个,按理说是不会很快用完的,但当时年轻啊,分配的不合理,后面也不好整改,要枯竭了;得想个办法呀,于是诞生了NAT技术
NAT
- 接着上面的那个问题,物以稀为贵,如果一个企业就分配给几百个全球IP,天理何在?
- 于是提出了内网地址和外网地址的概念:
- 三类内网地址(这个得记),最常见的还是第三类
- 也就是说我们把这部分IP拿出来做只做内部网络
- 三类内网地址(这个得记),最常见的还是第三类
- 内部私有网络需要一个全球公网IP访问外网,这就需要用NAT技术转换
- IP和端口号都会按NA表规则转换
- 相当于一个企业可以只用一个全球IP就能连接互联网
- NAT减缓了IP地址的消耗,但增加了网络通信的复杂度
- 一个单位可以自己按需划分内网,可视作一个局域网
- 因此,路由器也可分为内部路由和外部路由了
- 路由器是工作在网络层的、不同网段的设备
ICMP
- 网际控制报文协议(Internet control message protocol)
- 报告错误信息或者异常情况
- ICMP报文是封装在IP数据报数据部分的
- ICMP报文分两类
- 差错报告报文
- 类型4代码0:表示源点抑制报文,数据包集中到达某一路由器后,因为来不及被处理,有可能被丢弃的情况。这时候ICMP报文,用来使发送方减慢发送速度
- 询问报文(较少使用)
- 差错报告报文
- ICMP协议辅助IP协议交换各种控制信息,达到差错检测的目的
- 使用ICMP报文也有安全问题,如果你想了解更多:链接
ping
ping
命令,验证网络连通性和质量,用到ICMP询问报文- 可以ping你的网关、回环地址、远端地址来检测
traceroute
- 探测IP数据报在网络中的路径,
traceroute www.baidu.com
- 可以用IP查询看看经过了哪些地方
- 会使用到首部TTL,如果超时会发送终点不可达差错报文
路由概述
- 几分钟过去了两个重要流程还记得吗?之前有个叫路由表的东西,存储目的IP和下一跳IP,下一跳怎么来的呢?
- 首先,我们一般将网络拓扑转换成图数据结构,方便计算机处理
- 为了得到路由信息,可以使用图论相关的算法实现路由协议
- 既然是算法,要满足:正确性、完整性
- 应用在复杂的网络环境,还要足够的简单、适应变化、稳定公平
- 互联网环境太复杂,怎么降低其复杂度呢?于是提出了自制系统的概念
- AS(automatic system),每一个自制系统由一组在统一的机构管理下的路由器组成(例如一所学校的所有路由器)
- 整个系统对外呈现统一的路由策略,可被看成是独立的网络组成单元
- 一般比较大的网络有多个出口才会申请AS号,和局域网并不是等同概念,局域网一般指一个单位的内部网络
- 因此我们的路由协议可以分为
- 内部网关协议(IGP),AS内路由策略,常见的有RIP和OSPF
- 外部网关协议,AS之间路由策略,常见的就是BGP
- 至此,网络系统的结构基本确定,就是以AS为单位的网络互连
- AS内划分内网地址,并约定好协议更新路由信息(OSPF),各网段使用路由器转发,网段内使用交换机传送信息
- 如果只分得一个公网IP,理论上来说所有内网路由都要通过一个公网路由转发报文与外界互连(NAT)
- AS之间使用BGP更新路由信息,各公网IP实现全球组网
- OK,接下来具体看更新路由表的主要协议
RIP协议
- 路由信息协议,是一种内部网关协议(IGP),在此之前,不得不说一下它用到的距离矢量算法DV
DV
- 属于图算法
- 算法原理
- 每个节点使用两个向量Di和Si
- 前者描述当前节点到其他节点的距离(跳数,相邻两路由器即为1跳)
- 后者描述当前节点到某一节点过程中的下一节点(类似下一跳)
- 每个节点与所有相邻节点交换DS信息,据此更新自己的网络信息
- 所有信息更新完毕,即可得出网络中到达某个节点的最短路径Di和下一跳Si
- 每个节点使用两个向量Di和Si
- 看个例子:
- 图左是抽象的网络结构
- A收到来自其他节点的信息
- 注意:A-B是11,B-A是9,因为信息没更新,绕路了!
- 根据B的信息计算出到达其他节点的距离,更新自己的DS
- 上图是收到B信息之后,经过下面的一番计算(A->B),更新了SA中到B和F的路径信息
- 同理,直到计算完F传来的信息,即可得到A到达各节点的最短距离D和到达某节点的下一跳S
- 图左是抽象的网络结构
- 回到RIP协议
- 协议步骤:
- 看不懂对吧,看个例子:
- 相邻路由器,所以距离+1,由于这里没有到AB的信息,所以经过X到AB
- 第二步:把下一跳为X的都更新(+1)
- 第三步:更新所有DS(为了说明问题,每次初始化的例子不一样)
- 这就使用到前面的DV算法,因此RIP也叫距离-向量路由协议
- 这里只与相邻路由器交换信息
- 16跳不可达,即最远15跳
- 协议步骤:
- RIP的优缺点
- 优点:实现简单,开销很小
- 缺点:故障传递慢,A宕掉了:
- 还限制了网络的规模(16跳),只能在较小的网络使用(视野不够)
Dijkstra
- 迪杰斯特拉算法,解决有权图从一个节点到其他各节点最短距离的问题,数据结构中也会介绍
- 以起点为中心,向外层层扩展的思想
- 这里没有按一般教材中加入边集E,道理不变
- 还是例子说明:
- 初始化:
- A到B距离最短,将B纳入S
- 此时既要考虑与A直接相连的点,也可计算经过B的距离,但目标仍是找最短路径,直到U空:
- 最后分别得到A到其他各个节点的最短距离
- 注意:不是从A出发,逐个不重复经过所有节点的最短距离(这很难)
- 初始化:
OSPF
- 基于Dijkstra算法,实现另一种IGP协议OSPF(Open Shortest Path First)开放最短路径优先,特点如下:
- 向所有的路由器发消息(可以得到完整的网络拓扑)
- 也叫链路状态数据库,是全网一致的
- 消息描述的是与相邻路由器X的链路状态
- 状态:距离、时延、带宽
- 只有链路状态变化时,才发送更新信息
- 向所有的路由器发消息(可以得到完整的网络拓扑)
- 因此也叫链路状态(LS)路由协议
- OSPF发送的消息有五种类型
- 问候消息(Hello)
- 链路状态数据库描述信息
- 链路状态请求消息
- 链路状态更新消息
- 链路状态确认消息
- 对比RIP协议学习(距离-向量路由协议)
- DV和Dijkstra算法很类似,都是以当前节点为中心,但得到的信息一个来自邻居,更新D/S;一个来自所有AS内节点,更新状态
- 优点:收敛快、变化触发更新节省计算资源、可在大规模网络中使用
BGP
- BGP(Border Gateway Protocol)边际网关协议,属于外部网关路由协议
- 这是一个很复杂的协议,它只能找到一条比较好的路由
- 各AS内使用的IGP不同
- 各AS之间可能涉及到政治、安全等因素,不能通信(可以人为干预网络)
- BGP发言人(speaker)
- BGP不关心AS内怎么拓扑
- 只和AS的发言人交流,从而实现人为干预
- 最后看一下整体架构:CIDR+AS+OSPF+NAT+ARP+BGP,当然,少不了IP+ICMP+
小结
- 内容有点多,但不是在这造“字典”,而是梳理出整个IP层工作流程,基本每一步都围绕在问题周围,环环相扣;希望你也能得到答案
- 本篇重点:两个消息转发流程,子网划分与NAT,路由协议;可以自问自答,看看是否理解了
- 如果你想了解的更深入或者备考,可以阅读权威的书籍(有些东西得动笔),可以读RFC官方协议(你八成读不下去);但作为基础部分,这里足够
- 下一篇到传输层,可以叫“程序员层”。上承应用,阿猫阿狗对端口;下接网络,握手挥手字节流;是优秀程序员必争之地!
- 老师来了溜了溜了~~~