网络编程(2)

news2024/11/14 17:34:18

 封装和分用

1)封装:就是在数据中添加一些辅助传输的信息;

2)分用:就是解析这些信息

3)发送数据的时候,上层协议要把数据交给下层协议,由下层协议来添加一些信息

4)接收数据的时候,下层协议要把数据交给上层协议,有上层协议来进行进一步的解析

5)咱们的传输层和网络层是操作系统的内核实现的,数据链路层是驱动实现的,物理层是硬件实现的,应用层就是我们应用程序实现的,层层封装,层层分用,最终成为了物理层上面的01这样的数据流,转化成高低电平或者是高频低频电磁波,这些数据通过物理层的介质进行传输

以QQ的发送方和接收方为例,此时发送方发送一个hello

1)QQ软件会按照一定的规则,QQ程序员约定的通信协议把根据用户输入的字符串,并把这个字符串构造成一个应用层数据包,也是一个应用层的协议报文,咱们在这里面所说的协议是一种约定,报文就是说遵循了这个约定的一组数据;

2)咱们的QQ中的代码就会根据程序员所进行设计的应用层协议,来进行构建出一个应用层的数据报文,咱们的这个协议长成什么样子,都是由程序员来自己进行约定的

咱们的QQ使用的应用层协议,完全是由开发QQ的程序员来进行约定的

咱们的LOL使用的应用层的协议,完全是由LOL的程序员来进行约定的

咱们的淘宝使用的应用层的协议,完全是由淘宝的程序员来进行约定的

换句话说咱们作为一个外人,是不知道QQ所进行使用的应用层协议,并且显然上面的这些不同程序中所进行使用的应用层的协议是不一样的,所以我们在工作中,也是需要按照需求来进行确定应用层的协议

3)其他传输层,网络层的协议都是现成的,都是操作系统,硬件,驱动已经设计好的,但是应用层的协议,是程序员自己设定的;

咱们的应用层协议就会调用操作系统提供的API,我们称之为SocketAPI,把应用层的数据交给传输层,是用户态做的,进入到咱们的传输层,就是相当于进入到操作系统内核了;

传输层(也就是操作系统内核)

咱们的传输层根据刚才传输过来的数据,基于当前的传输层协议,来构建出一个传输层的协议报文

在咱们的TCP报头里面,是存在着很多信息的,其中最重要的是,就是源端口和目的端口;

这个TCP抱头其实就是字符串拼接的意思,报头中的信息和应用层数据包中打包的信息都是辅助网络传输的信息,传输层又把这个数据交给网络层;

 网络层:(操作系统的内核里面)

1)网络层又会把刚才传输层包装好的数据再打包成一个网络层的数据包,此处使用的是IP协议,咱们的网络这里面的封装,主要是为了加上辅助传输的信息,是为了发送给正确的人

2)咱们这里面的网络层拿到了完整的传输层数据包,有会根据当前的网络层协议IP协议,再次封装,把咱们的TCP数据包构造成IP数据包,还是添加上一个协议报头;

咱们的IP数据包里面有有原IP和目的IP,此处的IP报头,也是一个字符串拼接,紧接着当前的网络层协议会把这个IP数据包交给数据链路层

数据链路层:(驱动程序)

1)在IP数据包的基础上面,我们会根据当前使用的的数据链路层的协议,给进行构造出一个数据链路层的数据包,典型的数据链路层的协议,就叫做以太网,就会构造出一个以太网数据帧;

2)数据链路层:数据链路层会把这个数据包打包成数据链路层的数据包,例如:在这层协议中使用的是以太网,就会把这个数据按照以太网的数据帧的格式进行储存,此处的桢,就是一个字符串拼接

3)我们先把IP数据包视为一个整体,我们就是类似于字符串拼接的方式来构造出数据帧头和数据帧尾

1)咱们的以太网数据帧的最重要的信息就是说接下来应该把这个数据传输给哪一个地址;

2)咱们的IP协议里面所写的地址是起点和终点,但是咱们的以太网数据帧祯头祯尾里面所写的地址,是接下来一个相邻节点的地址;

3)随着我们数据往下一个设备进行转发,咱们祯头中的地址,其实在一直发生着改变;

4)我们随着数据在往下一个设备进行转发,咱们的祯头祯尾里面写的地址一直在发生改变;

5)咱们的祯尾里面其实是校验和;

咱们的数据链路层,又会把这个数据交给物理层

物理层(硬件设备)

1)物理层会把这个以太网数据祯的数据以二进制的形式,转换成0/1这样的光信号或电信号,并进行传输,通过网络/光纤/无线电网络发送,所以说发送方层层的构造拼装数据就叫做封装;

2)我们物理层所做的工作,其实本质上来说就是我们把刚才的以太网数据祯,其实本质上就是一组0和1,我们会把这里面的0和1变成高低电平,通过网线传输出去,或者说我们把这里面的0和1变成高频或者是低频的电磁波,通过光纤或者无线的方式来进行传输出去

1)我们无论构造怎么样子的数据,基本上都是0和1,无非都是一些高电平低电平,一些高频低频的电磁波而已,所以说这是一种数据完全发送出去的过程

2)封装就是说从上到下,数据从上层协议交给下层协议,由下层协议来进行封装,这样子就可以来进行构造出了一个该层协议的报文,然后会一直往下,直到物理层才会真正地结束

1)到了刚才这一步之后之后,我们的数据就已经离开了当前主机,前往了下一个设备,下一个设备,可能是路由器,也有可能是交换机,也有可能是其他设备;

2)比如说我们要把数据从A发送给B,A和B之间并不是网线直连的,在我们的中间的过程中就会有很多的路由器和交换机来进行完成路由的转发;

物理层(硬件设备也是一个网卡)

1)光电信号到达了接收端主机后,不考虑中间的转发过程,最先到达接收端的物理层,物理层把这个光电信号转成0/1的二进制序列,也就是得到了那个以太网数据帧,把该数据帧交给数据链路层;

2)主机B的网卡感知到了一组高低电平,然后就会把这些电平翻译成0和1的一串数据,然后这一串0和1就是一个完整的以太网数据帧的格式,于是物理层就会把我们的这些数据交给数据链路层,开始向上进行交付;

数据链路层(驱动程序):

1)数据链路层接收到物理层的数据帧,

2)数据帧再对这个以太网数据帧进行分析,将数据帧去掉帧头和桢尾,把中间的负载获取到,交给上层协议(网络层);

3)咱们的数据链路层会针对这个数据进行解析,去掉以太网数据祯头和以太网数据祯尾,取出里面的IP数据包,然后再交给网络层协议;

网络层(操作系统内核)

1)网络层获取到数据链路层传递过来的数据包后,IP协议就会按照协议格式再来解析这个数据包,去掉IP报头,获取其中的负载部分,再把这个部分交给上层的传输层,这个负载部分就是一个完整的TCP的数据包;

2)咱们的网络层(IP协议)又会对这个数据包进行解析,我们会去掉IP协议报头,取出里面的TCP数据包,然后交给传输层来进行解析

传输层(操作系统内核)

传输层获取到了数据包,传输层的TCP协议再去解析这个数据,去掉TCP报头后,就交给应用层了

应用层(应用程序和QQ)

1)咱们的应用层就会调用操作系统的SocketAPI,于是就从内核中读取到了这个应用层数据包

2)咱们的应用程序就会按照应用层的协议再进行解析,解析这里面的数据都是什么意思,尤其是发件人信息和hello这个内容,时间,根据解析结果显示在屏幕上

1)接收方在层层解析数据,就是在进行分用,分用和封装是在进行网络运输中的具体流程,2)封装就是在网络运输中添加一些辅助传输的信息,而分用就是在解析这些信息;封装就好比快递上要套包装和一些标签,分用就是拆包装;

3)发送数据的时候,上层协议要把数据传输给下层协议,由下层协议来添加一些信息;

4)接受数据的时候,下层协议要把数据交给上层协议,由上层协议进行进一步的解析;

5)咱们的分用就是包装的逆过程,封装是从上到下,数据依次被加上了协议报头,但是我们的分用就是说从下往上,数据依次被去掉了协议报头(拆快递);

 

1)只要是路由器,我们就解析到三层然后进行封装,是为了拿到目的IP,然后进一步的会进行规划路径,咱们的交换机会进行解析到数据链路层,这里面会更新mac地址,咱们的路由器在这里面也是会更新mac地址的 

2)无论我们的网络环境多么的复杂,这里面的整体的传输过程都是类似的,只是我们在不断的进行封装和分用的过程;

封装和分用:

1)不同的协议层对数据包有不同的称谓,在传输层叫做段,在网络层叫做数据包,在链路层叫做桢

2)应用层数据通过协议栈发送到网络上面的时候,每一层协议都要加上一个报文首部,称之为封装,况且在咱们的首部信息里面包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息

3)数据封装成桢之后发送到传输介质上面,到达目的主机之后每一层协议再剥掉其中的首部,根据首部中的上层协议字段交给对应的上层协议来进行处理

网络编程套接字: 

1)本质上来说网络编程套接字是操作系统给应用程序提供的一组API,这个API咱们叫做SocketAPI,Socket的原意叫做插座,socket我们是可以视为应用层和传输层之间的通信桥梁

2)也就是说咱们的应用层和传输层之间想要进行传输数据,靠的就是操作系统提供的SocketAPI,因为咱们的传输层的核心协议有两种,一种是TCP,一种是UDP,那么此时对应的SocketAPI也是有两组,并且他们的差异是很大的;

3)由于咱们的TCP协议和UDP协议的,差别很大,因此这两组的API差别也是很大的;

虚线上面的属于应用程序,下面属于操作系统+硬件,socket API也都是传输层协议暴露给上面的应用层协议的,因为应用层协议离传输层最近;                     

网络编程的定义:是指网络上面的主机,通过不同的进程,以编程的方式来实现网络通信,或者称之为网络数据传输

1)通过代码来控制,让两个主机之间的进程可以进行数据交互,例如我使用了qq发送一个消息,这个消息就是通过我电脑上的QQ客户端的进程,先发送给了腾讯的服务器进程;

再由腾讯的服务器进程,把这个消息转发给对方电脑的QQ进程;

2)操作系统就把网络编程的一些相关操作封装起来了,提供了一组API供程序员使用,这时就可以进行网络通信的操作了,网络编程的各种操作是由操作系统提供的功能,访问网络的核心设备是网卡,网卡也是由操作系统来管理;

3)socket是一个插槽,是操作系统提供网络编程API的总称,进行网络编程的核心就是通过代码来操作网卡这个硬件设备,操作系统对于网卡这个硬件设备进行了抽象,进程想要操作网卡的时候,就会打开一个Socket文件,通过这个文件就可以读写网卡了

4)这组API是socket类,操作系统提供的API本质上是C语言风格的接口,在java中不可以直接使用的,JDK实际上是对C语言这里的socket这里的API进行了封装,在标准库中有一种类,这组类可以让我们实现网络编程,这组类本质上调用的是操作系统提供的socket提供的API,有点类似于跨语言调用;

5)这里面的socket本质上就是传输层和应用层之间相互调用的接口,我们以调用socketAPI,就可以实现应用程序和内核进行交互   

咱们最常见的场景:客户端是指给用户使用的程序,服务器端是提供用户服务的程序

1)咱们的客户端先进行发送请求给服务器

2)咱们的服务器根据请求数据,执行相应的业务处理

3)服务器返回响应,发送业务处理结果

4)客户端根据响应数据,展示处理结果,展示获取的资源,或者是保存资源的处理结果

下面我们来介绍一下TCP和UDP的特点,都是传输层协议;

 1)TCP:有连接 可靠运输 面向字节流 全双工   大小无限                                                         2)UDP:无连接 不可靠传输 面向数据包 全双工  大小有限,最多一次64K  

                                                               

有连接:例如甲给乙打电话,会先拨号,过程中会发出得得的响声,直到对方接通我才可以说话,难道是我在拨号之后立即就会说同学你好吗?好像不能这么说,因为我这边说了也没啥用只有说对方把电话接起来我这里才可以说,所以说有连接,必须我们两方接通,我们才可以进行交互数据,但是还有可能是说发生不接通的情况,那么假设此时我们不进行接通,那么我们就无法进行相互之间传输数据

无连接:发微信,总而言之我都可以发出去,我不管你看不看,发出去即可,我们两方不需要进行接通,不需要进行连接,就直接可以进行交互数据;       

TCP就是对方把电话接起来了,才会进行传输数据

UDP直接进行传输,不用直接建立连接                                        

可靠运输:数据传输过程中,发送发知道接收方是否收到请求了,有没有接收到数据

不可靠运输:数据传输过程中,发送方不知道接收方是否收到了请求了,有没有接收到数据

错误理解:

1)可靠传输就是说数据发送过去之后可以被对方百分之百的可以接收到;

2)可靠传输就是安全的传输,安全是指你这个数据在进行传输的过程中,不容易被窃取,不容易被篡改;

可靠是指:我给对方发送过去的数据,我知道对方是有收到还是没有收到

比如说发微信就是不可靠传输,我发送的数据对方收没收到我就不知道;

比如说打电话就是可靠传输,我发送的数据根据对方的是否回话

可靠传输与不可靠传输,不是说发送的数据,100%就可以接收到,而是说可以感知我发送出去的数据对方是否接收到了? 看对方是否有回应?

1)举个例子:打电话就是一种可靠运输,例如A在给B打电话,B接通了之后,A说话,B一直哼哈答应着,此时A就知道了B收到信息了,但是过了一会A发现B不答应了,此时就可知发送方知道接收方收不到消息了

2)但是对于发微信来说,不知道是不是对方的手机收到的,B看没看A发送的消息无从得知;

注意:可靠性并不等于安全性,安全性是指发的内容不可以被截获,就算截获了也不可以知道里面是什么;

(3)面向字节流:为了发送100个字节,一次发一个字节,重复100次;也可以一次发10个字节,重复10次,也可以一次全部发完,非常灵活地完成发送和接受;一次传输的数据是字节的整数倍就可以了                                                                    

面向数据报:以一个一个的数据报单位为基本发射和接收单位,每个数据报多大,不同的协议有不同的规定,一个数据包都会明确大小;我们的一次发送和一次接收都是一个完整的数据包,不能是半个,也不能是一个半;

对于数据包来说 ,传输数据是一块一块的,发送一次数据假如说是100个字节,必须要一次进行发送,接受也是必须一次性接收100个字节,而是不能分100次,每一次接受一个字节

文件的读写与TCP都是面向字节流的

发送的时候,一次至少发送一个数据报,如果一次尝试一次发一个半,结果只能发送一个;接受的时候,一次至少接收一个数据报,如果尝试接收半个,就会接受失败;

全双工:双向通讯,A和B可以互相发送数据 

半双工:单向通信,要么A给B打,要么B给A打,做过网线,一个网线里面有8根线,就可以实现全双工;     

咱们的全双工是指一条链路双向通信,咱们的半双工是指一条链路,单向通信

为什么咱们的服务器上来就是接受请求呢?

因为咱们服务器的定义就是说是被动接受请求的这一方,主动发送请求的这一方就叫做客户端;

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

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

相关文章

分割pdf的办法?看这里就明白了!

对于大多数办公党来说,困难的或许不是制作一些办公文件、文档,重要的是如何将这些文档以合适的形式发送给需要的人。不管是客户还是同事、上级,他们对文档格式、内容的要求都是有不一样的标准的。这时候我们就面临一个重要的问题了&#xff0…

Linux驱动开发:块设备驱动

这里写自定义目录标题一、块设备的简介二、块设备驱动框架1、block_device 结构体2、gendisk 结构体3、block_device_operations 结构体4、块设备 I/O 请求过程5、bio 结构体三、使用请求队列方式的块设备驱动程序1、经过第“二”部分的讲解总结,可以得出驱动程序的…

Java基础10:常用API(上)

Java基础10:常用API(上)一、Math二、System1. currentTimeMillis2. arraycopy三、Runtime四、Object1. toString2. equals3. clone五、Objects六、BigInteger1. 构造方法(获取BigInteger)2. 常用方法七、BigDecimal1. …

2023年房地产地段研究报告

房地产的投资业务中,选择一个好的地段,或者说区位,是十分重要的。在房地产行业,房价中包含地价,而房价上升的主要原因则是地价的上升。当房屋所处的地段深受消费者青睐、该地段的房屋供不应求时,房屋的价格…

Minecraft 1.19.2 Fabric模组开发 08.3D动画盔甲

我们本次在Fabric 1.19.2中实现具有动画效果的3D盔甲 效果演示效果演示效果演示 1.首先,为了实现这些效果,我们需要首先使用到一个模组:geckolib(下载地址) 找到项目的build.gradle文件,在repositories和dependencies中添加依赖。 reposit…

python+django校园大学生兼职系统vue357

目 录 摘 要 I Abstracts II 目 录 III 第1章 绪论 1 1.1课题背景 1 1.2研究意义 1 1.3研究内容 2 第2章 技术介绍 1 第3章 需求分析 4 3.1需求分析概述 4 3.2可行性分析 4 3.2.1经济可行性 5 3.2.2技术可行性 5 3.3系统功能设计 …

Target 塔吉特DVS EDI 业务测试指南

Target塔吉特是美国仅次于Walmart沃尔玛的第二大巨型折扣零售百货集团,由于拓展了其数字化履约能力,使得越来越多的国内零售产品供应商和Target建立合作关系。Target要求其供应商通过EDI(Electronic Data Interchange,中文名称是电…

基于蜣螂算法改进的随机森林回归算法 - 附代码

基于蜣螂算法改进的随机森林回归算法 - 附代码 文章目录基于蜣螂算法改进的随机森林回归算法 - 附代码1.数据集2.RF模型3.基于蜣螂算法优化的RF4.测试结果5.Matlab代码6.Python代码摘要:为了提高随机森林数据的回归预测准确率,对随机森林中的树木个数和最…

来看看这些电脑清理内存的方法

随着电脑使用时间的增加,你有没有发现电脑用得越多反应越慢?如果你遇到这个问题,可以试试这几个优化设置,让你的电脑速度起死回生! 方法一:删除临时文件 按键盘上的Win R,在对话框中输入【%temp…

96. 不同的二叉搜索树

96. 不同的二叉搜索树题目算法设计:枚举算法设计:动态规划题目 传送门:https://leetcode.cn/problems/unique-binary-search-trees/ 算法设计:枚举 当 n 5,用 {1、2、3、4、5} BST数是多少组? 有 5 种情…

如何在 macOS 上安装虚拟机软件 VMware Fusion Player (个人版免费)

文章目录IntroVMware 网站注册事宜安装在 VMware Fusion 中创建虚拟机准备 iso 文件VMware Fusion 主界面Intro VMware 网站注册事宜 需要一个邮箱地址,先注册登陆 VMware。 然后在之后某个页面再次 register ,就是随意填写一些字段:所在公…

记录晖哥程序员职业规划一次授课笔记

发现 发明 道 普通知识、特殊知识 形而上学,为道,职场规律 形而下学,为气,python、go 万物生于有,而有生于无! 在职场中做无中生有的事。 利他精神 利他即利己 天予弗取反受其咎&#…

mathtype2023专门打数学符号的软件

mathtype是数学公式编辑器,与常见的文字处理软件及演示程序配合使用,能够在各种文档中加入复杂的数学公式及符号,可用在编辑数学的试卷、书籍、报刊、论文、幻灯演示等方面,mathtype2023版是编辑数学资料工具! 在这款软件中主要帮…

JavaScript基础(18)_Date对象、Math对象

Date对象 Date(日期对象)是一个构造函数,必须使用new来调用创建日期对象 1、创建一个Date对象,如果直接使用构造函数创建一个Date对象,则会封装为当前代码"执行的时间"。 var d new Date(); console.log(d); 2、创建一个指定的时间对象&am…

【C++修炼之路】14.模板进阶

每一个不曾起舞的日子都是对生命的辜负 模板进阶模板进阶一. 非类型模板参数1.1 引出场景1.2 非类型模板参数1.3 其他例子二.array类2.1 array类的介绍2.2 array的价值三.模板的特化3.1 概念3.2 函数模板的特化3.3 类模板的特化3.3.1 全特化3.3.2 偏特化四.模板分离编译4.1 什么…

人事管理系统

人才是单位的宝贵财富,而人事管理是人才资源的核心,因此快捷、高效的人事档案理系统成为单位的基本需求。 系统的主要目的是实现企业人事的信息化管理,主要业务是实现对员工信息的管理。 一、功能需求分析 人事管理系统主要是对人事档案管理…

MDK配色方案更改

文章目录WIN10更改护眼背景MDK软件配色方案更改设置常用关键字参考WIN10更改护眼背景 按windowsR快捷键,,打开运行,在弹出来的输入框中写上regedit,点确定或回车: 在打开的注册表编辑器中,找到目录&#…

C语言变量的作用域

所谓作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在所有代码文件中使用,有些变量只能在当前的文件中使用,有些变量只能在函数内部使用,有些变量只能在 for …

文献阅读笔记 # Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》 用于快速搭建NLP任务的demo的开源项目sbert的原始论文,star数很多,ACL 2019。资源: pdf | code | doc本文文献完成于 2019 年,因此仅代表当时的数据。相关工作&#xff…

人工智能医学影像行业背景,智能医疗的发展背景

1、人工智能未来的发展前景怎么样? 人工智能医疗行业主要公司:目前国内人工智能医疗行业代表性公司主要有:乐普医疗(300003)、鹰瞳科技(2251.HK)、心玮医疗(06609.HK)、美因基因(IPO中)、推想医疗科技(IPO中)等 本文核心数据:人…