UDP网络编程如何减少丢包

    xiaoxiao2021-12-14  18

    1 前言

    1.1 网络模型和原始数据

    本文主要研究和解决同子网内不对等环境下传输大量UDP报文,如何减少UDP丢包的问题。

    1.1.1 测试机器:
    机器CPU内存IP地址网卡速率作用a数据发送者b数据接收者c数据接收者d数据接受者e交换机

    1.1.2 测试程序

    发送者

    int main(int argc, char **argv){ return 0; }

    接收者

    int main(int argc, char **argv){ return 0; }
    1.1.3 测试数据

    测试数据主要关注发送和接收者的CPU使用率、内存使用率、网卡对包率、应用层丢包率

    机器CPU使用率内存使用率网卡丢包率应用对包率作用a数据发送者b数据接收者c数据接收者d数据接受者e交换机

    1.2 丢包原因分析

    2 UDP协议介绍

    2.1 UDP介绍

    UDP 是 User Datagram Protocol(用户报文协议)的缩写,属于传输层的协议。RFC文档连接为:RFC768

    与同属于传输层的TCP协议不同,UDP没有连接握手过程、没有流控、没有确认、没有重传。因此上层应用需要自己保证数据的稳完整性,UDP协议也一般用于可容错的语音、视频传输。

    2.2 UDP包格式

    UDP协议包分为5个字段,包格式为:

    内容长度源端口2字节目的端口2字节数据长度2字节checksum2字节payloadN字节

    1. 源端口:发送端的UDP端口 2. 目的端口:接收端的UDP端口 3. 数据长度:数据长度包含了UDP协议头,因此数据长度最小值是8。 4. checksum:

    注意:

    UDP协议包里没有IP地址,那目的IP地址和原IP地址是什么时候加的呢?

    待补充

    使用socket编程的时候,并没有指定源端口,源端口是怎么添加的呢?

    使用UDP编程的时候,创建完UDP socket后,就可以调用sendto函数。当内容发现这个socket属于首次发送时,会自动给这个socket绑定一个UDP端口。 如果需要手动指定UDP socket的源端口,可以使用bind函数。这种情况主要用于:1)作为服务端监听UDP端口;2)防火墙只开放了指定范围的端口。

    2.3 UDP SOCKET 可选项

    常用的

    3 改进措施

    3.1 连接和非连接

    3.2 数据包长度

    3.3 发送缓存区和接收缓存区

    3.4 零拷贝技术

    转载请注明原文地址: https://ju.6miu.com/read-962211.html

    最新回复(0)