当前位置: 首页 > news >正文

[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 发现是自己的,接收后向上交付

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

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

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

如何看待局域网?

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报
  • Xor Sigma Problem
  • CSS系列之浮动清除clear(三)
  • 数据库mysql集群主从、高可用MGR、MHA技术详解
  • Go 语言生产服务故障案例精析
  • 黑马JavaWeb开发笔记09——ElementUI代码引入教程、Element常用组件使用(Table, Pagination, Dialog, Form)
  • python爬虫源码:selenium+browsermobproxy实现浏览器请求抓取
  • 7- 排序算法
  • 如何本地搭建Whisper语音识别模型
  • netty之ChannelOption
  • 数据库入门: 从 0 到 1 理解数据管理
  • Visual Basic:企业级应用开发的稳健之选
  • Dubbo ZooKeeper Spring Boot整合
  • Java | Leetcode Java题解之第381题O(1)时间插入、删除和获取随机元素-允许重复
  • Java-InputStream、MultipartFile和File相互转换工具类
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • js
  • Spring Cloud中负载均衡器概览
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 飞驰在Mesos的涡轮引擎上
  • 复习Javascript专题(四):js中的深浅拷贝
  • 简单易用的leetcode开发测试工具(npm)
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 跳前端坑前,先看看这个!!
  • 一天一个设计模式之JS实现——适配器模式
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (学习日记)2024.01.19
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net IOC框架入门之一 Unity
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net 中Partitioner static与dynamic的性能对比
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @Async 异步注解使用
  • [] 与 [[]], -gt 与 > 的比较
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android] Android ActivityManager
  • [APIO2012] 派遣 dispatching
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [DevEpxress]GridControl 显示Gif动画
  • [dfs] 图案计数