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

网络编程(2)

 封装和分用

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根线,就可以实现全双工;     

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

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

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

相关文章:

  • 带你走进Java8新特性Stream流的小世界
  • 07_linux中断控制
  • java多线程的使用
  • [数据库迁移]-ES集群的部署
  • 计算机相关专业混体制的解决方案(事业编之学校与医院)
  • Go语言基础入门第二章
  • 蓝桥杯2021省赛Python
  • 更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource
  • 数据挖掘,计算机网络、操作系统刷题笔记36
  • 走进 HTML
  • Kettle(8):删除组件
  • linux基本功系列之-rpm命令实战
  • java基础学习 day37 (集合)
  • CGAL 点云精配准之ICP算法
  • 主流的操作系统(带你快速了解)
  • Linux中的权限问题
  • HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权
  • 【C语言航路】第十四站:文件
  • 2023牛客寒假算法集训营3
  • C++空间命名
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读