采用UDP有3个关键点:
应用场景:
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议
详情可参阅:
https://eng.uber.com/employing-quic-protocol/
IP分片的概念
UDP与MTU的关系
MTU是指通信协议的链路层上面所能通过的最大数据包大小
单个UDP传输的最大内容1472字节,但由于不同的网络中转设备设置的MTU值并不相同:
为什么要对UDP进行分包与组包
主要思想
对于每一个分片我们需要设计其格式,例如下面是定义的一种格式。相关字段为如下所示
代码
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数据包确认、重传等机制,并且代码也只做到了分包与组包。
全部0条评论
快来发表一下你的评论吧 !