【JavaEE初阶】网络原理-深入理解网络通信中协议的概念

前言

🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~

🌈感兴趣的小伙伴看一看小编主页:

🔥 你的点赞就是小编不断更新的最大动力

🎆那么废话不多说直接开整吧~~

目录

📚️1.引言

📚️2.应用层协议

2.1自定义协议

1.实现要求

2.约定格式

3.约点协议格式方案

📚️3.传输层协议

3.1UDP协议

1.UDP报文

2.检验和、校验和

📚️4.总结

📚️1.引言

我们在前几其讲到过关与UDP与TCP中的每层的含义,当然分别为:应用层,传输层,网络层,数据链路层,物理层;所以每层对应的都有各自的协议,所以我们的网络原理的理解就是对这些协议进行分析~~~

这是纯理解性的,但是这是面试的常客,所以小编会尽量将内容展示给大家😊😊😊~~~

📚️2.应用层协议

这是与我打交道最多的一层,上期小编就是通过调用应用层的API实现了回显函数的编写,这里的协议已经是已经规定好了的,但是此时我们需要依据特定的场景进行自定义协议

2.1自定义协议

1.实现要求

这里的自定义协议要考虑两个内容:

1.网络传输的数据如何进行使用

2.数据如何进行传输,是什么样子的格式,以及内容

当然这里的自定义协议约定了:

1.客户端服务器约定要传送什么数据;

2.传输的数据的格式是如何的;

2.约定格式

服务器和客户端之间的交互格式其实就是"结构化数据",网络传输的数据其实就是"二进制比特位""字符串",所以约定协议的过程就是:将字符串转或者二进制比特位转化为结构化数据的过程;

序列化:

这里就是字符串或者二进制bit转化为机构化数据的过程;

反序列化:

这里就是结构化数据转化为字符串或者二进制bit位的过程;

总结:这里的反序列化或者序列化具体要什么格式,或者包含哪些信息,约定这两件事的过程,就是自定义协议的过程;

3.约点协议格式方案

1.xml

大概的方式如下:

XML 复制代码
<shop>
   <id>12</id>
   <name>苏宁易购</name>
   <image>图片地址</image>
   <prize>4.9</prize>
<shop>

解释:形如这种就是一种xml的约定的格式,可以看到这里的尖括号就是开始标签或结束标签都是成对出现的;

**优点:**可读性和可扩展性大大增强,我们可以很明显的通过标签里面的内容进行分析这里的意义,并且要添加属性,就再添加一对中括号即可;

**缺点:**数据冗余,标签占据了数据空间的绝大部分,很容易占据更多的网络传输中的网络带宽;

2.json

这是当下一种主流的约定协议的格式,具体的方式如下:

cpp 复制代码
[
  {
     id:12,
     name:苏宁易购,
     image:图片地址,
     prize: 4.9
  },
  {
     //其他的店铺
  }
]

那么这里就是通过大括号的方式包裹,键值对之间使用","键和值之间使用":",最外层可以使用"[]"组成一个json

**优点:**很好的改进了xml的约定格式的方式,既有可读性和可扩展性,并且解决了数据冗余的情况;

**缺点:**标签key在同一个属性的情况下,key往往会被重复传送;

3.protobuffer

这里小编就不再进行代码演示了,看解释如下:

优点:是一种更节省空间,更加高效的方法

缺点:这个是在开发阶段定义有哪些资源,并且每个字段的含义,但是在运行阶段传输的数据包不包含这些描述信息,不利于程序员阅读;(二进制数据)

所以这里的protobuffer虽然运行效率很高,但是没有json使用更加广泛;只是在特殊的场景进行使用;

📚️3.传输层协议

虽然这是系统内核已经确定好了的,但是仍然需要关注其内容~~~

补充:端口号是包含两个字节的整数;

3.1UDP协议

1.UDP报文

我们在之前了解到UDP协议的特点就是"无连接,不可靠,全双工,面向数据报"

所以在研究一个协议之前我们要了解它的报文格式,如下图:

解释:这里共有四个字段,每个字段包含两个字节;

结论:由于每个字段两个字节,那么端口号就是0~65535;并且数据报长度就是64kB,一旦超过了数据报长度,就会出现数据截断;

2.检验和、校验和

由于数据在传输的过程中可能会被干扰导致"坏掉",所以检验和就是检验数据是否正确

由于网络传输通过:光信号,电信号,电磁波,所以很容易受到磁场,电场的影响;

bit翻转:

使用高电平,低电平表示0 1,那么在数据传输的过程中被干扰了,就会出现0 1->1 0的情况,这里我们就叫做bit翻转;

总结:校验和就是检查数据是否发生了bit翻转,是否为正确的数据;如果出现了错误,就会将这个错误的包进行丢弃的操作;

如何进行校验和:

这里小编就简单举个例子来表示校验和:

当然,这里的校验和也存在一定的误差,如果我们有一个为"天街路",那么此时就会发现这里的首字符就是天,但是内容不对;

所以:这里的校验和就是"证伪",无法做到100%正确;

URP中实现校验和:

在URP中使用的校验和叫做:CRC循环冗余校验

即比较方式如下:

当UDP数据报发送之前会通过CRC进行计算当前的值放到数据报头里,这里就是(value1),当接收方受到数据之后,会进行同样的计算拿到的值,(value2),若这里的值是一样的,那么就没有发生翻转,反之就发生了;

**注意:**但是当多个bit位发生了翻转,就会导致不准确了,假如一个比特位从1变成了0,另一个比特位从0变成了1,就会导致两个值一样,但是发生了比特翻转;

更高级的校验和算法

除了CRC循环冗余校验,这里还有md5、sha1的校验方式;

这里的两种校验方式基本一致,那么小编注重讲解一下,md5的校验和的方式吧!!!

特点:

1.定长性

无论原始数据有多长,MD5计算后的值的长度是一样的;

2.分散性

即时改变原始数据一点点,那么得到的MD5值差异很大,所以即时发生了一个bit翻转,那么得到底MD5值差异很大(这种特性可以作为字符串hash算法)

3.不可逆性

讲一个算好的MD5的值给复原为原来的字符串,这是不可能的;(在实现原始数据转化为MD5的值后,信息损失很大)

但是很多网站是可以实现MD5值复原的,但是这是基于:提前将原始数据的MD5值存储下来,在输入MD5值后还原,就在数据库中找到匹配的数据,这就是原始数据;

网站求MD5值:

很明显这里的"hello"的MD5值就是"5D41402ABC4B2A76B9719D911017C592"

我们进行解密后:

但是我们时输入,有难度的字符串得到的MD5值进行解密,就无法解密成功:

我们输入:"为世界舔砖java";得到的MD5值"1FC64740EA1A3238A8FA1B2A153DF60A",然后进行解析:

可以看到此时无法,解密成功,就是数据库中没有对应的MD5值,这说明了MD5校验和的方式计算出来的MD5值是不可逆的!!!

📚️4.总结

💬💬本期小编主要总结了关于应用层协议,以及传输层协议,但是在传输层协议中最重要的TCP协议本期没有涉及,所以小编在下期会进行重点讲解~~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

😊😊 期待你的关注~~~

相关推荐
混迹网络的权某11 分钟前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
IronmanJay3 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组
加载中loading...4 小时前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
Wx120不知道取啥名4 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
biomooc5 小时前
R语言 | paletteer包:拥有2100多个调色板!
r语言·数据可视化·1024程序员节
Hello.Reader5 小时前
FFmpeg 深度教程音视频处理的终极工具
ffmpeg·1024程序员节
Y.O.U..6 小时前
STL学习-容器适配器
开发语言·c++·学习·stl·1024程序员节
就爱敲代码6 小时前
怎么理解ES6 Proxy
1024程序员节
憧憬一下6 小时前
input子系统的框架和重要数据结构详解
arm开发·嵌入式·c/c++·1024程序员节·linux驱动开发
三日看尽长安花6 小时前
【Tableau】
1024程序员节