UDP可靠性设计

简介: UDP可靠性设计

UDP使用场景:

UDP三种性质:

1.尽力可靠:发送方和接收方的数据尽量到达(中间丢一些包不影响)   --->微信音视频通话

2.无序可靠:迅雷下载,整个文件是做了分片  --->(保证数据完整性)

3.有序可靠:(银行转账)  数据需要先转出去---才可以转给别人。

1音视频通话(udp)  接收端需要缓存(可能出现延时) 目的是对包进行排序,解决传输乱序的问题。

2游戏开发 : 棋牌游戏没必要用udp ,  王者荣耀(即使战略游戏)

3物联网: 桥梁传感器 (使用电池)十秒检测一下桥梁状态然后上报,接着休眠

4服务器状态集中监测: 手机状态集中监测,做服务器检测(100万台) udp比较省电

udp总结:           (能够使用tcp解决的场景尽量不要挑战udp,udp真的不好用

1.实时性要求  

2.节约资源。(省电)

TCP                                                 UDP                      (user自己写的协议)可靠性UDP

应答机制                                         没有                                 (user层)   应答机制

包带序号                                         没有                            (user层) 设计协议,加上序号

拥塞控制                                         没有                              1.定义窗口,设计拥塞控制

                                                                                           2.发送包的时候有间隔

send,recv                              sendto ,recvfrom  

send(10k)  ---> recv(500)        sendto(30k)(不可以,必须分片) recvfrom(500)

UDP传输原理

TCP协议(Transmission Control Protocol,传输控制协议)为应用层提 供可靠的、面向连接的和基于流(stream)的服务。使用超时重传、数 据确认等方式来确保数据包被正确发送至目的地。

UDP分片原理

UDP和MTU的关系

MTU:以太网(Ethernet) 数据帧的长度必须在46-1500字节之间,这是由以太网的 物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元)。

单个UDP传输的最大内容 1472(1500-20-8, 如果有可选字节>28)字节,但由于不同的网络中转设备设置的MTU值并不相同。Internet上的标准MTU值为576字节, 建议在进行Internet的UDP编程时.最好将UDP的数据长度控制在548字节(576-20-8) 以内(腾讯游戏 MTU 500+)。

真的是1472或者576吗?     (<=1472 , ip头是至少20字节不是至多,运营商也会在前面加PPPOE的协议   , 在发送的时候推荐用1400 )

IP协议+PPPOE协议

推荐的MTU 设计为 500+字节,应用逻辑保证数据包大小不超过 MTU,避免拆包。 局域网:1400 公网:500+(腾讯游戏推荐), 音视频: 1400

TCP是流式传输,一次收多少都是可以的,大不了多收几次。更多次数的内核态和用户态的切换。

UDP是报文传输,recvfrom每次都是需要接收一个完整的报文,如果不接收完,剩余部分就会被丢掉。(报文都是放到一个链表里面一个一个取出来的,下一次取的就是下一个报文了)

TCP send(1000) --------------------> recv(1000) 不一定收1000  可能会分片

UDP sendto(1000) --------------------> recvfrom(1000) 也不一定收1000  有可能会丢包

UDP分片机制设计的重点

                                               要传输的一段数据

UDP分片机制设计的重点

1. 分片最大长度的确定

2. 分片帧头的设计 ◼ 同步字 ◼ 所有分片数据的总大小 ◼ 分片数量 ◼ 分片编号 ◼ 当前分片数据的大小

3. 重组异常的处理

目录
相关文章
|
安全 C++
c++11新特性——智能指针详解
c++11新特性——智能指针详解
|
8月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
809 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
1786 4
springboot + minio + kkfile实现文件预览
|
安全 网络协议 NoSQL
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
消息中间件 Linux API
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
1109 1
Linux进程间通信(IPC) Linux消息队列:讲解POSIX消息队列在Linux系统进程间通信中的应用和实践
|
消息中间件 微服务
消息队列的适用场景
消息队列的适用场景
409 0
|
NoSQL Linux 编译器
『Linux升级路』基础开发工具——gdb篇
『Linux升级路』基础开发工具——gdb篇
433 1
|
负载均衡 数据安全/隐私保护 网络架构
理解网络交换机:L2与L3交换机的功能与区别
理解网络交换机:L2与L3交换机的功能与区别
2497 0
|
前端开发 关系型数据库 MySQL
Windows 安装 MySQL 8.1 (图文教程)
Windows 安装 MySQL 8.1 (图文教程)