UDP!!!

UDP!!!

  • 一 : 传输层的协议:
  • 二 : UDP
    • 2.1 UDP长度
    • 2.2 UDP校验和
      • 2.2.1 : 为什么会出现传输出错的情况??
      • 2.2.3: 对数据进行校验的方式
        • CRC
        • md5
        • 三 : UDP的适用场景

          一 : 传输层的协议:

          传输层的协议有UDP,TCP

          UDP:无连接,不可靠传输,面向数据报,全双工

          TCP:有连接,可靠传输,面向字节流,全双工

          二 : UDP

          对于UDP协议来说,应用层数据到达UDP之后,就会给应用层数据报前面拼接上UDP报头

          UDP数据报 = UDP报头 + UDP载荷

          2.1 UDP长度

          UDP 长度描述了整个UDP数据报(报头+载荷),占多少个字节 .

          通过UDP长度,就可以知道载荷一共是多少字节.

          UDP长度占两个字节,能表示的范围是0-65535,也就是最多是64KB,

          因此,在使用UDP开发程序,就会有很大的制约,要确保传输的单个数据报,不能超过64KB

          但UDP有限制,为什么发明UDP的大佬,不对UDP做出升级呢?

          最初UDP诞生于上个世纪70年代,当时设计成2个字节64KB,是比较充裕的.

          但升级报头,不是技术上的难题,更多的上政治上的难题.

          比如 : 单个主机升级,是没有意义的,需要通信双方同时升级,否则可能会解析错误.

          由于UDP是系统内核实现的,假如全世界都是用同一个操作系统,升级的成本相对来说会小一点.但市面上存在各种各样的操作系统,如果某个操作系统升级了,其他系统没有升级,意味着这个升级的系统和其他系统不能兼容了 ,站在普通用户的角度,就是这个升级的系统不好,不能和别的系统UDP通信,可能这个升级的操作系统就会因此失去一些市场份额.

          2.2 UDP校验和

          数据在网络传输过程中,是可能会"出错"的.

          比如:发送方发送的数据是 : 010101

          接收方收到的数据是 : 011101

          2.2.1 : 为什么会出现传输出错的情况??

          因为这些二进制数据,在传输的过程中是通过电信号/光信号/电磁波进行传输的.

          就有可能受到外界环境的干扰.

          比如:电信号表示 0 , 1 ,低电平表示 0, 高电平表示1 ,此时传输的过程中,遇到一一个变化的磁场,此时就可能把本来的低电平变成高电平/高电平变成低电平

          2.2.3: 对数据进行校验的方式

          在UDP中,校验和只能做到发现是否有错,而不能纠错.

          校验和就是拿着数据/数据的一部分 进行一系列计算,得到结果.如果数据部分发生改变,此时得到的结果就会不一样

          A : 发送方

          根据发送的内容得到一个校验和.

          B:接收方

          校验和出错/数据内容出错,最终B这边感受到的都是算出来的校验和2 和收到的校验和不一致,B只要发现两个校验和对不上,就会把这个数据丢弃掉

          CRC

          CRC是一个简单粗暴的计算校验和的方式,循环冗余校验

          设定2个字节的变量,把数据的每个字节取出来,往这边变量上累加,如果结果溢出,超过2个字节,溢出部分就会舍弃

          md5

          md5 的特点:

          (1) 定长 : 无论输入的内容是多长,得到的结果,一定是固定长度的;

          (2)分散 : 输入的内容只要改变一点点,最终结果差异都会很大.(比特翻转,往往只是变化了一点点)

          因为分散特性,非常适合做字符串 hash 算法

          (3)不可逆 : 通过原数据,计算 md5 ,成本很低,但通过 md5 ,还原成原来的数据,成本很高,仅仅理论上可行)

          用于加密的领域

          使用 md5 的场景,就没想着要解密.

          三 : UDP的适用场景

          UDP现在最主要的用途,就是应用于性能要求比较高(传输快),但对于可靠性要求不高的场景.

          比如 : 分布式系统中,多个服务器之间的网络通信(多个机器在同一个机房里,网络结构简单,带宽充裕,也不太容易出现丢包的情况)