UDP网络编程如何减少丢包

1 前言

1.1 网络模型和原始数据

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

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


1.1.2 测试程序
  1. 发送者

    int main(int argc, char **argv){
        return 0;
    }
  2. 接收者

    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:

注意:

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

    待补充

  2. 使用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 零拷贝技术
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值