欢迎光临
我们一直在努力

简单了解-> UDP协议

前置了解

OSI 网络模型 与 TCP/IP 网络模型

TCP/IP把OSI的上面三层合并了,也许TCP/IP下面4层的叫法会与OSI的有些许不同,但其实本质都是一样

  • 物理层: 网络通信的硬件设备

  • 数据链路层: 两个相邻节点数据的传输情况

  • 网络层: 进行路径规划

  • 传输层: 关注起点和终点

  • 应用层: 应用程序,数据如何使用

  • 应用层

    自定义应用层协议

    和程序员最接近 ,和应用程序有关, 有很多 程序员 "自定义"的 应用层协议 ;

    自定义协议(具体的方式非常灵活,可以灵活变通)

    在代码中规定好数据是如何传输;

  • 根据需求明确传输的信息

  • 信息按什么格式传输

  • 例子: 一个简单的协议方式 ;

    我点外卖: 点外卖会看到商家列表 ;(这就涉及网络通信交互)
    我点外卖,肯定是要定位在我附近的商家;而不是其他地方的 ;
    假设请求格式:字符串拼接,两个属性,以","分割
    请求: 我的位置,我的信息(我的id,常吃的东西)
    发给服务器
    响应格式:商家名,商家信息(简介,距离多远), 评分 ;
    响应: xx店,xx食品 , 2.1km , 评分5.0 ;

    这样按约定的请求,和按约定来返回的响应, 这个过程就是自定义协议 ;

    开发中常见的自定义协议格式

    xml

    上古时期的数据组织方式;

    标签是自定义的,标签的含义,有多少个标签都是是自定义的 ;

    <request>
    <useId>1011</useId>
    <position>xxxx</position>
    </request>

    优势:提高可读性

    劣势:标签写的太麻烦了 ,传输也占用的更多网络带宽

    json

    目前最流行的数据组织格式;

    键值对格式

    {
      useId : "1000",
      position : "xxxx"
    }
    键值对直接用 "," 分割 , 建和值之间用 ":" 分割 ,
    键固定是 字符串 格式 , 值可以有很多种:数字,数组,字符串,json….
    json的key是字符串格式,所以上面的key带不带""双引号 都可以

    优势:可读性好,比xml简洁

    劣势:同样在网络传输中消耗而外的带宽,需要把key也传输了(useId,position) ,除非是性能要求高,不然很多地方都用json

    protobuffer (简称pb)

    以二进制的方式组织数据,传输占用带宽最小,(相当于把数据按二进制形式压缩了)

    优势:占用带宽最小,传输效率最高 (适合高性能的场景)

    劣势:可读性不高

    现有的协议 : HTTP协议(超文本传输协议)

    传输层

    主要协议:

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

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

    端口号

    通信中非常重要,固定占 两个字节 : 0 ~ 65535 ; (0一般不用 ,1->1023 : "知名端口号" , 1024->65535 : "普通端口号" );

    例如: 22 : ssh服务器, ssh协议用来登录远程主机的 ;

                80: http服务器 ,       443 : https服务器 ;

    不过没有一定要求,只要确保我们使用的端口号不和别人的冲突即可 ;

    学习协议:最主要学习理解协议报文格式

    UDP协议

    传输层里的主要协议有: TCP 协议 , UDP 协议 , 这里我们就来简单了解一下 UDP协议 ;

    UDP数据报文格式

    要学习UDP协议,先看看 UDP数据报文格式:

    (一个UDP数据报由 : UDP报头 + 载荷 组成)

  • 源端口号/目的端口号: 数据是从哪个进程来的,发送给哪个进程去的;  
  • UDP报文长度: 表示整个UDP数据报的长度(报头+载荷的长度)
  • 检验和

    前提:网络传输中,可能会因为一些外部干扰,导致数据传输出错,这种情况出现了,就要有一种方法,能够识别出 出错的数据;

    校验和:就是一种检查方法 ;

    校验和:本质是一个字符串,是通过原始数据得到的(基于原始数据内容),比原始数据小得多 ;

    怎么用校验和校验数据?
  • 发送方,把要发送的数据整理好(称为data1) , 然后通过一定的算法,计算出校验和(checksum1);

  • 发送方把data1和checksum 一起通过网络发送出去 ;

  • 接收方收到数据,收到的数据(称为data2 , data2可能和data1不同) ,收到checksum1 ;

  • 接收方再通过相同的算法,用data2计算出校验和(checksum2);

  • 对比checksum1 和 checksum2 , 如果 checksum1 和 checksum2 不相同 , 那么 data1 和 data 2 一定是不同的 ;

  • 如果 checksum1 和 checksum2 相同 , 那么data1 和 data2 大概率是相同的 (存在不相同的可能性,但概率太小,忽略不计)

    校验和是怎么计算出来的?

    校验和有很多种算法,UDP使用的是 : CRC算法(循环冗余算法)

    CRC算法(循环冗余算法)

    把要计算的数据,每个字节都进行累加, 把结果保存到 这两个字节的变量中 ,(累加过程中出现溢出,也无所谓);

    如果一个数据出现传输错误,那么第一次累加出来的值,和 第二次累加出来的值就不同;

    (CRC这种方法,虽然简单,但不是特别靠谱,两个不同数据得到的CRC校验和概率比较大,例如前一个字节多了1,后一个字节少了1

    虽然这种出错的概率不大,但也不小,有一定的风险,不能够忽略不计 ;

    md5算法(类似的有:sha1算法)

    md5 相比于 CRC 来说,有一系列的公式,来完成 md5 的计算 ;(我们不需要考虑这个公式是什么样的,因为这是一个数学问题) ;

    md5算法的特点

  • 固定长度, md5值的长度都是固定的,不管原始的数据是多长,或者多短,都是固定的长度 ;(校验和本身就不应该过长,不然不方便网络传输)

  • 分散 ,两个原始的数据,即使两个数据里的内容大部分都是相同的,只要其中有一个字节不同,得到的md5值都会大不相同 ;(md5也非常适合作为hash算法,md5值是一个16进制的整数)

  • 不可逆,一个原始数据计算出md5值非常容易,但 要把一个md5值 还

  • 原成数据, 就基本不可能(超出现有计算机算力极限), (md5,在密码学场景中很常见) ;

  • UDP特点

  • 无连接  

  • 面向数据报

  • 不可靠传输

  • 全双工

  • 所以UDP协议就适合 直播、游戏等,这些要求延迟低的场景

    赞(0)
    未经允许不得转载:171主机测评 » 简单了解-> UDP协议
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址