目录
UDP协议报文结构
端口号
报文长度
校验和
生成校验和的算法
MD5的特点
UDP协议报文结构
UDP会把载荷数据(也就是通过 UDP socekt,send方法拿来的数据基础上,再前面拼装(相当于字符串拼接此处是二进制的)上几个字节的报头
UDP报头里包含了一些特定的属性,这些属性携带了一些重要的信息
不同的协议,功能不同,报头中带有的属性信息就不同,对于UDP来说,报头一共8个字节,分成四个部分:源端口号,目的端口号,报文长度,校验和
UDP协议是一个无连接,不可靠,面向数据报,全双工的协议.
端口号
端口号是传输层协议的概念,每个进程(程序)属于自己的端口号,起到的效果就是区分一个主机上具体的应用程序.因此我们要求同一个主机上,一个端口号不能被多个进程绑定
UDP协议中包含源端口号,和目的端口号,他们都是用2个字节,也就是16个bit位来表示的,因此这里的端口号的取值范围是0->65535,注意0->1023这个范围的端口,被称为"知名端口号/具体端口号",这些端口号都已经分配给了一些广泛使用的知名的应用程序了,因此我们自己写的程序绑定的端口号需要从1024开始
报文长度
报文长度也是由2个字节表示的,范围同样是0->65535,换算一下单位,也就是64KB.也就是说一个UDP数据报最多只能传输64KB的数据
如果我们需要传输的数据大于64KB怎么办呢?
1.需要在应用层,通过代码的方式针对应用层数据报进行手动的分包,拆成多个包,通过多个UDP数据报来进行传输(本来send一次,现在要send多次)
2.不用UDP协议,使用TCP协议
校验和
网络传输的本质是光信号/电信号,在传输过程中,可能会受到一些物理因素的影响,在这些干扰因素的影响下,可能会发生"比特翻转",也就是原来要传输二进制1,发生比特翻转,就变成了0,原来要传输二进制0,发生比特翻转,就变成了1,此时我们传输过后得到的数据就变了,数据的含义也就不同了,本来数据报是想开启功能,可能就变成了关闭功能了
这种现象是客观存在的,不可避免的,我们能做的就是在发生比特翻转,数据改变了的时候,能够及时的识别出当前的数据是否出现问题.
此时我们就需要校验和了,校验和的作用就是验证传输的数据是否是正确的
校验和是如何鉴别我们的数据是否出现了问题的呢?
检验和会针对数据内容进行一系列的数学运算,得到一个比较短的结果(比如2字节),如果数据内容一定,得到的校验和结果就一定,如果数据变了,得到的检验和也就变了
生成校验和的算法
1.CRC 循环冗余校验,把数据每个字节,循环往上累加,如果累加益处了,高位就不要了
2.MD5 有一系列公式,来进行更复杂的运算,最后得到一个定长的结果
MD5的特点
1.定长:无论原始数据有多长,得到的md5的值都是固定长度(4字节版本,也有8字节版本)
2.冲突概率小 原始数据哪怕变动一个地方,一个bit位,算出来的MD5天差地别(MD5让结果更分散了)
3.不可逆,通过原始数据计算出MD5很容易,但是想要通过MD5计算出原始数据非常难(计算量极大,理论上不可以完成)
4.可以用来计算校验和,也可以计算hash值,还可以当作一种加密方式