从外卖APP到网络协议:深入解析UDP及应用层协议
目录
- 1. 应用层和传输层
- 1.1 开发中常见的自定义协议格式
- 2. UDP
- 2.1 源端口号及目的端口号
- 2.2 UDP报文长度
- 2.3 UDP校验和(checksum)
- 3. 基于UDP的应用层协议
关注我,学习更多企业开发和面试内容~
1. 应用层和传输层
应用层和程序员接触最密切,应用程序?该层很多协议都是程序员自定义的,也有现成的应用层协议,如HTTP协议(超文本传输协议),后面讲。
【例子】 点外卖,首先会看到商家列表,这就涉及到程序和服务器之间的网络通信交互。
协议:以","为分隔符。
请求:用户信息,位置信息。如构造一个“1000,100,32”的字符串。
响应:商家列表,包含:名称,图片,简介,评分。如“麻辣烫,图片地址,好吃,4.8”。
自定义协议只要客户端和服务器能对应上即可。
上述通过文本方式构造的协议,很粗糙,实际开发中很少这么干,下面介绍。
1.1 开发中常见的自定义协议格式
- xml(很少用)
通过标签来组织数据,很少用于网络通信,但其他地方会用。与html不同,xml的标签是自定义的。
【优势】数据可读性高。
【劣势】写起来繁琐,传输时占用的网络带宽多。
- json(很流行)
通过键值对结构来组织数据,当下最流行的组织数据的格式。键值对之间用",“分隔,键和值用”:",键是String类型,值可以是数字,字符串,数组,也可以是json等等。
【优势】数据可读性高。【劣势】传输时占用的网络带宽多。除非是对性能要求很高的场景,其余很多地方都用json。
- protobuffer(pb)
使用二进制的方式来组织数据,可以保证带宽占用最低(相当于把要传递的信息按二进制压缩了)
【优势】占用宽带最低,传输效率最高,适合于对性能要求高的场景。【劣势】可读性不高(二进制肉眼看不懂),一定程序影响开发效率。(相对于计算机的执行效率,程序员的开发效率更重要)
传输层是面试的考点,也是工作中经常用的。主要的协议有UDP和TCP,还有其他的协议,先学习UDP。
2. UDP
学习一个协议,最主要就是理解协议的报文格式。
【教材】
【我的画图】报头和载荷之间可以认为是一个"字符串拼接"(当然这里是二进制数据)。
RFC标准文档明确规定了UDP格式,上述图中,UDP报头分成4个部分,每个部分2个字节(16位的数据,表示的范围是0-65535,也就是64kb)。
2.1 源端口号及目的端口号
UDP报文不携带源IP及目的IP(他们不在传输层,而是在网络层)。
2.2 UDP报文长度
UDP数据报占两个字节,最长就是64kb。
若两个字节的长度不够用,能不能改成4个字节?
不能,不是技术上的问题,而是一旦升级通信双方都要升级,一旦一方不愿意,通信就进行不了。
2.3 UDP校验和(checksum)
网络传输中,由于外场干扰,可能会让高电平变成低电平(或低变高),出现数据传输出错的情况。因此需要有办法识别出出错的数据,这个方法就是校验和。
校验和本质上就是一个字符串,原始数据相同得到的校验和一定相同,但校验和相同得到的原数据大概率相同(理论上会存在不相同的情况,实际概率很低,可以忽略不计)。
如何用校验和完成数据校验?
- 发送方把要发送的数据整理好(称为Data1),通过一定的算法计算出校验和checksum1。把Data1和checksum1一起通过网络发送出去。
- 接收方收到数据(称为Data2),收到数据checksum1。Data2可能和Data1不一样,接收方通过Data2按相同的算法计算,得到校验和checksum2。
- 对比checksum1和checksum2,相同则认为Data1和Data2大概率相同,若不同,则Data2和Data1一定不相同。
【检验和的原理】 计算校验和有很多算法,UDP使用的是CRC算法(循环冗余算法)。
- 把当前要计算校验和的数据,每个字节都进行累加,把结果保存到这个变量(2个字节)中,累加溢出也没关系。
- 如果中间某个数据出现传输错误,第二次计算校验和就会和第一次不同。
但CRC这个算法不是特别靠谱,比如数据中前一个字节恰好少1,后一个字节恰好多1。
md5/sha1算法(两种算法差不多,只介绍md5)有一系列公式完成md5计算(怒需要考虑公式啥样),md5的值是一个16进制的数,需要知道md5特点。
【特点】
- 定长。无论原始数据多长,计算得到的md5都是固定长度(校验和本身没必要很长,不然不方便网络传输)。
- 分散。给定两个原始数据,哪怕绝大部分一样,只要有一个字节不同,得到的md5值都会差异很大。
- 不可逆。用原始数据计算md5非常容易,但用md5还原出原始数据很难,基本不可行。
3. 基于UDP的应用层协议
有一些应用层协议是基于UDP实现的,相较于UDP,很多时候会优先考虑TCP。
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
此外,自定义的UDP程序也可以使用自定义的应用层协议。