【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协议本期没有涉及,所以小编在下期会进行重点讲解~~~

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


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

😊😊 期待你的关注~~~

相关推荐
学传打活4 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16812 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心14 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
Gnail320 天前
7.2.4.5 PDCCH物理层的处理流程
crc·物理层·pdcch·rnti·盲检
u01030552720 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552720 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝22 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552722 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552722 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552725 天前
Java实用类应用精讲
人工智能·1024程序员节