UDP协议格式
拼装报头的过程就是”封装“ UDP长度:整个UDP的长度=报头+载荷,使用2个字节的数据来表示,单位是字节,表示数据范围 0-65535byte,一个UDP数据报最大就是64KB,所有在使用UDP传输数据的时候一定要注意报文长度不能超过64K,超过就会丢失一部分数据. 那么传输大的数据报该怎么办呢? 最好的办法就是直接改成TCP,TCP对数据的长度没有限制. UDP校验和 为什么要引入校验和: 网络传输数据本质都是一些0/1 bit流,这些bit流是通过光信号或者电信号来表示的,在传输过程中受到一些干扰,就容易出现“比特翻转",校验和就是为了验证看当前的数据是否出现问题. 如去超市买生活用品:卫生纸,抽纸,牙膏,洗面奶,洗衣液一共五种东西。此时去超市买的时候就会一边买一边检查买的结果.如果发现手上的东西已经五种了,就认为买完了。如果发现手里有三种或者六种就认为买错了. 但是手中的五种东西也不一定完全正确,有可能把洗衣液买成了洗衣粉。 校验和不一定百分百进行校验,如果校验和正确不能保证数据一定正确,但是校验和不正确就说明数据一定错误. 校验和往往根据原始数据的内容生成,不同的内容,生成的校验和也不一样。
使用校验和的算法:crc
crc:循环冗余校验 将数据当成二进制数据,依次按照字节为单位取出数据,然后把这些数据进行累加.随着累加可能出现溢出,溢出的部分就丢弃, 传输数据的时候把数据+crc校验和一起传输给目标. 接收方同时收到数据+crc校验和,接收方就会按照同样的算法,针对数据再计算一次crc校验和,把新的计算结果和收到的crc校验和进行对比,如果一致就认为数据发送和接收时数据的内容没变,如果传输过程中发送比特翻转,接收和发送的内容就不一样,此时新计算校验和与crc大概率不相同.
使用校验和的算法:md5
md5本质上是一个”非对称的哈希算法“ md5算法特性:(本质上就是针对数据进行一系列的数学变换)
- 定长:无论输入的字符串多长,得到的md5值都是固定长度
- 分散:只要输入的字符串,发生一点点变化,得到的md5值都会差别巨大。
- 不可逆:给定原字符串可以得到md5值,但是给定md5值无法得到原字符串.
md5应用场景
- 作为hash算法
- 作为校验和(因为md5分散的特性,只要数据发生一点点变化,md5值都会差别很大,如果两个字符串md5值一致那么大概率两个字符串相同)
- 应用一些密码学的场景(不可逆特性)
UDP的特点
无连接:知道ip和端口号就可以直接进行传输,不需要建立连接. 不可靠:发生端发送数据如果发送故障导致接收方无法收到,不会返回任何错误信息. 面向数据报:UDP不会拆分也不会合并. 全双工:UDP的socket既可以读也可以写.
经典面试题:基于UDP实现可靠传输.
这个问题看似问的是UDP实则考察的是TCP,可以参考TCP可靠传输再应用层实现类似逻辑.
- 实现应答机制,接收到数据后反馈一个ACK
- 实现确认序号,以及去重
- 实现超时重传
- 实现连接管理,三次握手(建立连接),四次挥手(断开连接)
- 实现滑动窗口,提高效率
- 限制滑动窗口,实现流量控制/拥塞控制
- 实现延时应答,捎带应答,心跳机制
|