网络——入门基础
目录
协议
网络协议
OSI七层模型
网络传输基本流程
网络传输流程图
局域网通信
数据包的封装和解包
广域网通信
网络地址管理
IP地址
MAC地址
协议
关于什么是局域网,什么是广域网,我这里就不过多赘述了,我们直接来谈一下什么是协议。
“协议”其实就是一种约定,双方想要通信就需要做某种约定,通过这种约定来完成某种特定事情。比如小时候和同学做的约定,敲一下门要做什么,敲两下要做什么。
网络协议就是通信计算机双方必须共同遵守的约定,所以用计算机语言将这种约定表达出来,双方计算机才能识别约定的相关内容。但是计算机之间的传输媒介是光信号和电信号,可能有的通过频率或者强弱来表示0或1这样的信息,有的可能通过不同的策略,因为计算机只认识0和1,所以各个做硬件的厂商也要共同遵守某种约定,让不同的计算机识别的信息是一样的。
那么操作系统要不要进行协议管理呢,那就又是先描述再组织。协议本质上就是一个软件,那么软件是可以“分层”的,什么是分层呢?曾经我们写过的各种类,在类外中我们叫做使用这个类中的方法,在类中就是方法的实现,使用和实现就是两层;面向对象的多态,实现多态就要有继承体系,每个继承体系就可以叫做一层软件层。
网络协议
所以协议在设计的时候也是要分层的。
两个人在打电话的时候,你并没有直接跟对面的人说话,而是把你的声音交给了手机,你的手机把声音交给了对方的手机,对方才能在手机中听到你的声音。
为什么要分层呢?原因就是以后的通信场景变得很复杂了,我们将功能解耦,更便于维护,某一层出了问题只需要解决某一层,其他层不会受到影响。
这些都是分层的好处,为了让网络通信也变的更好,也对网路协议进行了分层。
OSI七层模型
我们通信的复杂程度主要和通信的距离是正相关的,从通信的方面来说:
- 如果两个人的通信距离过远,会有没收到的情况,这就叫做丢包。
- 在发送的时候,如何找到对方主机的位置,这就是定位问题。
- 通信距离远的时候,我们的信息不可能直接发给对方,需要通过多个路由器帮我们跳转,那怎么保证下一个路由器是正确的。
- 不管是发送还是接收信息,都是通过信号的频率或强弱来识别的,也要有硬件的支持。
再从我们应用的方面来说:
- 为了实现通信,我的数据一定是经过一些处理才发给对方的,对方收到了也是要经过处理才能看得懂,那如何处理数据也是一个问题。
为了解决上面的这些问题,就有了网络协议的层状结构,这些问题对应的层分别是:传输层、网络层、数据链路层、物理层、应用层。
我们也把左边的网络协议层也叫做TCP/IP协议。
未来我们也是使用传输层提供的系统调用接口进行网络编程。
物理层:
负责光电信号的传递,他决定了最大传输速率、传输距离等。数据链路层:
负责设备之间的数据帧的传送和识别,例如网卡驱动,交换机就工作在数据链路层。数据链路层和物理层就负责数据的发送过程。
网络层:
负责地址的管理和路由的选择,路由器工作在网络层。传输层:
负责两台主机的数据传输,确保数据的可靠发送。比如传输过程中可能会出现丢包问题。应用层:
负责应用程序之间的沟通,应用层需要根据通信的目的,对数据进行分析与处理,达到某种业务性的目的。这一层一层的结构也叫做网络协议栈,网络协议栈的下三层主要的完成就是信息传输,而应用层完成的就是数据分析和业务处理。
但其实最开始提出的协议层并不是TCP/IP协议,而是OSI七层模型。
- OSI(Open System Interconnection,开放系统互联)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范。
- 把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器工作在网络层,交换机工作在数据链路层。
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输。
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
- 但是, 它既复杂又不实用,所以我们都是使用TCP/IP四层或五层模型,物理层也不会考虑太多。
网络传输基本流程
网络传输流程图
局域网通信
同一个局域网下的两台主机的通信流程就是这样的:
这幅图举个例子就很好理解了,你住在一栋楼的10楼,你现在要给另一栋也住在10楼的小伙伴送个东西,那你一定要一层一层的下楼,然后跑到他的楼下,再一层一层的上楼,这样你才能把东西送给他,他也不会管你是怎么来的。
所以局域网中的两台主机是可以直接通信的。那我们接下来就要再说一下网络的概念:
- 每层都有自己的协议定制方案。
- 每层协议都要有自己的协议报头。
- 从上到下交付数据的时候要添加报头。
- 从下到上拿到数据的时候要去掉报头。
再来举个例子说一下什么是报头,我们买东西的时候一定是在网上给卖家说我要买这个,经过一系列的操作,卖家要被快递交给物流,物流拿到东西之后一定要给这个快递贴上快递的信息,再经过一系列操作到了楼下的快递站,我们从快递站拿到这个快递,拆开就能用了。这个快递中的物品就好比是数据,这个快递信息就好比是协议报头,通过这个报头就可以送到我楼下的快递站,我拿到了快递再拆开去掉协议报头就拿到了里面的数据。
数据包的封装和解包
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在数据链路层叫做帧(frame)。
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(报头),称为封装。
- 首部信息中包含了一些类似于首部有多长,有效载荷有多长,上层协议是什么等信息。
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再将报头和有效载荷分离,根据首部中的 "上层协议 字段" 将数据交给对应的上层协议处理,这叫做解包。
这次就不是快递了,比如我们给同学发微信:
通过对数据一层一层的封装,送到另一台主机后再一层一层的解包,所以两台主机在每一层都以为自己在和另一台主机的相同层在逻辑上直接通信,所以不可能把以太网帧直接发给网络层或者其它层。
在同一个局域网中。除了当前正在通信的主机A和主机F还有其他主机,那怎么只有主机F收到了呢?
实际主机A发数据给主机F的时候,其他主机也都收到了该数据,只不过除了主机F以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。
如果主机A不仅在和主机F通信,还和别的主机也在通信,但是同一个局域网中使用的都是同一个通信信道,每个主机发出的数据就可能会相互干扰。
每个局域网也可以看做一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,这两台主机在该碰撞域中就发生了碰撞。
那么如何判断发生了碰撞呢?当一个主机将数据发送到局域网,它自己也可以收到这个数据,收到后与之前发送的数据进行比较,如果不同就说明发生了碰撞。
想要处理碰撞其实很简单,当一个主机发送出去的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据。但是计算机处理的速度很快,所以发生的概率不是很大。
广域网通信
上面说了局域网通信,那我们再来说一下广域网通信,前面我们提到过,我要给很远的一台主机发送信息,要先遵守应用层的协议,通过传输层稳定的把数据发送过去,通过网络层确定是那一台主机,通过数据链路层和物理层发送和接收信号。
局域网之间都是通过路由器连接起来的,一个路由器至少能够横跨两个局域网。这些被路由器连接的局域网都认为该路由器就是本局域网内的一台主机,所以路由器可以和这些局域网内的任意一台主机进行直接通信。
主机A使用自己的MAC地址封装报头,到了路由器时解包向上交付,路由器看到IP地址后就知道要转发到哪一个主机下。所以在使用TCP/IP协议时,IP及其向上的协议看到的报文都是一样的,只有数据链路层的MAC会变成不同的,这里只有一个路由器,但事实上是会有很多路由器才能跳转到对应的主机的。
网络地址管理
IP地址
- IP地址是在IP协议中标识网络中不同主机的地址。
- 对于IPv4来说,IP地址是一个4字节,32位的整数。
- 我们通常也使用“点分十进制”的字符串表示IP地址,例如192.168.16.1,用点分割的每一个数字表示一个字节,范围是0-255。
需要注意的是,IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址。
MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示(例如:00:16:3e:03:92:10)。
- 在网卡出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)。
那我们再来重新看一下广域网通信。
如果我在北京,我要给上海的朋友发消息,所以我在北京的主机的IP地址就叫做源IP,上海的朋友的主机的IP地址就叫做目的IP,比如这个信息要先传给当前地区的路由器,这条信息封装了MAC地址,这就是源MAC地址,通过自己家里的路由器放到当前地区的路由器,这就是下一站的MAC地址。
从消息发出到收到消息,源IP和目的IP都是不会变的,他要给下一站提供方向,会变化的就是MAC地址,通过当前地区的路由器就知道下一个路由器在哪里,继续封装MAC地址,这样一步步把消息传递过去。
上述的源IP和目的IP、源MAC和下一站MAC都分别保存在对应层的报头中。
在Linux中查看自己的MAC地址就要使用ifconfig命令。
这个ether就有以太的意思。
相关文章:
网络——入门基础
目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网,什么是广域网,我这里就不过多赘述了,我们直接来谈一下什么…...
二、yocto 集成ros2(基于raspberrypi 4B)
yocto 集成ros2 yocto 集成ros21. 下载ros layer2. 编译集成ros3. 功能验证 yocto 集成ros2 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第二篇文章。 一、yocto 编译raspberrypi 4B并启动 本节我们将ros2机器人操作系统移植到我们的yocto系统里面。 1. 下载ros laye…...
html--bug
文章目录 html html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>老师</title><style>body {background-color: #008000;margin: 0px;cursor: none;overflow: hidden;}</style></head><bod…...
Java基础学习笔记三
环境变量CLASSPATH classpath环境变量是隶属于java语言的,不是windows操作系统的,和PATH环境变量完全不同classpath环境变量是给classloader(类加载器)指路的java A 。执行后,先启动JVM, JVM启动classload…...
Linux快速入门,上手开发 01.学习路线
少时曾许凌云志,当取世间第一流 再见少年拉满弓,不惧岁月不飓风 —— 24.3.20 1.Linux的发展历史 2.VM虚拟机的Linux初体验 3.图形化页面设置系统——快速上手 4.命令行操作——向专业前进 5.核心操作命令——必知必会(管理企业级权限/定位b…...
JSX return里面如何用if判断
在JSX中,由于不能直接使用传统的JavaScript if 语句,但可以通过条件渲染来实现类似的效果。以下是一些方法: 1. 三元运算符(Ternary Operator) 最简单的条件渲染方式是使用三元运算符: return (<div>{condition ? <ComponentIfTrue /> : <Com…...
Vulnhub靶机渗透:DC-7打靶记录
前言 自信自强,来自于不怕苦、不怕难的积淀。宝剑锋从磨砺出,梅花香自苦寒来;任何美好理想,都离不开筚路蓝缕、手胼足胝的艰苦奋斗! 靶场介绍 DC-7是一个初中级的靶场,需要具备以下前置知识:…...
目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)
常见IoU解读与代码实现 一、✒️IoU(Intersection over Union)1.1 🔥IoU原理☀️ 优点⚡️缺点 1.2 🔥IoU计算1.3 📌IoU代码实现 二、✒️GIoU(Generalized IoU)2.1 GIoU原理☀️优点⚡️缺点 2…...
探索并发编程:深入理解线程池
文章目录 前言一、线程池是什么?二、如何创建线程池1.使用Executors类2.使用ThreadPoolExecutor类手动配置线程池 总结 前言 随着计算机系统的不断发展和进步,我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制,…...
html5cssjs代码 023 公制计量单位进位与换算表
html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页,用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…...
UE5.3 StateTree使用实践
近期浏览UE的CitySample(黑客帝国Demo),发现有不少逻辑用到了StateTree学习一下,StateTree是多层状态机实现,以组件的形式直接挂载在蓝图中运行。 与平时常见的一些FSM库不同,StateTree并不会返回给外界当…...
【09】进阶JavaScript事件循环Promise
一、事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后,就可以运行程序的代码了。 运行代码的「人」称之…...
蓝桥备赛----基本语法总结
文章目录 输入输出知识点总结 输入 单个 #单个输入n input() #无参数 默认返回字符串n input("有提示参数的输入") #有提示性输入语句的输入,仍是以str类型返回n int(input()) #根据给定的类型输入,返回值类型intn float(input()) #根据…...
基于 Echarts + Python Flask ,我搭建了一个动态实时大屏监管系统
一、效果展示 1. 动态实时更新数据效果图 2. 鼠标右键切换主题 二、确定需求方案 支持Windows、Linux、Mac等各种主流操作系统;支持主流浏览器Chrome,Microsoft Edge,360等;服务器采用python语言编写,配置好python环…...
针对教育行业的网络安全方案有哪些
智慧校园”是教育信息化进入高级阶段的表现形式,比“数字校园”更先进。集体知识共融、共生、业务应用融合创新、移动互联网物联网高速泛在是其重要特征。特别是在互联网教育的大环境下,为了更好的发挥智慧化教学服务和智慧化教学管理功能,需…...
C++ 编程入门指南:深入了解 C++ 语言及其应用领域
C 简介 什么是 C? C 是一种跨平台的编程语言,可用于创建高性能应用程序。 C 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展。 C 为程序员提供了对系统资源和内存的高级控制。 该语言在 2011 年、2014 年、2017 年和 2020 年进行了 4…...
latex变量上下加自适应长度箭头
latex变量上下加自适应长度箭头 在变量上加箭头的代码如下 % 在上 \overrightarrow{A B} \overleftarrow{A B} % 在下 \underrightarrow{A B} \underleftarrow{A B}得出的结果依次如下 A B → , A B ← , A B → , A B ← \overrightarrow{A B},\overleftarrow{A B}, \under…...
鸿蒙4.0ArkUI快速入门(一)应用模型
ArkUI篇 应用模型Stage模型FA模型模型对比 应用模型 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。 HarmonyOS先后提供了两种应用模型: FA(Feature Ability)模型&…...
C++ UML类图
参考文章: (1)C UML类图详解 (2)C基础——用C实例理解UML类图 (3)C设计模式——UML类图 (4)[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之…...
Java SE入门及基础(44)
目录 I / O流(上) 1. 什么是I / O流 过程分析 I / O的来源 Java 中的 I / O流 2. 字节流 OutputStream 常用方法 文件输出流 FileOutputStream 构造方法 示例 InputStream 常用方法 文件输入流 FileInputStream 构造方法 示例 综合练习 字节流应用场景 Java SE文…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...






