网络发展背景
经历了 单机阶段 -> 局域网阶段 -> 广域网阶段 -> 移动互联网阶段
(简单介绍一下)
其他一些小概念
- 局域网LAN: 是把一些设备通过交换机 / 路由器连接, 形成的私有网络
- 广域网WAN: 是把更多的局域网相互连接起来,当规模足够大时形成广域网
- 交换机和路由器: 是组成网络的重要设备
- IP地址: 描述一个主机在互联网上的具体位置
- 端口号: 区分主机上的应用程序
其中最重要的就是协议 !!!
概念 : 通俗来说,协议就是 " 约定 " ,发送方规定了数据的格式,接收方要能理解这个格式, 当两边同时对上号才可以进行正常的通信
分层原因
但是由于环境的复杂, 协议也变得越来越复杂, 所以拆分出很多协议, 对其进行分类, 对不同的类别进行分层
相当于是规定了层级与层级 之间的调用关系
- 上层协议调用下层协议
- 下次协议给上层协议提供支持
- 不能跨层调用
协议分层的好处
- 分层之后可以做到, 层级与层级之间的耦合度较低
- 上层协议不必了解下层的细节, 下层也不必了解上层的细节
- 方便需要替换协议时,对某一层的协议进行替换
真实网络协议具体分层
(用快递的方式来粗略解释每层的作用)
我在淘宝上买了一件衣服
需要填写收件人地址, 收件人电话
同时要填写发件人地址, 发件人电话
比如发货地址是上海, 收货地址是福建
OSI 模型各层的描述
层级 | 描述 |
---|---|
应用层 | 相当于拆快递,关注传输过来的数据,具体要干啥。 |
传输层 | 不考虑中间路径,只关注起点与终点 就像我和淘宝卖家都不关心中间是如何传输的,只需要按时送到即可。 |
网络层 | 主要负责两个节点的路线规划 比如从上海到福建有很多路可以走,网络层会规划出一条合适的路径。 |
数据链路层 | 主要关注两个相邻节点的传输: - 上海 -> 江西可以使用卡车 - 江西 -> 福建可以使用飞机 在网络中,相邻节点是通过光纤或网线直接连接的设备。 |
物理层 | 网络通信的基础设施,比如网线、光纤等硬件设备,确保数据能够通过这些设备传输。 |
以上图可以来偶尔来看一下,便于记忆,也可以查询一下协议,毕竟协议很多
数据通过网络传输的过程
封装与分用
发送方发送数据, 数据从上到下, 依次交给对应层级的协议进行封装
接收方收到数据, 数据从下到上, 依次交给对应层级的协议进行解析
具体分析一个实例
比如 A 发一条消息给 B 在 QQ 上
- 应用层(QQ的应用程序)拿到上述的用户数据, 进行封装操作,封装成应用层的数据包
本质上是字符串拼接,区分上述字段可能会引入分隔符或长度信息来做界定
(这里只是举个例子,QQ的真实协议格式应该更加复杂)
如下图
-
传输层拿到了上述的数据
应用层要调用传输层所提供的 api 来进行处理这个数据
传输层有很多协议(前面有张图可以看), 最典型的是TCP和UDP协议
我们以UDP举例
UDP针对上述数据包进行封装
采用报头 + 载荷的方式构成(加上UDP报头, 本质上还是字符串拼接)
在此处, UDP协议给应用层数据包加上了UDP报头,就是为了贴上一层标签, 填写必要的属性.
其中最关键的就是源端口与目标端口了.
-
传输层到网络层
将上述的UDP数据包交给网络层的协议
网络层最常见的协议就是IP协议,以此举例
上述的UDP数据报到达网络层,进行进一步的封装,添加上IP协议的报头
加上IP协议的报头, 整个UDP数据报, 作为IP的载荷
其中源IP地址和目的IP地址就代表着这次传输的最初的起点和最终的终点
IP地址的结构采用点分十进制如192.168.0.1998
IP是找到主机
端口号是确定主机上哪个程序/ 进程
-
网络层交给数据链路层
里面最典型的协议叫做以太网
与前面有差别的是要添加上以太网帧头与以太网帧尾(也是字符串拼接)
mac地址, 也叫做物理地址
也是描述主机在网络中的位置
它的功能和IP 很相似
IP 用来进行网络层的路径规划
mac 用来进行描述数据链路层, 两个即将进行传输的相邻节点
从理论上来说, 每个设备都会有自己唯一的mac 地址(也就是和网卡相绑定)
-
数据链路层将上述的以太网数据帧交给物理层
物理层要将上述0101的二进制数据转化成光信号 / 电信号等方式进行传输
上述的过程操作系统帮我们都封装好了,接下来来介绍一下接受过程(忽略中间的转发过程)
接受过程与上述过程正好相反
~~
-
物理层, 网卡接收到了高低电平的二进制数据
会对这个信号进行解析, 还原成0101的二进制序列
-
从物理层交给数据链路层
此时就把上述 0101 的一系列数据当作以太网数据帧
把帧头帧尾去掉, 取出中间的载荷, 交给网络层处理
其中以太网数据帧帧头中有一个消息类型, 通过这个类型就知道网络层是 IP 协议
-
网络层
此时由网络层的 IP 协议进行解析数据报. 就是去掉 IP 报头, 然后交给传输层协议
IP 数据报, 报头中也有一个字段, 表示当前传输层用的是哪个协议
-
传输层
此处由 UDP 来解析处理, 还是去掉报头, 取出载荷,交给应用层处理
借助端口号来区分具体的应用程序
每个接受网络数据的程序都会关联上一个端口号
-
应用层
由qq这个程序, 进行解析应用层数据报的内容
取出字段, 放入程序的界面中
最终会在QQ 聊天界面出现我发送的消息
数据传输过程
参考以上(简略版)
中间的交换机, 只需要封装到数据链路层(只需要修改源mac 和 目的 mac)
中间的路由器, 则需要封装分用到网络层(也需要改 mac 地址,还需要根据目的 IP 地址进行下一阶段的路径规划)
一点点疑问
我当时想过如果自己发消息给自己会怎么样
走计算机中的环回网卡, 和真实网卡差别较大(属于特殊情况)