前置了解
OSI 网络模型 与 TCP/IP 网络模型

TCP/IP把OSI的上面三层合并了,也许TCP/IP下面4层的叫法会与OSI的有些许不同,但其实本质都是一样
物理层: 网络通信的硬件设备
数据链路层: 两个相邻节点数据的传输情况
网络层: 进行路径规划
传输层: 关注起点和终点
应用层: 应用程序,数据如何使用
应用层
自定义应用层协议
和程序员最接近 ,和应用程序有关, 有很多 程序员 "自定义"的 应用层协议 ;
自定义协议(具体的方式非常灵活,可以灵活变通)
在代码中规定好数据是如何传输;
根据需求明确传输的信息
信息按什么格式传输
例子: 一个简单的协议方式 ;
我点外卖: 点外卖会看到商家列表 ;(这就涉及网络通信交互)
我点外卖,肯定是要定位在我附近的商家;而不是其他地方的 ;
假设请求格式:字符串拼接,两个属性,以","分割
请求: 我的位置,我的信息(我的id,常吃的东西)
发给服务器
响应格式:商家名,商家信息(简介,距离多远), 评分 ;
响应: xx店,xx食品 , 2.1km , 评分5.0 ;
这样按约定的请求,和按约定来返回的响应, 这个过程就是自定义协议 ;
开发中常见的自定义协议格式
xml
上古时期的数据组织方式;
标签是自定义的,标签的含义,有多少个标签都是是自定义的 ;
<request>
<useId>1011</useId>
<position>xxxx</position>
</request>
优势:提高可读性
劣势:标签写的太麻烦了 ,传输也占用的更多网络带宽
json
目前最流行的数据组织格式;
键值对格式
{
useId : "1000",
position : "xxxx"
}
键值对直接用 "," 分割 , 建和值之间用 ":" 分割 ,
键固定是 字符串 格式 , 值可以有很多种:数字,数组,字符串,json….
json的key是字符串格式,所以上面的key带不带""双引号 都可以
优势:可读性好,比xml简洁
劣势:同样在网络传输中消耗而外的带宽,需要把key也传输了(useId,position) ,除非是性能要求高,不然很多地方都用json
protobuffer (简称pb)
以二进制的方式组织数据,传输占用带宽最小,(相当于把数据按二进制形式压缩了)
优势:占用带宽最小,传输效率最高 (适合高性能的场景)
劣势:可读性不高
现有的协议 : HTTP协议(超文本传输协议)
传输层
主要协议:
TCP :有连接,可靠传输,面向字节流, 全双工
UDP:无连接, 不可靠 , 面向数据流 , 全双工
端口号
通信中非常重要,固定占 两个字节 : 0 ~ 65535 ; (0一般不用 ,1->1023 : "知名端口号" , 1024->65535 : "普通端口号" );
例如: 22 : ssh服务器, ssh协议用来登录远程主机的 ;
80: http服务器 , 443 : https服务器 ;
不过没有一定要求,只要确保我们使用的端口号不和别人的冲突即可 ;
学习协议:最主要学习理解协议报文格式
UDP协议
传输层里的主要协议有: TCP 协议 , UDP 协议 , 这里我们就来简单了解一下 UDP协议 ;

UDP数据报文格式
要学习UDP协议,先看看 UDP数据报文格式:

(一个UDP数据报由 : UDP报头 + 载荷 组成)
检验和
前提:网络传输中,可能会因为一些外部干扰,导致数据传输出错,这种情况出现了,就要有一种方法,能够识别出 出错的数据;
校验和:就是一种检查方法 ;
校验和:本质是一个字符串,是通过原始数据得到的(基于原始数据内容),比原始数据小得多 ;

怎么用校验和校验数据?
发送方,把要发送的数据整理好(称为data1) , 然后通过一定的算法,计算出校验和(checksum1);
发送方把data1和checksum 一起通过网络发送出去 ;
接收方收到数据,收到的数据(称为data2 , data2可能和data1不同) ,收到checksum1 ;
接收方再通过相同的算法,用data2计算出校验和(checksum2);
对比checksum1 和 checksum2 , 如果 checksum1 和 checksum2 不相同 , 那么 data1 和 data 2 一定是不同的 ;
如果 checksum1 和 checksum2 相同 , 那么data1 和 data2 大概率是相同的 (存在不相同的可能性,但概率太小,忽略不计)
校验和是怎么计算出来的?
校验和有很多种算法,UDP使用的是 : CRC算法(循环冗余算法)
CRC算法(循环冗余算法)
把要计算的数据,每个字节都进行累加, 把结果保存到 这两个字节的变量中 ,(累加过程中出现溢出,也无所谓);
如果一个数据出现传输错误,那么第一次累加出来的值,和 第二次累加出来的值就不同;
(CRC这种方法,虽然简单,但不是特别靠谱,两个不同数据得到的CRC校验和概率比较大,例如前一个字节多了1,后一个字节少了1
虽然这种出错的概率不大,但也不小,有一定的风险,不能够忽略不计 ;
md5算法(类似的有:sha1算法)
md5 相比于 CRC 来说,有一系列的公式,来完成 md5 的计算 ;(我们不需要考虑这个公式是什么样的,因为这是一个数学问题) ;
md5算法的特点
固定长度, md5值的长度都是固定的,不管原始的数据是多长,或者多短,都是固定的长度 ;(校验和本身就不应该过长,不然不方便网络传输)
分散 ,两个原始的数据,即使两个数据里的内容大部分都是相同的,只要其中有一个字节不同,得到的md5值都会大不相同 ;(md5也非常适合作为hash算法,md5值是一个16进制的整数)
不可逆,一个原始数据计算出md5值非常容易,但 要把一个md5值 还
原成数据, 就基本不可能(超出现有计算机算力极限), (md5,在密码学场景中很常见) ;
UDP特点
无连接
面向数据报
不可靠传输
全双工
所以UDP协议就适合 直播、游戏等,这些要求延迟低的场景



