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字节 |
checksum | 2字节 |
payload | N字节 |
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 零拷贝技术