前言
🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~
🌈感兴趣的小伙伴看一看小编主页:
🔥 你的点赞就是小编不断更新的最大动力
🎆那么废话不多说直接开整吧~~
目录
📚️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协议本期没有涉及,所以小编在下期会进行重点讲解~~~
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!
💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。
😊😊 期待你的关注~~~