网络原理-初识(2)

协议分层

对于网络协议来说,往往分成几个层次进行定义.

网络通信的过程中,需要涉及到的细节,其实非常多.如果要有一个协议来完成网络通信,就需要约定好方方面面的内容,导致非常复杂. 而如果拆分的话,就十分复杂,庞大,因此需要分层.

什么是协议分层

即只有相邻的层次可以沟通,不能跨层次调用.

协议分层类似于打电话时,定义不同层次的协议:

某一层的协议替换之后,对于其它层没有影响

在这个例子中,我们的协议只有两层;但实际的网络通信会更加复杂,需要分更多的层次.

分层的作用

为什么需要网络协议的分层?

分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接

在代码中,类似定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):

对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可.

对于提供方来说,利用封装的特性,隐藏实现的细节,只需要开放接口即可.

上层协议直接使用下层协议即可,不需要了解下层协议的细节.(相当于下层协议把细节封装好了). 

这样就能很好的扩展和维护,如下图:

 

OSI七层模型

OSI:即Open System Interconnection,开放系统互连.

OSI七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了七层.

OSI七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输; 

OSI:七层模型划分为以下七层:

 

 

OSI七层模型既复杂又不实用:所以OSI七层模型没有落地,实现.

实际组件网络时,只是以OSI七层模型设计中的部分分层,也即是以下TCP/IP五层(或四层)模型来实现.

TCP/IP五层(或四层)模型

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.

TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.

应用层:负责应用程序间的沟通,如简单电子邮件传输,文件传输协议,网络远程访问协议等.我们的网络编程主要就是针对应用层.(程序拿到数据之后,要用来干啥,解决什么问题)

传输层:负责两台主机之间的数据传输.如传输控制协议,能够确保数据可靠的从源主机发送到目的主机.(负责关注网络数据的起点和终点(从哪里来到哪里去),端与端的运输).

 网络层:负责地址管理和路由选择.例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).路由器工作在网络层.

数据链路层:负责设备之间的数据帧的传送和识别.例如网卡设备的驱动,帧同步(就是说从网线上检测到什么作为新的帧的开始),冲突检测(如果检测到冲突就自动重发),数据差错校验等工作.有以太网,令牌环网,无线LAN等标准.交换机工作在数据链路层.(负责两个相邻结点的运输)

物理层:负责光/电信号的传递方式.比如现在的以太网通用的网线,早期以太网采用的同轴线缆(现在主要用于有线电视),光纤,现在的wifi无线网使用电磁波都属于物理层的概念.物理层的能力决定了最大传输速率,传输距离,抗干扰性.集线器工作在物理层.(通信过程之间的物理措施)

说是五层,实际上下面都是在操作系统内核,硬件,驱动程序中已经实现了的(计算机内置的).作为程序员,在网络编程中影响到的只有应用层.

 网络设备所在分层

对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型中的下四层.

对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;

对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP模型的下两层;

对于集线器,它只实现了物理层.

注意这里说的是传统意义上的交换机和路由器,也称为二层交换机(工作在TCP/IP五层模型的下两层),三层路由器(工作在TCP/IP五层模型的下三层).

随着现在网络技术的不断发展,也出现了很多3层或者4层交换机,4层路由器.

网络分层对应

网络数据传输时,经过不同的网络结点(主机,路由器)时,网络分层需要对应.

以下为同一个网段中两台主机进行文件传输:

 

以下为跨网段的主机文件传输:数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.

 

封装和分用

网络传输数据的过程中,最核心的流程

1.不同协议层对数据包有不同的称谓:包(packet)->IP数据包, 段(segment)->TCP数据段,

报(datagram)->UDP数据报,帧(frame)->以太网数据帧.

2.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装

3.首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息.

4.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥离出相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理

下面以A给B通过QQ发送一条"hello"信息来讲解以下具体过程.

封装

1.应用层(应用程序)QQ

QQ从消息输入框中获取到用户输入的hello.就要把这个字符串构造成一个应用层的数据包.QQ这样的程序内部就设置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式(字符串拼接)来构造的.

eg:约定格式如下:

应用程序就会调用操作系统的api,把这个数据包交给传输层.

2.传输层

传输层就会把上述数据作为一个整体,再构成一个传输层的数据包.传输层涉及到的协议,最主要的就是TCP/UDP.此时假定使用UDP来通信,就会构成一个UDP的数据包

形如上述,添加报头的过程,就叫做封装,其实就是字符串拼接,不过拼的报头,具有一定结构

拼好传输层数据包之后,就要把这个数据包进一步交给下层,网络层就继续封装了.

交给下层:指的是下层协议提供一组api(函数),上层调用这个api,并且把刚才构造好的数据通过参数传递下去,下层协议就可以处理这个数据了.

UDP报头,虽然不能保护数据,但可以起到贴标签的类似效果.就能承载一些的关键的用来发数据信息.

对于UDP系统,承载的最重要的信息就是源端口和目的端口.

3.网络层(这里涉及到最核心的IP协议)

网络层IP协议就是把刚才的传输层UDP数据包作为一个整体,再拼上IP协议的报头,构成一个IP数据包.

IP协议,相当于整个UDP数据包视为一个整体了.

构造成完整的IP数据包之后,IP协议继续调用链路层的api,把数据再交给链路层这里的协议进行处理.

4.数据链路层(这里涉及到的核心协议-以太网(以太指的是网络传输的介质))

以太网就是目前最常见到的"有线网络",以太网数据帧:也是以一个数据包作为整体,在此基础上加上帧头,帧尾.

5.物理层(硬件设备)

把上述这样的以太网数据帧,二进制结构(一串010101这样的数据),转换成电信号(网线)/光信号(光纤)/电磁波(无线wifi)进行发送.

分用

暂时不考虑中间过程,假定数据包已经到达B的网卡了,B如何处理,B的处理过程,就称为分网

1.B的物理层收到了光信号/电信号/电磁波,就会把这些物理信号转换为数字信号(二进制0101)

得到一个以太网数据帧,进一步将数据帧交给数字链路层处理.

2.数据链路层,以太网(发送方和接收方一样的协议才行).按照以太网数据帧的格式来解析,取出其中的载荷,再交给上层协议.

3.网络层IP协议:按照IP协议的格式进行解析,取出其中的载荷,再交给上层协议.

4.传输层UDP协议:按照UDP协议的格式进行解析,取出其中的载荷,再交给上层协议.

5.应用层QQ程序:按照QQ应用程序的应用层协议格式解析数据.

分用过程,就是逆向的封装过程.

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

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

相关文章

java如何获取多线程的返回值?

想要获取多线程的返回值,开启线程的方式就只能选择使用实现Callable接口的方式了,同实现Runnable接口的方式不同,实现Callable的方式有两大优点,第一个是能够获取到线程任务异步执行的结果,第二个是,当任务…

代码随想录 Leetcode102. 二叉树的层序遍历

题目&#xff1a; 代码(首刷看解析 2024年1月24日&#xff09;&#xff1a; class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if(root nullptr) return res;queue<TreeNode*> que;TreeNode…

C++笔记(三)

封装意义: 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物 类在设计时&#xff0c;可以把属性和行为放在不同的权限下&#xff0c;加以控制。 访问权限有三种&#xff1a; public 公共 类内 类外都可以访问&#xff0c; protected保护 类内可以访问…

蓝桥杯备战——5.动态数码管扫描

1.分析原理图 经查阅说明书得知数码管为共阳极&#xff0c;共阳端口接到了U8,而段码接到了U7。 如果需要选中U8,我们只需要将P250;P261;P271; 如果需要选中U7,我们只需要将P251;P261;P271; 2.代码示例 void Delay1ms() //12.000MHz {unsigned char data i, j;i 12;j 169;…

ubuntu20.04 格式化 硬盘 扩展硬盘GParted

如何在 Ubuntu 22.04 LTS 上安装分区编辑器 GParted&#xff1f;_gparted安装-CSDN博客 sudo apt install gparted 步骤5&#xff1a;启动GParted 安装完成后&#xff0c;您可以在应用程序菜单中找到GParted。点击它以启动分区编辑器。 通过以上步骤&#xff0c;您可以在Ubun…

【2024】新建mysql数据库,如何选择字符集和排序规则

如何使用 Navicat 新建 MySQL 数据库&#xff0c;并选择字符集与排序规则 如何使用 Navicat 新建 MySQL 数据库并选择字符集与排序规则1. 开始之前2. 新建数据库步骤 1: 打开 Navicat步骤 2: 创建新数据库步骤 3: 填写数据库名称 常见的字符集和排序规则及其选择场景1. 字符集&…

7.前端--CSS-复合选择器

1.什么是复合选择器 复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的&#xff0c;可以更准确、更高效的选择目标元素&#xff08;标签&#xff09; 常用的复合选择器包括&#xff1a;后代选择器、子选择器、并集选择器、伪类选择器等等 2.后代选择器 …

定时器越走越快的原因

在上述例子中&#xff0c;本应每1秒输出一次&#xff0c;但在多次点击按钮后会变成每0.9秒、0.8秒、0.7秒… 就输出一次&#xff0c;即定时器时间间隔越来越短&#xff0c;这就是所谓的定时器越走越快。 其实原因很简单&#xff0c;在多次点击按钮时&#xff0c;多次创建了定时…

【卡梅德生物】单域抗体|纳米抗体|VHH文库构建

单域抗体&#xff0c;也称为VHH&#xff08;Variable domain of heavy chain of HCAb&#xff09;抗体或纳米抗体&#xff0c;是一种小型抗体分子。与传统抗体相比&#xff0c;VHH具有更小的分子尺寸、更高的稳定性和更易于工程化的特点&#xff0c;具有广泛的生物医学应用潜力…

LeetCode:670. 最大交换(Java 贪心)

目录 670. 最大交换 题目描述&#xff1a; 实现代码与解析&#xff1b; 贪心 原理思路&#xff1a; 670. 最大交换 题目描述&#xff1a; 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释…

flink基础概念之什么是时间语义

什么是时间语义 Flink支持三种不同的时间语义&#xff0c;以便处理流式数据中的事件时间、处理时间和摄入时间。 1. 处理时间&#xff08;Processing Time&#xff09; 处理时间的概念非常简单&#xff0c;就是指执行处理操作的机器的系统时间。 在这种时间语义下处理窗口非…

接口自动化测试实践

众所周知&#xff0c;接口自动化测试有着如下特点&#xff1a; 低投入&#xff0c;高产出。 比较容易实现自动化。 和UI自动化测试相比更加稳定。 如何做好一个接口自动化测试项目呢&#xff1f; 我认为&#xff0c;一个“好的”自动化测试项目&#xff0c;需要从“时间”…

05-Seata下SQL使用限制

不支持 SQL 嵌套不支持多表复杂 SQL(自1.6.0版本&#xff0c;MySQL支持UPDATE JOIN语句&#xff0c;详情请看不支持存储过程、触发器部分数据库不支持批量更新&#xff0c;在使用 MySQL、Mariadb、PostgreSQL9.6作为数据库时支持批量&#xff0c;批量更新方式如下以 Java 为例 …

掌握大语言模型技术: 推理优化

掌握大语言模型技术_推理优化 堆叠 Transformer 层来创建大型模型可以带来更好的准确性、少样本学习能力&#xff0c;甚至在各种语言任务上具有接近人类的涌现能力。 这些基础模型的训练成本很高&#xff0c;并且在推理过程中可能会占用大量内存和计算资源&#xff08;经常性成…

C++:反向迭代器-reverse_iterator

目录 1.关于反向迭代器 2.反向迭代器的成员函数 1.构造 2.base 3.operator* 4.operator 5.operator-- 6.operator-> 7.operator[] 3.反向迭代器的模拟实现 小结 1.关于反向迭代器 在C中&#xff0c;可以使用反向迭代器来逆序遍历容器中的元素。反向迭代器是通过…

链表的中间结点,简单的快慢指针问题

总结 struct ListNode* middleNode(struct ListNode* head) {struct ListNode*fasthead;struct ListNode*slowhead;while( fast && fast->next)//结束条件{slowslow->next;fastfast->next->next;}return slow; }

组件冲突、data函数、组件通信

文章目录 1.组件的三大组成部分 - 注意点说明2.组件的样式冲突&#xff08;用 scoped 解决&#xff09;3.data是一个函数4.组件通信1.什么是组件通信&#xff1f;2.不同的组件关系 和 组件通信方案分类 5.prop详解prop 校验①类型校验②完整写法&#xff08;类型&#xff0c;非…

面试项目问题

1. 你们这个项目多少人在做?人员分布是怎样的?做了多长时间? 我们项目组一共十个人&#xff0c;包括四个后端开发人员、两个前端开发人员、两个测试人员和两个产品经理。 从需求分析、设计、开发到测试上线到最后的维护阶段&#xff0c;整个项目的周期大概是六个月左右。 …

REVIT二次开发设置门垛高度

步骤1 步骤2 步骤3 using System; using System.Collections.Generic; using System.Linq; using System

Redis 持久化详解:RDB 与 AOF 的配置、触发机制和实际测试

什么是持久化&#xff1f; 就是 Redis 将内存数据持久化到硬盘&#xff0c;避免从数据库恢复数据。之所以避免从数据库恢复数据是因为后端数据通常有性能瓶颈&#xff0c;大量数据从数据库恢复可能会给数据库造成巨大压力。 Redis 持久化通常有 RDB 和 AOF 两种方式&#xff…