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;
}
  1. 接收者
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字节

checksum

2字节

payload

N字节

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

注意:

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

待补充

  1. 使用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 零拷贝技术