Ubuntu下tc命令配置网络时延、丢包、带宽

本文介绍了如何利用Linux的tc命令来配置网络环境,包括设置网络时延、丢包率、带宽限制等。通过示例详细解释了各个参数的用法,如添加、删除和更改网络模拟设置,帮助读者理解如何模拟不同的网络条件以进行网络性能测试。
摘要由CSDN通过智能技术生成

配置网络时延、丢包、带宽等

1. 查看网络流量管理

tc qdisc show

2. 时延

#sudo tc qdisc add dev 网卡名称 root netem delay 时延数值
sudo tc qdisc add dev eth0 root netem delay 15ms

如果想要删除之前设置的时延

sudo tc qdisc del dev eth0 root netem delay 15ms

也可以直接更改

sudo tc qdisc change dev eth0 root netem delay 30ms

丢包和带宽删除和更改与时延类似,不逐一举例子

3. 丢包

#sudo tc qdisc add dev 网卡名称 root netem loss 丢包数值
sudo tc qdisc add dev eth0 root netem loss 0.1%

如果想要添加网络丢包的成功率:

#将eth0网卡的传输设置为随机丢掉1%的数据包,成功率为30%
sudo tc qdisc add dev eth0 root netem loss 0.1% 30%

4. 带宽

#sudo tc qdisc add dev 网卡名称 root netem rate 带宽数值
sudo tc qdisc add dev eth0 root netem rate 10Gbps

5. 模拟延迟波动

#该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。 还可以更进一步加强这种波动的随机性
tc qdisc add dev eth0 root netem delay 100ms 10ms

6. 模拟包重复

#该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包
tc qdisc add dev eth0 root netem duplicate 1%

7. 模拟包损坏

#该命令将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包 。 (内核版本需在 2.6.16 以上)
tc qdisc add dev eth0 root netem corrupt 0.2%

8. 模拟包乱序

#该命令将 eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒。
tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
#新版本中,如下命令也会在一定程度上打乱发包的次序:# tc qdisc add dev eth0 root netem delay 100ms 10ms

9. 联合使用

sudo tc qdisc add dev eth0 root netem delay 15ms loss 1% rate 1000Mbps
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取网络性能指标时延丢包率的方法有很多,这里介绍一种基于C++的实现方法。 1. 获取时延 获取时延的方法通常是通过发送数据包并记录发送和接收的时间戳,然后计算两者之间的差值。以下是一个示例代码: ```c++ #include <iostream> #include <chrono> #include <thread> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { // 创建UDP套接字 int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd < 0) { std::cerr << "Failed to create socket" << std::endl; return -1; } // 设置目标地址和端口 struct sockaddr_in dest_addr; memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(12345); inet_pton(AF_INET, "127.0.0.1", &dest_addr.sin_addr); // 发送数据包并记录时间戳 char buf[256] = {0}; std::chrono::steady_clock::time_point send_time = std::chrono::steady_clock::now(); sendto(socket_fd, buf, strlen(buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); // 接收返回的数据包并记录时间戳 struct sockaddr_in src_addr; socklen_t src_addr_len = sizeof(src_addr); recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr*)&src_addr, &src_addr_len); std::chrono::steady_clock::time_point recv_time = std::chrono::steady_clock::now(); // 计算时延 std::chrono::microseconds time_diff = std::chrono::duration_cast<std::chrono::microseconds>(recv_time - send_time); std::cout << "Latency: " << time_diff.count() << " us" << std::endl; // 关闭套接字 close(socket_fd); return 0; } ``` 2. 获取丢包率 获取丢包率的方法通常是通过发送一批数据包并记录发送数量和接收数量,然后计算丢包率。以下是一个示例代码: ```c++ #include <iostream> #include <chrono> #include <thread> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { // 创建UDP套接字 int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd < 0) { std::cerr << "Failed to create socket" << std::endl; return -1; } // 设置目标地址和端口 struct sockaddr_in dest_addr; memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(12345); inet_pton(AF_INET, "127.0.0.1", &dest_addr.sin_addr); // 发送数据包并记录发送数量 char buf[256] = {0}; const int num_packets = 100; int packets_sent = 0; for (int i = 0; i < num_packets; i++) { sendto(socket_fd, buf, strlen(buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); packets_sent++; } // 接收返回的数据包并记录接收数量 struct sockaddr_in src_addr; socklen_t src_addr_len = sizeof(src_addr); int packets_recv = 0; for (int i = 0; i < num_packets; i++) { int ret = recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr*)&src_addr, &src_addr_len); if (ret > 0) { packets_recv++; } } // 计算丢包率 float packet_loss = 1.0f - static_cast<float>(packets_recv) / static_cast<float>(packets_sent); std::cout << "Packet loss: " << packet_loss << std::endl; // 关闭套接字 close(socket_fd); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值