UDP分包与组包

2023-11-06 16:40
文章标签 udp 分包 组包

本文主要是介绍UDP分包与组包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、UDP概述

  • UDP协议就不过多的介绍了,可以参阅:https://blog.csdn.net/qq_41453285/article/details/103984794,或者其他关于UDP的文章
  • 下面有一个网站可以来查看当前各国的流量速率比,进入之后找到中国,点击查看:https://www.speedtest.net/global-index

二、UDP的特性与应用场景

  • 采用UDP有3个关键点:
    • 网络带宽需求较小,而实时性要求高
    • 大部分应用无需维持连接
    • 需要低功耗
  • 应用场景:
    • 网页浏览:新浪微博就已经用了QUIC协议
    • 流媒体:WebRTC就是基于UDP的
    • 实时游戏:Unity3D采用的RakNet也是基于UDP的协议

基于UDP协议的QUIC协议

  • QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议
  • 详情可参阅:https://eng.uber.com/employing-quic-protocol/

UDP传输时需要注意的问题

  • 数据包确认机制
  • 数据包重传机制
  • 尽量不发送大于路径MTU的数据包
  • 处理数据包重排

三、UDP与MTU

IP分片的概念

  • 在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1514字节,其中以太网数据帧的帧头为14字节
  • 当发送的IP数据包的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功
  • IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大;公网传输,需要经过多个网络设备,IP分片容易造成丢包
  • 由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片

UDP与MTU的关系

  • MTU是指通信协议的链路层上面所能通过的最大数据包大小
  • 单个UDP传输的最大内容1472字节,但由于不同的网络中转设备设置的MTU值并不相同:
    • Internet环境下:标准MTU值为576字节,UDP的数据长度应该控制在548字节(576-8-20)以内
    • 局域网环境下:UDP的数据长度控制在1472个字节以内

四、UDP分包与组包设计

为什么要对UDP进行分包与组包

  • 通过上面对MTU的介绍我们知道,如果IP数据包的大小超过了其所在环境中MTU的大小,那么就会对IP数据包进行分片
  • 当分片只要其中一个片段丢失,那么就需要重传所有的分片数据,因此这种消耗是比较大的

主要思想

  • 在应用层,我们对UDP数据进行传输时调用的两个接口为sendto()和recvfrom()
  • 我们将传输的数据(原始数据,可能很大)分割为一个一个小的分片,使分片的大小不大于MTU的大小,这样我们在进行UDP数据传输的时候,就不会产生上面IP分片的问题了

  • 对于每一个分片我们需要设计其格式,例如下面是定义的一种格式。相关字段为如下所示

代码

  •  GIthub链接:https://github.com/dongyusheng/csdn-code/tree/master/udp_piece
  • 其中:
    • circular_buffer.h/.c:环形缓冲区,用来保存数据的
    • udp-piece.h/.c:UDP分片与重组(核心代码)
    • udp-piece-client.c:客户端测试代码,代码内会向服务端发送UDP数据
    • udp-piece-server.c:服务端测试代码,接收客户端的UDP数据

编码主要思路

  •  udp-piece.h:
    • 定义了如下的宏和结构,主要用来描述分片节点的
    • 其中比较重要的一个字段为PIECE_FIX_SIZE,其代表我们分片中实际数据的长度,因为Internet中MTU的大小通常为576,所以我们的UDP数据包最好不要超过576-8-20大小(8为UDP头大小,20位IP报文大小),另外还要减去12(因为我们分片也有头,为12字节)

  • udp-piece-client.c:其向服务端发送一长串字符串,在发送之前先调用udp_piece_cut()对整个UDP数据包进行分片,然后逐个发送出去

  • udp-piece-server.c:其从客户端接收UDP数据,将接收的数据放到环形缓冲中,然后进行重组

五、附加

  • 本文只介绍了“UDP的分包与组包”,并没有涉及到UDP数据包确认、重传等机制,并且代码也只做到了分包与组包
  • 关于UDP更深一步的设计,会在后面“KCP”的文章中介绍的哦

这篇关于UDP分包与组包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/357813

相关文章

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

9.7(UDP局域网多客户端聊天室)

服务器端 #include<myhead.h>#define SERIP "192.168.0.132"#define SERPORT 8888#define MAX 50//定义用户结构体typedef struct{struct sockaddr_in addr;int flag;}User;User users[MAX];//用户列表void add_user(struct s

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); domain:AF_INET:网络通信,AF_LOCAL:本地通信 type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM protocol:协议编号一开始设0 返回值:文件描

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

文章目录 一. 网络编程套接字TCP和UDP的特点有连接 vs 无连接可靠传输 vs 不可靠传输面向字节流 vs 面向数据报全双工 vs 半双工 二. java用UDP实现网络编程代码实现:运行代码:启动多个客户端别人能否使用?实现翻译功能 一. 网络编程套接字 网络编程套接字, 就是指操作系统提供的网络编程的api, 称为"socket api" 操作系统, 提供的sock

Java高级Day37-UDP网络编程

109.netstat指令 netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况 netstat -an|more 可以分页显示 要求在dos控制台下执行 说明: LISTENING表示某个端口在监听 如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息 ctrl + c 退出指令 110.TCP连接秘密 1.当客户端连接到服务器后,

传输层协议UDP

本篇将主要介绍 UDP 协议,介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项,以及有关 UDP 的 Socket 编程程序,同时重点介绍了操作系统对于 UDP 协议报文的管理。         接着介绍了有关端口号的映射。 目录 UDP协议 1. UDP协议报头 2. UDP协议特点 3. UDP的缓冲区 4.

UDP通信实现

目录 前言 一、基础知识 1、跨主机传输         1、字节序          2、主机字节序和网络字节序          3、IP转换 2、套接字 3、什么是UDP通信  二、如何实现UDP通信          1、socket():创建套接字         2、bind():绑定套接字           3、sendto():发送指定套接字文件数据

MarkTool之网络篇UDP

UDP客户端         1、连接服务端         2、校验方式         3、接收数据类型         4、发送数据类型         5、暂停显示         6、将数据区域保存到文件         7、定时发送         8、快捷指令         9、批量发送         10、历史发送

udp网络通信 socket

套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP+端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 原始套接字:使用网络层或者数据链路层的接口进行编程,更难更底层,例如制作抓包等网络工具 网络套接字:实现用户通信的编程 udp网络通信 服务端server 分

HTTP 协议与 TCP、UDP 协议的区别

在网络编程和互联网应用开发中,HTTP、TCP 和 UDP 是常见的网络协议。它们分别用于不同的场景,具有不同的特性和应用。本文将深入探讨 HTTP 协议与 TCP、UDP 协议的区别,并分析它们在网络通信中的具体用途。 目录: 什么是 HTTP 协议?什么是 TCP 协议?什么是 UDP 协议?HTTP 协议与 TCP、UDP 的关系HTTP、TCP 和 UDP 的区别各协议的应用场景总结