网络性能的四大指标:带宽、时延、抖动、丢包


衡量网络性能的四大指标:带宽、时延、抖动、丢包;通常我们讲一个网络快不快,好不好是一种非常感性的概念,可以用这四大指标对一个网络进行定量的精准描述。
在这里插入图片描述

带宽

带宽的定义:在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。通常用每秒多少比特来表示(常用的单位是bps(bit per second))。对应的更大的单位还是Kbps, Mbps, Gbps;换算关系为1Gbps = 10241Mbps = 102410241Kbps = 1024102410241 bps。注意我们下载软件时显示的速度或者是文件大小显示的都是以Byte字节为单位的(1 Byte = 8 bits),如果以字节为单位通常写做大写的B,比如1KB = 8Kb。

时延

时延就是指报文从网络的一端到另一端所需要的的时间。计算几网络的时延分成4大部分:处理时延、排队时延、发送时延、传播时延。具体参见:ip网络的时延:发送时延(传输时延),传播时延,处理时延,排队时延

抖动

我们知道计算机网络中,数据是以一个一个报文的形式从一个主机到另外一个主机的。每个报文的时延并不完全一样。这里就引入了网络抖动的概念,抖动是指一段时间内的最大延迟与最小延迟的时间差。比如说你用iperf3对一个网络进行30s钟的测试,这30秒内所有报文里的最大延迟是10ms,最小延迟为5ms,那么网络抖动就是10ms-5ms=5ms。抖动可以用来评价网络时延的稳定性,抖动越小,网络越稳定。造成网络抖动的原因有很多,比如路由路径的切换,比如主机负荷的动态变化,比如网络传输设备(如路由器,交换机)的负荷的动态变化等等,所有的网络都存在在或大或小的抖动。

丢包

丢包是指一个或多个数据包的数据从发送端成功发送出去后,因为各种原因接收端未成正确的接收到数据包。这些未成正确接收的数据包都称作丢包了。丢包的原因有很多:比如网络传输设备运行出错,网络传输设备负荷大导致队列溢出而丢我,网络传输过程中因为干扰等各种原因误码了导致报文出错等等。我们通常用丢包率来衡量一个网络的好坏,丢包率越接近于0%,表示网络质量越好,越接近于100%认为网络质量越差。这里要注意,通常我们把误码率和丢包率混做一谈,但实际上这不是同一个概念,误码只是产生丢包的各种原因中一种。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
获取网络性能指标时延丢包率的方法有很多,这里介绍一种基于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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值