本文将讲解计算机网络的模型设计,并从发展-演化的角度角度讲述技术方案的变更,为什么这样设计?希望能带你快速了解掌握计算机网络的核心知识。
计算机网路
定义: 计算机网络是由一些通用的、可编程的硬件互联而成,通过这些硬件,可以传输不同类型的数据,并且可以支持广泛和日益增长的应用。
网络的分类
| 分类 | 名称 | 范围 | 区域 |
|---|
| 广域网 | WAN(Wide Area Network) | 几十到几千公里 | 跨省、跨国 |
| 城域网 | MAN(Metro. Area Network) | 5KM-50KM | 城市间 |
| 局域网 | LAN(Local Area Network) | 1KM以内 | 地区内 |
衡量网络性能的一些指标
- 速率单位 bps=bit/s
- 时延 (发送时延、排队时延、传播时延、处理时延)
- 发送时延 = 数据长度(bit)/发送速率(bit/s)
- 传播时延 = 传输路径距离 / 传播速率(bit/s)
- 排队时延 = 数据包在网络设备中等待被处理的时间
- 处理时延 = 数据包到达设备或者目的机器被处理所需要的时间
- 总时延 = 发送时延 + 排队时延 + 传播时延 + 处理时延
- 往返时间RTT(Route-Trip Time)
- RTT表示的是数据报文在端到端通信中的来回一次的时间
- 通常使用ping命令查看RTT
- MTU 数据链路层的最大传输单元
- 数据帧过大或过小都会影响传输的效率 (参考总时延公式)
- 以太网MTU一般为1500字节
- 路径MTU 整个链路中最小的MTU
OSI概念模型与TCP/IP四层模型
OSI概念模型
OSI模型将网络划分为七层
- 应用层 为计算机用户提供接口和服务
- 表示层 数据处理(编码解码、加密解密等)
- 会话层 管理(建立、维护、重连)通信会话
- 传输层 管理端到端的通信连接
- 网络层 数据路由(决定数据在网络的路径)
- 数据链路层 管理相邻节点之间的数据通信
- 物理层 数据通信的光电物理特性
发送时每一层通过添加头部标识包裹,接收时在一层一层解码

为什么要分层设计
- 各层之间是相互独立的
- 每一层需要有足够的灵活性;
- 各层之间完全解耦
为什么OSI模型没有成为标准?
- OSI模型设计之初欲成为全球计算机都遵循的标准
- 但是在市场化过程中困难重重,主要原因是TCP/IP在全球范围成功运行
- 其次还有以下原因
- OSI的专家缺乏实际经验
- OSI标准制定周期过长,按OSI标准生产的设备无法及时进入市场
- OSI模型设计的并不合理,一些功能在多层中重复出现
TCP/IP四层模型
目前在互联网流行的方案时TCP/IP四层协议模型

- TCP/IP四层模型与OSI体系结构对比

网络接口层
物理层
物理层的作用:连接不同的物理设备,传输比特流。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输。
物理层的设备:
- 双绞线、同轴电缆、网线也属于双绞线、光纤)
- 无限传输介质 红外线、无线、激光
- 中继器【Repeater,也叫放大器】
- 集线器
信道:信道是往一个方向传输信息的媒体,一条通信电路包含一个发送信道和一个接受信道。
- 单工通信信道:只能一个方向通信,没有反方向反馈的信道;
- 半双工通信信道:双方都可以发送和接受信息,但不能同时发送也不能同时接收;
- 全双工通信信道:双方都可以同时发送和接收。
数据链路层
数据链路层主要作用是 封装成帧、透明传输、差错监测
- 封帧 即 头尾加标记包裹, 为防止内容中含有相同标记,采用透明传输
- 透明传输即转译,与URL query参数值含有特殊字符的处理一致,
- 差错监测 奇偶校验码 循环冗余校验码CRC
- 奇偶校验码 计算bit流的和是奇数还是偶数 0偶数1奇数, 如果有两个bit流出错,就监测不出来了
- 循环冗余校验码CRC CRC-1即奇偶校验码
MAC地址(物理地址、硬件地址)
- 每一个设备都拥有唯一的MAC地址
- MAC地址共48位,使用十六进制表示
- 每个字节表示一个十六进制数,用 - 或 : 连接起来;
- MAC广播地址:FF-FF-FF-FF-FF-FF。
- window
ipconfig /all mac ifconfig
以太网
- 一种广泛使用的局域网(LAN)技术。
- 核心内容 MAC地址 和 以太网协议
以太网协议
- 一种应用于数据链路层的协议
- 使用以太网协议可以完成相邻设备的数据帧传输

以太网协议的数据帧
| 目标地址 | 源地址 | 类型 | 帧数据 | CRC |
|---|
| 6 | 6 | 2 | 46~1500 | 4 |
通过 MAC地址表 进行数据包的转发。
具体流程如下:

当E(路由器)不知道MAC地址对应的接口怎么办?
- 通过广播除去A以外的所有端口
- E收到回复并记录到MAC地址表
网际层
上面只是讲述相邻物理节点的传输, 如果两台计算机跨域千山万水如何通信?

问题放大一下 就是网络层通信问题

网络层的核心是IP协议, 其他还有ARP协议、RARP协议、ICMP协议
IP协议
对于上图 计算机A 与计算机B的通信路径有很多种
实际上我们并不需要关心网络是怎样连接的,数据包是怎样走的,这些是网络层解决的,网络层有个重要概念虚拟互联网络。
虚拟互联网络
- 如果所有的物理设备都通过使用IP协议,就可以屏蔽了物理网络之间的差异
- 当网络中的主机使用IP协议连接时,则无需关注网络细节
- 我们只需要关注 A与虚拟互联网络的连接 和 B与虚拟互联网络的的连接

- 这就是IP协议
IP协议详解
- IP协议使得复杂的实际网络变为一个虚拟互连的网络
- IP协议使得网络层可以屏蔽底层细节而专注网络层的数据转发
- IP协议解决了在虚拟网络中数据报传输路径的问题
前面说过 MAC地址 ,它是数据链路的身份证, 在数据链路层只要拥有的 MAC地址, 就可以进行数据帧的传输了。
对于网络层来说 也有一个身份证 即IP地址,
IP地址对于网络来说,与MAC对于数据链路层来说作用是类似的
对比MAC地址与IP地址
| - | 表示 | 二进制 | 是否可变 |
|---|
| MAC地址 | 十六进制表示 30-B4-9E-ED-85-CA | 48位 | 固定的 一个网卡从A计算机卸下来安装到B计算机是不变的 |
| IP地址 | 点分十进制表示 192.168.11.11 | 32位 | 可变的 一个电脑在不同的地方连接不同的WIFI,IP地址会变化 |
IP协议主要内容

IP协议的转发流程
将前面网络传输问题的过程拉平,在分析下
转发的过程被称为 逐跳(hop-by-hop)
与 数据链路层传输需要 查询 MAC地址表 一样, IP协议转发也需 “路由地址表”

ARP协议和RARP协议
还是上面一张图, A发送报文给C时,第一跳的过程如下

如何根据IP地址查询mac地址 就是ARP协议做的事情
- ARP协议 就是将 网络层IP32位地址 转换为 数据链路层MAC48位地址
与数据链路层转发与网络层转发类似, 根据IP找mac地址有ARP缓存表
当缓存表没有缓存映射关系怎么办? 也是广播
总结
- ARP缓存表是ARP协议和RARP协议运行的关键
- ARP缓存表缓存了IP地址到硬件地址之间的映射关系
- ARP缓存表中的记录并不是永久有效的,有一定的期限
arp -a 命令可以查询arp缓存表
ARP协议内容
'

因为ARP协议中包含了IP地址,所以把ARP协议划分到网络层,它是网络层和数据链路层配合使用的一个重要的协议
RARP
- 逆地址解析协议,与ARP协议相反, 将数据链路层48位MAC地址,解析为网络层的32位IP地址
- 它的类型是0835 其他与ARP协议一致
IPv4地址分类
IP地址长度32位,用点分十进制表示 0~255.0~255.0~255.0~255
232=43亿 如何使用这43亿个IP地址, 因此需要规划和分配IP地址
IP地址非常简单

- A类 网络号8位 以0开头
- B类 网络号16位 以10开头
- C类 网络号24位 以110开头
简单划分(存在缺陷)

现实中的网络需要预留一些特殊的主机号和网络号处理一些问题
特殊的主机号
- 主机号全0表示当前网络段,不可分配为特定主机
- 主机号为全1表示广播地址,向当前网络段所有主机发消息
举例来说 如
1.2.3.4这个A类地址IP,
1.0.0.0表示网络段
1.255.255.255表示广播地址, 不能分配给任何主机,往这个地址发消息就会广播给1.0.0.0这个网络段的所有主机
特殊的网络号
- A类地址网络段全0 表示特殊网络
- A类地址网络段后7位全1 即 127开头的 表示回环地址
- 回环地址通常用于进行回环测试。
- 当将数据发送到回环地址时,数据会被送回给发件人的本地主机,而不会在网络上转发。
- 回环地址常用于本地主机测试网络应用程序和服务。
- 如
127.0.0.1 表示本地
- B类地址网络段全0 即 128.0 是不可使用的
- C类地址网络段全0 即192.0.0 是不可使用的
排除这些特殊网络号和主机号,得到一个可划分的IP地址分类

回环地址
- 127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何
一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远
不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在
安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络
协议、基本数据接口等是否正常的。
保留地址块:
- 0.0.0.0 到 0.255.255.255
- 224.0.0.0 到 239.255.255.255
- 这些地址块是为特殊用途保留的。其中,0.0.0.0被用作默认路由,表示未知目标网络;224.0.0.0 到 239.255.255.255是多播地址范围,用于支持多播通信。
除A、B、C三类地址外,还有
- D类 1110 开头
- E类 11110开头
用于特殊用途。
IPv4划分子网
某公司拥有100名员工,每人配备一个计算机,请问该公司应该申请哪种网络段?
- 根据前面网络分类C类有254个主机,因此申请C类地址最划算
- 假设申请的是
193.10.10.0
假设这个公司有256个员工呢?
- 这是C类已经不能满足, B类有 216−1=65534 个地址
- 但是如果人人都这样浪费,IP地址很快就不够用了,
- 因此提出子网划分的概念, 将主机号在划分为子网号和主机号

- 这样只需将
192.10.10.1~192.10.10.126分配给该公司, 只浪费了26个主机号而已
子网号这么多,有没有办法快速判断某个IP的网络号?
子网掩码
- 它并非真实的IP
- 它用于表示有多少网络位与主机位长度, 1填充网络位 0填充主机位, 如255.255.255.0 前24位是网络位,后8位是主机位

IP 193.10.10.6的子网掩码 255.255.255.128 ,两者转换为二进制,
通过与运算,快速算出某个IP所属的子网号, 这里子网号为 192.10.10.0
无分类编址CIDR
由于子网划分太复杂,要先知道网络号,再进行子网号划分,我们希望有更简便的方法,因此提出了CICR
- CIDR中没有A、B、C类网络号、和子网划分的概念
- CIDR将网络前缀相同的IP地址称为一个“CIDR地址块”
- 网络前缀是任意位数的
- 斜线记法
- 193.10.10.129/25
-

相比原来子网划分更加灵活
回到前面的问题 “某公司拥有100名员工,每人配备一个计算机,请问该公司应该申请哪种网络段?” /25


NAT技术
- IPv4最多只有40+亿个IP地址
- 早期IP地址的不合理规划导致IP号浪费
| 内网地址 | 外网地址 |
|---|
| 内部机构使用 | 全球范围使用 |
| 避免与外网地址重复 | 全球公网唯一 |
三类内网地址
A、B、C类是私有地址(局域网IP),它们在公共互联网中不被路由器转发
| 标题 | 范围 |
|---|
| A类 | 10.0.0.0~10.255.255.255 |
| B类 | 172.16.0.0~172.31.255.255 |
| C类 | 192.168.0.0~192.168.255.255 |
思考: 一个家庭只有一个IP地址,那么有很多设备连上互联网呢?公司也有一样的问题

解决方案: 路由器将公网IP通过端口划分给多个主机使用, 通过NAT表转入数据发的收发,进而实现局域网内的设备都能上网

网络地址转换NAT技术
- 网络地址转换NAT(Network Address Translation)
- NAT技术用于多个主机通过一个公有IP访问互联网的私有网络中
- NAT减缓了IP地址的消耗,但是增加了网络通信的复杂度
ICMP协议
- 网际控制报文协议(Internet Control Message Protocol)
- ICMP协议可以报告错误信息或者异常情况
ICMP协议内容

ICMP报文首部
它主要有两种 差错报告报文 和 询问报文


ICMP协议有两个重要的应用ping命令 和 traceroute命令
ping命令
ping命令就是利用ICMP的询问报文功能。

- 因ICMP协议是放到IP协议内部的,IP协议头部供20字节,这里ICMP长度为 32−20=12字节
- TTL及IP协议头部的生存时间字段,每一跳减1,为零将丢弃
通常我们遇到网路问题 都是通过ping命令排查
ping 127.0.0.1 如果得不到返回说明协议栈可能出问题了, 要重装系统或重新安装协议栈
- ping 网关地址
- 网关地址即路由器IP 如
192.168.0.1
- 如果不通,说明网线有问题
- ping 远端地址
- 如果不通,说明你家到ICMP之间有故障, 要联系宽带运营商解决
traceroute命令
Traceroute可以探测IP数据在网络中走过的路径
它的原理是利用IP协议头部的TTL字段,每经过一个设备TTL-1,
当TTL=0时,网络设备丢弃该报文,同时会上报一个ICMP差错报告报文,
路由协议
前面讲述IP协议通过逐跳的方式完成数据包的转发, 逐跳依赖的是路由表,那么路由表的数据是怎样来的呢?
需要一个好的算法去解决这件事情
路由的算法可以抽象为图论的算法
- 每一顶点表示一个网络、路由器或计算机
- 每一条边表示一条网络路径
实际上网络环境更复杂,路由算法要比图论算法更复杂
路由算法的必要条件
- 算法是正确的、完整的
- 算法在计算上应该尽可能的简单
- 算法可以适应网络中的变化
- 算法是稳定的和公平的
为了处理路由算法问题,就需要对网络进行划分, 于是提出了自治系统概念
自治系统
- 一个自治系统(AS)是处于一个管理机构下的网络设备群
- AS内部网络自行管理,AS对外提供一个或者多个出(入)口
- 自治系统内部路由的协议称为:内部网关协议(RIP、OSPF)
- 自治系统外部路由的协议称为:外部网关协议(BGP)

RIP协议
DV算法

总结:
- 每一个节点使用两个向量 Di 和 Si
- Di 描述的是当前节点到别的节点的距离
- Si 描述的是当前节点到别的节点的下一节点
- 每一个节点与相邻的节点交换向量 Di 和 Si 的信息
- 每一个节点根据交换的信息更新自己的节点信息
RIP协议的过程
协议内容
- RIP协议是使用DV算法的一种路由协议
- RIP协议把网络的跳数(hop)作为DV算法的距离
- RIP协议每隔30s交换一次路由信息
- RIP协议认为跳数>15的路由则为不可达路由
具体过程
- 路由器初始化路由信息(两个向量 Di 和 Si)
- 对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
- 检索本地路由,将信息中新的路由插入到路由表里面
- 检索本地路由,对于下一跳为X的,更新为修改后的信息
- 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
- 如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)
思考: 这种协议有没有什么问题?
假设 A - B - C 三个节点, A节点发生了故障
总结:RIP协议的缺点
- 随便相信 “隔壁老王”
- “自己不思考” “视野不够”
- RIP协议适合小型的网络
OSPF协议
- Dijkstra(迪杰斯特拉)算法
- OSPF协议的过程
Dijkstra算法
它解决的是最短路径问题
- Dijkstra算法解决有权图从一个节点到其他节点的最短路径问题
- “以起始点为中心,向外层层扩展”

OSPF协议的过程
OSPF协议 包含 链路状态(LS)协议, 先来看一下LS协议
LS协议与RIP协议对比
| LS协议 | RIP协议 |
|---|
向所有的路由器发送消息 一传十、十传百 | 只和相邻路由器交换信息 |
消息描述该路由器与相邻路由器的链路状态 - 距离、时延、带宽、。。。 - 这些数据是可以人为决定的 | 只交换跳数 |
| 只有链路状态发生变化时,才发送更新信息 | 每隔30s交换路由信息 |
LS协议解决了RIP协议的两个问题
OSPF协议的过程
- 向所有的路由器发送消息
- 消息描述该路由器与相邻路由器的链路状态
- 只有链路状态发生变化时,才发送更新信息
五种消息类型
- 问候消息(Hello)
- 链路状态数据库描述信息
- 链路状态请求信息
- 链路状态更新信息
- 链路状态确认信息

BGP 协议
- BGP(Border Gateway Protocol: 边际网关协议)
- BGP协议是运行在AS之间的一种协议
一个公司到另一个公司, 一个学校到另一个学校,城市之间,国家之间都是使用BGP协议
思考: 为什在AS之间要使用这个协议
- 互联网规模很大 如使用OSPF协议, 1)每个路由器都要存储很大的数据,2)迪杰斯特拉计算最短路径很慢
- AS内部使用不同的协议 有的使用RIP协议 有的使用OSPF协议
- AS之间需要考虑除网络特性以外的一些因素(政治、安全…)

综上分析:
- BGP协议只能够找到一条到达目的比较好的路由(OSPF可以找到最佳路由)
BGP发言人
- BGP并不关心内部网络拓扑
- AS之间通过BGP发言人交流信息
- BGP Speaker可以人为配置策略 ---代价

总结:
- BGP协议能够找到一条到达目的比较好的路由
- AS之间通过BGP发言人来进行路由信息的交换