UDP协议的特点
面向数据报,无连接,不可靠,全双工
面向数据报:是指该协议在传输数据的时候使用的是数据报;
无连接:指的是发送数据不需要两个进程连接在一起,类似生活中我们发送短信,只要直到对方的电话号码就看也发送短信;TCP就是有连接的,只有连接,双方才能交换数据,就像我们打电话,需要对方接通才能说话;
不可靠:指的是我们只管把数据发送出去,不管对方是否一定能接收到;
全双工:指的通信双方都能接收数据和发送数据,在该连接通路,能同时双向传输数据;相对的概念是半双工:能双向传输数据,但是不能同时;
学习一个协议,首先要了解该协议的报文格式,当应用层的数据到达传输层之后,如果使用的是UDP传输协议,就会在数据前加上一个UDP报头,构成一个UDP数据报;
这是一张UDP数据报的报文格式:
但实际真正的在网络传输的过程过的UDP报文格式是这样的:
源端口号
两个字节,用于记录发生数据的进程的端口号
目的端口号
两个字节,用于记录数据接收方的进程的端口号
UDP长度
UDP长度=报头长度+载荷长度,由于只占两个字节,最大就是65536,单位是字节,也就是64KB;也就是说一个UDP数据报最大就是64KB;但载荷的大小接近64KB,甚至大于64KB,就是考虑数据的传输方式,保证数据传输;
注意事项:
如果数据超过64KB,就需要在应用层将数据进行分段传输,在接收方手动拼接
UDP检验和
用于判断数据传输过程是否发生错误。数据报的记录方式无非就是光信号或者电信号或者电磁波,无论是哪种传输方式,都有可能在传输的过程收到外界的影响导致数据改变,发生错误,最常见的就是发生的比特翻转,0变成1,1变成0,高电平变成低电平,低电平变成高电平,检验和在数据传输之前通过某种计算方法,用载荷数据参与运算,等待数据到达目的端口时,在重新以这种方式计算,将再次计算获得校验和与报头的校验和比较,如果不同,证明传输过程数据发生改变,反之成立;
校验和
第一层:能够判断是否发生错误;(代价低)
第二层:能够直到时哪一位发生了错误,并且能够进行纠错:(代价大,消耗大)
UDP校验和做到了第一步,使用的CRC循环冗余校验,用一个16个比特位的变量,将载荷的每个字节单独拿出来累加,溢出直接舍弃,得到最后的校验和;无论是发生前计算的校验和还是接收到计算的校验和,我们都不关心校验和的具体数值,只关心前后校验和是否相同;
除了CRC,还可以使用md5,md5最初是使用在字符串hash算法,如果key是字符串,通过md5计算,实现字符串映射到数组下标;
md5特点:无论数据多大,通过计算得到的校验和都是定长的,而且只要稍微改变一点,得到的数值就会发生很大的变化,使得能够更加精确快速的判断两个数据是否不同;
md5解密实际就是一个hash表记录了一些常用的字符串以及对应加密后的数值,解密实际就是查表,常用的很容易解密,不常用的就解密不了,md5适合用在只是加密,不解密的场景像银行的密码库记录的是你的密码加密后的数据,不是你真正的密码,每当你是输入密之后,就会通过md5加密计算,再和数据库中的数值比较;
UDP协议的主要用途
高性能传输,可靠性要求不高的场景。像分布式系统,多个服务器之间的通信,多个机器在同一个机房,网络结构简单,带宽充裕;