当前位置: 首页 > news >正文

网络原理——UDP

传输层有两个核心协议:1. TCP 2. UDP

TCP的特点:有链接 , 可靠传输 ,面向字节流 , 全双工 UDP的特点:无连接 ,不可靠传输 , 面向数据报 , 全双工

(其中的不可靠传输,在代码中是不容易体现出来的,可以理解为发送了数据,就不管了)

学习UDP之前,我们得再谈谈端口号。

端口号

端⼝号(Port)标识了⼀个主机上进⾏通信的不同的应⽤程序;

其中服务器的端口是程序员指定的(提前制定好,客户端才能访问到)

客户端的端口是系统自动分配的空闲端口(如果提前指定了,可能会和你客户端的其他程序冲突)

在TCP/IP协议中, ⽤ "源IP", "源端⼝号", "⽬的IP", "⽬的端⼝号", "协议号" 这样⼀个五元组来标识⼀个 通信(可以通过netstat -n查看);

端⼝号范围划分

端口号位两个字节,16比特位。一个端口号的取值范围,0 → 65535,实际上,一般把 1024 以下的端口保留,咱们写代码都是用 1024 → 65535 这个范围 。(如果设置端口号10W,就是非法的端口号)

  • 0 - 1023: 知名端⼝号, HTTP, FTP, SSH等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都是固定的.
  • 1024 - 65535: 操作系统动态分配的端⼝号. 客⼾端程序的端⼝号, 就是由操作系统从这个范围分配的.

认识知名端⼝号(Well-Know Port Number)

有些服务器是⾮常常⽤的, 为了使⽤⽅便, ⼈们约定⼀些常⽤的服务器, 都是⽤以下这些固定的端⼝号:

  • ssh服务器, 使⽤22端⼝
  • ftp服务器, 使⽤21端⼝
  • telnet服务器, 使⽤23端⼝
  • http服务器, 使⽤80端⼝
  • https服务器, 使⽤443

我们⾃⼰写⼀个程序使⽤端⼝号时, 要避开这些知名端⼝号

UDP协议

UDP协议端格式

上图也可以这样子来表示:(HTTP的报头是文本格式的,UDP/TCP/IP的报头是二进制的)

  • 16位UDP⻓度, 表⽰整个数据报(报头 + 载荷)的最⼤⻓度,长度属性,也是两个字节,表示范围是 0 → 65535 ,64kb(64kb放到30年前,当时已经很充裕了,放到现在,就是非常小的数字,随便一个图片就是几个MB);

    • 此时就会产生一个问题:如何传输一个大的数据呢?
      1. 应用层代码做拆包操作。

        一个大的应用层广告数据包,拆成多个小的包,使用多个UDP数据报传输。但这个工作量是比较大的,需要写大量的逻辑,实现此处的分包组包功能并且需要进行复杂的验证

      2. TCP协议,没有数据包长度的限制。

  • 校验和:验证数据是否发生修改的手段。

    如果说HTTPS的数字签名,是为了防止黑客篡改(防人),那么UDP的校验和,不是为了防人,和安全性无关,而是为了防止出现传输过程中的“比特翻转”

    比特翻转:

    二进制位 0→1 , 1→0 (光信号,电信号,电磁波受到外界干扰,可能回事高低电平/高低频光信号发生改变)

具体流程:

  • 发送之前,先计算一个校验和,把整个数据包的数据都带入。

  • 把数据和校验和一起发送给对端。

  • 接收方收到之后重新计算一下校验和,和收到的校验和进行对比(UDP发现校验和不一致,就会直接丢弃,不会重发,如果想重发,要么使用 TCP,要么自己在写应用层代码中,自己来实现)

    (UDP 的校验和使用了CRC方式来进行校验(循环冗余校验)把每个字节(除了校验和位置的部分之外),都当作整数,进行累加,溢出也没关系,继续加最终得到结果,crc校验和,传输到对端,数据出现错误了,对端再次计算的校验和,就会和第一个校验和不一样了)

    (这里认为,两个原始数据相同,使用相同的校验和算法,得到个校验和也是相同的[ok]

     反之,如果两个校验和相同,原始数据一定也相同[可能存在变数],例如:前一个字节出现bit                    翻转,刚好小了1,后一个字节也出现bit翻转,刚好大了1,最终加到一起,校验和就是一样的)
    

本来比特翻转就是小概率事件,恰好两个翻转抵消了影响,更是小之又小的概率了。

UDP总长度最大是64KB,表述的时候这两种都对:

  1. UDP总长度达到 64KB 上限。
  2. UDP携带的载荷长度达到 64KB 上限(UDP报头,只有8个字节,8字节相对于64KB来说,非常小的数字, 65535-8 ⇒ 65528近似看成 64KB,也是没问题的)

http://www.lryc.cn/news/592268.html

相关文章:

  • 如何 ASP.NET Core 中使用 WebSocket
  • html复习
  • 【收集电脑信息】collect_info.sh
  • 电脑插上u盘不显示怎么回事
  • 分表聚合助手类
  • 分布式面试点
  • RecyclerView与ListView深度对比分析
  • 从复合变量到分组分析:piecewiseSEM 解析生态系统多因子交互作用
  • UDP 协议下一发一收通信程序的实现与解析
  • Linux 定时任务全解析:atd 与 crond 的区别及实战案例(含日志备份 + 时间写入)
  • AugmentCode还没对个人开放?
  • 双通达信多板块同步
  • 如何抉择HTTPSProxy?
  • AR技术重塑电力巡检:效率提升与智能升级
  • 三维重建一: 相机几何
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • Go语言实战案例-斐波那契数列生成器
  • 9. isaacsim4.2教程-ROS加相机/CLOCK
  • pgsql导出导入超过50G数据、解决方法
  • hive分区表临时加载日批数据文件
  • MyBatis 动态 SQL:让 SQL 语句随条件灵活变化
  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 美创科技建设项目被评为中国信通院医疗领域“磐安”优秀案例
  • 禁止拖动视频进度条来保障视频安全?
  • 西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技
  • 免费PDF文件格式转换工具
  • 如何选择旅游科技行业云ERP?Oracle NetSuite助力汇智国际数智化升级
  • 【世纪龙科技】汽车故障诊断与排除仿真教学软件让课堂更高效安全
  • TCL 电视安装 APK 文件主要有 U 盘安装——仙盟创梦IDE
  • Java并发编程性能优化实践指南:锁分离与无锁设计