[Linux#47][网络] 网络协议 | TCP/IP模型 | 以太网通信

目录

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 处理

读取:去掉该层协议报头,将给上一层。所以添加报头的时候也要考虑解包的便利性

通信的过程:本质就是不断的封装和解包的过程

所以在逻辑上,就感觉是在同层传递,例如:

⭕ 扩展:

  1. 几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力
  2. 几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力--分用

知道了这些,以后面对 封装--解包--分用,才不会困惑

这是大部分协议的共性,未来我们学习具体协议的时候,我们都会问这两个扩展问题!

2.3 以太网通信

局域网,数据如何从一个主机到另一个主机?

每台主机在局域网上,都要有自己的唯一的一个“mac 标识”

  1. 一个故事

老师点名张三,全班同学都听到了,每一个同学都把张三的报文报头解析和自己做对比,发现不是叫自己,张三发现是自己,回答说“到”,老师和张三之间进行了通信,班上有很多吃瓜群众

  1. 一个原理

网卡出厂时的有 Mac 地址,全球唯一

例如 H1 要和 H10 进行通信,所有主机在网卡硬件层都收到了,进行报头 Mac 地址对比,发现不是自己的就会进行丢弃,H10 发现是自己的,接收后向上交付

多台主机进行同时通信,以太网发生数据碰撞问题

  • 所以发送主机都要执行碰撞避免的算法,保证任何时刻都只有一台主机在发送消息
  • 所以局域网最好不会太大,和引入交换机
  • 交换机:划分碰撞域
  • 碰撞域:指在网络中,数据信号传输过程中可能发生冲突的区域。在同一个碰撞域内的所有设备共享同一物理介质,在一个碰撞域内,所有设备都监听同一个物理信道,并且任何时刻只能有一台设备发送数据。

报文被别人抓走了怎么办?为了确保网络安全,可以在应用层进行加密(令牌环),对方就看不到

如何看待局域网?

只允许一个发送,可以看作每台主机背后就是一个进程,网络的传输是共享资源,传输要互斥进行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409033.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS浮动和清除浮动的效果及其应用场景举例

一、清除浮动的效果 解释 .container&#xff1a;用于展示浮动和清除浮动效果的容器&#xff0c;具有边框和背景色以便于区分。 .float-box&#xff1a;浮动元素&#xff0c;用不同的背景色标识。 .clearfix&#xff1a;使用伪元素清除浮动的类&#xff0c;应用于第二个容器。 …

IDEA 2024.2.0.2 使用 Jrebel and XRebel 热部署

安装 激活 工具网站中url和邮箱复制进去 设置 允许项目自动构建 允许开发过程中自动部署

python面向对象—封装、继承、多态

封装 ① 把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装 ② 封装可以为属性和方法添加为私有权限&#xff0c;不能直接被外部访问 在面向对象代码中&#xff0c;我们可以把属性和方法分为两大类&#xff1a;公有&#xff08;属性、方法&#xff09;、私有&…

SQLSugar进阶使用:高级查询与性能优化

文章目录 前言一、高级查询1.查所有2.查询总数3.按条件查询4.动态OR查询5.查前几条6.设置新表名7.分页查询8.排序 OrderBy9.联表查询10.动态表达式11.原生 Sql 操作 &#xff0c;Sql和存储过程 二、性能优化1.二级缓存2.批量操作3.异步操作4.分表组件&#xff0c;自动分表5.查询…

LCP:60 排列序列[leetcode-4]

LCP:60 排列序列 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213""231""312"&quo…

09 复合查询

前面的查询都是对一张表进行查询&#xff0c;但这远远不够 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or job‘MANAGER’) and ename like ‘J%’; 按照部门号升序而雇员的…

【git】git进阶-blame/stash单个文件/rebase和merge/cherry-pick命令/reflog和log

文章目录 git blame查看单个文件修改历史git stash单个文件git rebase命令git rebase和git merge区别git cherry-pick命令git reflog和git log区别 git blame查看单个文件修改历史 git blame&#xff1a;查看文件中每行最后的修改作者 git blame your_filegit log和git show结合…

基本数据类型及命令

String String 是Redis最基本的类型&#xff0c;Redis所有的数据结构都是以唯一的key字符串作为名称&#xff0c;然后通过这个唯一的key值获取相应的value数据。不同的类型的数据结构差异就在于value的结构不同。 String类型是二进制安全的。意思是string可以包含任何数据&…

requests库

一、pycharm导入requests库 在终端下输入pip install requests 按回车即可导入。 如果使用pip list 可以查到requests库即导入成功。 二、requsets的get请求 url为我们要请求的网址&#xff0c;headers用于伪造请求头&#xff0c;有的网址拒绝爬虫访问。 # # GET # import r…

【JAVA基础】四则运算符

文章目录 四则运算结合运算符自增运算符关系和boolean运算符 四则运算 在java当中&#xff0c;使用运算符、-、*、/ 表示加减乘除&#xff0c;当参与 / 运算的两个操作数都是整数的时候&#xff0c;表示整数除法&#xff1b;否则表示浮点数。整数的求余操作用 % 表示。 Syste…

svn使用教程学习

如何撤销未提交的本地修改&#xff1f; 点击svn提交&#xff0c;双击文件&#xff0c;可以查看准备提交的修改内容。 如何撤销已经提交的内容&#xff1f; 选择‘复原此版本做出的修改’&#xff1a; 但是&#xff0c;这个只是复原在本地了&#xff0c;我们需要提交上去&…

【大模型理论篇】Mixture of Experts(混合专家模型, MOE)

1. MoE的特点及为什么会出现MoE 1.1 MoE特点 Mixture of Experts&#xff08;MoE&#xff0c;专家混合&#xff09;【1】架构是一种神经网络架构&#xff0c;旨在通过有效分配计算负载来扩展模型规模。MoE架构通过在推理和训练过程中仅使用部分“专家”&#xff08;子模型&am…

C语言 | Leetcode C语言题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; typedef struct {int tweetId;int userId; } Tweet;typedef struct {int* dict[501];Tweet* tweetList;int tweetListLen; } Twitter;Twitter* twitterCreate() {Twitter* obj malloc(sizeof(Twitter));for (int i 0; i < 501; i) {ob…

在vscode上便捷运行php文件

目录 前言 1. 准备工作 2. 创建文件 3. 下载插件 4.设置访问配置文件 5. 配置默认浏览器 6. 进行验证 前言 对于学习安全的我们来说,部署环境,靶场,和配置环境都是习以为常的一件事情,平时访问靶场都是通过小皮来,今天突想着最近需要对一些漏洞的原理进行研究,所以需要能够…

iOS 17.6.1版本重发,修复高级数据保护错误

今日&#xff0c;苹果没有带来iOS 17.6.2的更新&#xff0c;而是重新发布了iOS 17.6.1版本&#xff0c;本次升级版本号为21G101&#xff0c;高于第一版的21G93。距离初版发布相隔一周半时间。 在 iOS / iPadOS 17.6.1 的更新日志&#xff0c;苹果公司写道&#xff1a;“此更新包…

【生日视频制作】一排美女在越野车上跳舞拉横幅条幅AE模板修改文字软件生成器教程特效素材【AE模板】

一排美女在越野车上跳舞拉条横幅生日视频制作教程AE模板改字 怎么如何做的【生日视频制作】一排美女在越野车上跳舞拉横幅条幅AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频…

怎样更改电脑的MAC地址?

怎样更改电脑的MAC地址&#xff1f; 电脑的机器码是可以修改的。 操作步骤&#xff1a; 1、通过按WINR键&#xff0c;调来电脑的接运行窗口&#xff0c;打开CMD命令来查看机器码。 2、命令提示符窗口里输入ipconfig /all&#xff0c;回车&#xff0c;即可显示出当前电脑的网…

Linux内核定时器、阻塞_非阻塞IO

一.内核时间管理 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率…

Bootstrap 滚动监听(Scrollspy)插件

滚动监听&#xff08;Scrollspy&#xff09;插件&#xff0c;即自动更新导航插件&#xff0c;会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动&#xff0c;基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能&#xff0c;那…

【前端】文件上传框架plupload使用(前后端交互)

这个框架是用来给前端设置文件上传的按钮的。 首先要明白&#xff0c;前端向后端发送请求的方式有get和post&#xff0c;两者的区别在于&#xff0c;前者只能在网址中携带参数&#xff0c;后者是在请求体body中携带参数。 Plupload向后端发送请求是post请求方式&#xff0c;发送…