UDP协议的特点
1. 无连接
不需要对方一直处于准备接收信息的状态.好比发微信,不需要对方在线,可以直接上来就发.通信的双方不需要保存对方的信息.
2.不可靠传输
使用UDP协议将数据发出去后,不关心对方是否能否收到,发完了就完了.
3.面向数据报
将数据报作为传输数据的基本单位,一次读写只能读写一个完整的数据报.
4.全双工
一条链路,可以进行双向通信.
UDP协议报文格式
我们之前介绍了使用UDP协议,进行编码来实现客户端和服务器之间的通信.
现在我们来进一步学习UDP协议中的报文结构.UDP报文结构如下:
在上图中,把UDP报文分成了五部分:源端口号,目的端口号,UDP长度,UDP校验和,数据(如果有的话).
前四部分属于报头,我们接下来详细介绍一下:
1. 源端口号和目的端口号
这个非常容易理解,要发送一个UDP数据报,肯定要清楚这个数据报从哪里发到哪里.起点和终点一定要明确包含在其中.就像寄一份邮件,上面会写上寄出的地址和收件的地址.
这两个端口号各自占2个字节,也就是各自占16个比特位.
2. UDP长度
UDP长度描述了整个UDP数据报具体占多少个字节,我们可以通过这个量知道当前的载荷是多少字节.
UDP长度这个量也占2个字节,用两个字节来表示一个无符号整数的范围是:0~65535.这就意味着一个UDP数据报能够传输的内容上限是64KB.
但是,对于当下的需求来说,我们需要传输的数据量可能远远超过64KB.有两个方案就被提了出来:
1.在应用层将数据包拆分,发送,再由接收方接收后进行拼装.
但是这中方法的实现过于复杂,而且安全程度低,一旦出现丢包,造成的影响过大.
2. 使用TCP协议进行数据的传输.
这种方法最终被采用,因为代码的改动量小,容易实现;并且TCP对于应用层数据包的大小没有限制.我们后面介绍TCP报文结构时会再具体介绍.
那么在被问到UDP数据报中载荷最多能存储多少数据时?答:64KB-8B.立即错误!!!
我们要培养一种工程师思维,在实际开发过程中,我们判断这个数据报的载荷有没有达到上限,不是看载荷的大小是否<= 64KB-8B,而是看载荷中的数据有没有逼近64KB.如果接近64KB,那么早在未到达 64KB-8B这个值之前,早早就要作出处理了.
3. UDP校验和
数据在网络传输过程中,是可能会"出错"的.因为二进制数据在传输之前,要先转化为电信号,光信号,电磁波.....可能受到外界环境的干扰.
比如"比特翻转",例如对于一个二进制数据,本来传输的是0,实际达到对端的是1;本来传输的是0,实际达到对端的是0.
对数据的校验:
1.能够发现是否出错.(代价较小)
2.最好发现哪一位出错,并且能够纠错.(代价更大)
UDP校验和就只能做到第一层.
校验和就是拿着数据(部分)进行一系列的计算,得到结果.如果这部分数据发生改变,得到的结果也不一样.
如果一个数据报从A发送到B,A会先拿一部分数据计算出校验和,一起发送到B.B拿到这些数据后,再按照相同的算法计算新的校验和,拿新的校验和和原来的校验和进行比对,如果不一致,就说明传输出现了问题.
UDP中使用的CRC算法作为校验和.CRC设定两个字节的变量,把数据的每个字节取出来,在这个变量上进行累加.如果结果超出两个字节,就把溢出部分舍弃.