目录
1.网络协议
2.协议分层
2.1 OSI七层模型
2.2TCP/IP五层(四层)模型
2.3 以太网通信
1.网络协议
"协议"本质就是一种约定
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的 信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。即对 0 1 信号组合的诠释
思考:只要通信的两台主机约定好协议就可以了么?
- 协议的重要性
-
- 即使双方已经制定了通信协议,但如果一方使用频率来表示
01
,而另一方使用信号强弱来表示01
,这就如同一方说中文,另一方说葡萄牙语。虽然大家遵循相同的 01 通信规则,但由于“表示方式”不同,即使订立了基本协议,也无法进行正常的通信。 - 因此,一个完善的协议需要更加详细和具体的规定,并且所有参与者都必须遵守这些规定。
- 即使双方已经制定了通信协议,但如果一方使用频率来表示
- 多样化的计算环境
-
- 计算机生产厂商众多;
- 计算机操作系统多种多样;
- 计算机网络硬件设备种类繁多。
在如此多样的环境下,如何确保来自不同厂商的计算机能够顺利通信?
- 统一标准的需求:
- 解决方案是需要有一个共同的标准,即网络协议,让所有参与者都遵守这一标准。
一些思考:
技术被挖掘出了价值,广泛使用,第一生产力的特征才会表现出来,被看到。
所以占领市场,制定标准的重要性就可以理解了。
例如现在的鸿蒙系统(物联网),人工智能,大模型......现在都是在找应用场景来落地,进行普及和构建生态。
软件分层的场景:高内聚,低耦合
- 结构体和类,数据层面:继承和多态就是在实现软件分层
- 数据类型上:文件和硬件不同 struct 设计
- 线程池回调的方式
- 模块之间:虚拟内存和页表等也是一种分层
回忆回调函数
回调函数(Callback Function):将一个函数作为参数传递给另一个函数,以便在某个特定事件发生或某个条件得到满足时执行。简而言之,回调函数是一种在特定时机被调用的函数。
以下是一个简单的回调函数示例,使用C语言进行说明:复制
#include <stdio.h>
// 声明一个回调函数类型
typedef void (*callbackFunction)(int);
// 一个简单的函数,接受一个整数值和一个回调函数
void performAction(int value, callbackFunction cb) {
// ... 在这里执行一些操作 ...
// 调用回调函数
cb(value);
}
// 实现一个回调函数
void myCallback(int value) {
printf("回调函数被调用,传入的值是:%d\n", value);
}
int main() {
// 调用 performAction,并传递 myCallback 作为回调函数
performAction(42, myCallback);
return 0;
}
在上面的代码中,performAction
函数接受一个整数和一个回调函数作为参数
2.协议分层
⭕ 为什么要分层?
- 问题是层状的
- 网络很庞大
- 好维护
例如两个人打电话
- 真实情况:我们人其实在和电话沟通
- 在逻辑上:我们认为,人和人,电话和电话在沟通
本层之间有协议,层和层之间通过话筒(接口)连接
- 在这个例子中, 我们的"协议"只有两层: 语言层、通信设备层。
- 但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层
- 但是通过上面的简单例子,我们是能理解,分层可以实现解耦合
- 分层具有好维护的特征,可以实现只换同层内容
⭕ 那么网络协议是如何分层的呢?
2.1 OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解.
上三层压缩成一层。物理层就偏硬件了,所以我们具体软件工程实践的时候采用↓
2.2TCP/IP五层(四层)模型
- TCP(传输层)/IP(网络层)是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇
- TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP四层模型
结构理解:
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层
调制解调器(猫)也工作在物理层。(把模拟信号->数字信号,数字信号->模拟信号),家里安装的wifi,先是光纤接入猫,然后猫拉一个先连接路由器,路由器帮我们构建一个局域网然后我们就可以连接wifi了,我们发送的消息先传给路由器,路由器在经过物理设备猫,帮我们做数模转换把数据打到网络里然后数据才能发出去。(路由器真正识别才是真正的01这种二进制对东西)。
- 数据链路层: 负责建立设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层。确保了主机和直接连接的主机之间可以通信
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router,是涵盖关系,也有集线器,交换机......的功能)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。数据拿过来了,以什么样的形式显示
网络协议栈和 OS 有什么关系?
为什么有各种系统,却只有一种网络?
结合 用户贯穿硬件 的结构进行理解:
层状是一样的,层和层之间进行匹配
网络通信的本质:就是贯穿协议栈的过程
局域网内,两个直接连接的主机之间可以直接通信。例如投屏需要手机和电视连接同一个 wifi
- 主流的局域网通讯协议:以太网
为什么要叫以太网?
太阳光八分钟到地球,宇宙中是否存在让光传递的介质--以太,就像空气一样的?后来物理界证实不存在,就是真空的。计算机科学家Q到,我们光电传输就有--以太网~
网络协议栈的层状结构中,每一层都有协议(约定的解读)
信息传递要保证可靠性:要有序。所以每个协议层都要有自己的序号--即协议报头
报文==报头+有效载荷
网卡为什么要把数据交给内存?因为 冯诺依曼结构 规定的,到内存中才能被 OS 处理
读取:去掉该层协议报头,将给上一层。所以添加报头的时候也要考虑解包的便利性
通信的过程:本质就是不断的封装和解包的过程
所以在逻辑上,就感觉是在同层传递,例如:
⭕ 扩展:
- 几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力
- 几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力--分用
知道了这些,以后面对 封装--解包--分用,才不会困惑
这是大部分协议的共性,未来我们学习具体协议的时候,我们都会问这两个扩展问题!
2.3 以太网通信
局域网,数据如何从一个主机到另一个主机?
每台主机在局域网上,都要有自己的唯一的一个“mac 标识”
- 一个故事
老师点名张三,全班同学都听到了,每一个同学都把张三的报文报头解析和自己做对比,发现不是叫自己,张三发现是自己,回答说“到”,老师和张三之间进行了通信,班上有很多吃瓜群众
- 一个原理
网卡出厂时的有 Mac 地址,全球唯一
例如 H1 要和 H10 进行通信,所有主机在网卡硬件层都收到了,进行报头 Mac 地址对比,发现不是自己的就会进行丢弃,H10 发现是自己的,接收后向上交付
多台主机进行同时通信,以太网发生数据碰撞问题
- 所以发送主机都要执行碰撞避免的算法,保证任何时刻都只有一台主机在发送消息
- 所以局域网最好不会太大,和引入交换机
- 交换机:划分碰撞域
- 碰撞域:指在网络中,数据信号传输过程中可能发生冲突的区域。在同一个碰撞域内的所有设备共享同一物理介质,在一个碰撞域内,所有设备都监听同一个物理信道,并且任何时刻只能有一台设备发送数据。
报文被别人抓走了怎么办?为了确保网络安全,可以在应用层进行加密(令牌环),对方就看不到
如何看待局域网?
只允许一个发送,可以看作每台主机背后就是一个进程,网络的传输是共享资源,传输要互斥进行