【计网】1.4网络的时延、丢包和吞吐量

在这里插入图片描述
本文基于《计算机网络——自顶向下方法》

时延的类型
  1. 处理时延:检查报文的分组(packet)的首部以及决定将该分组导向何处的时间是处理时延的一部分
  2. 排队时延:在队列中,当分组在链路上准备传输的时间称为排队时延,一个特定的分组的排队时延取决于先期到达的正在排队等待香链路传输的分组数量。如果该队列是空的而且没有其他分组在传输,则分组时延为0。
  3. 传输时延:指的是一个分组全部发送到链路上的时延,比如一个10Mb的分组要发送到一条100Mbps的链路上需要耗时0.1秒,这就是传输时延,请务必和下面的传播时延作区分。
  4. 传播时延:传播时延指的是一个分组从起点到目的地传播所花费的时间,传输的速率取决于该链路的物理媒体,比如双绞线、光纤等。

传输时延和传播时延的区别在于,传输时延是路由器将分组上传到链路上花费的时间,和两个路由器之间的距离无关。而传播时延是分组在链路上传播的时间,和两个路由器之间的距离有关。

总的时延是上面四种时延之和

排队时延和丢包

有关于丢包的问题,我们首先要明确一个概念:流量强度

流量强度是分组到达路由的平均速率和路由传输速率之比。如果流量强度大于1,也就是分组到达的速率比传输速率还要快,那么会导致发送速度赶不上接收速度,从而让等待队列无限延长,也就是说,排队时延会趋于无穷大!因此,设计系统的时候流量强度不能大于1。

理论上来说,在一个流量强度小于1的系统中,如果分组是周期性到达的,也就是分组到达间隔的时间是一样的话,那理论上是不需要排队的。但是实际上各个分组到达时间是随机的,如果出现多个分组同时到达,则可能会产生较大的时延。在分组随机到达的情况下,如果流量强度越接近1则平均排队时延越大,因为路由空闲的时间越少。

而排队时延的延长意味着有更多的分组在等待发送,但是一条链路能够容纳的分组缓存是有限的,如果等待的分组多到已经站满了缓存,那下一个到达的分组则会没有地方存储,路由器会将其丢弃(drop),这就是丢包

分组丢失比例,也就是丢包的比例也随着流量强度的增加而增加,因此一个节点的性能可以根据时延来度量,也能根据丢包概率来度量。

吞吐量

假设有一个路由器连接着服务器和客户机,路由到客户机的速率为Rc,路由到服务器的速率为Rs,由于一整条链路的最大吞吐量取决于其中传输速率最小的链路(和水管类似),因此该链路上的最大吞吐量为min{Rc,Rs}。推广得,吐过一个服务器到客户之间有N条链路的网络,则服务器到客户的文件传输吞吐量为min{R1, R2, R3,…, RN}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中获取网络性能指标需要使用系统调用或网络库提供的 API。以下是一些常用的函数: 1. 时延(延迟):使用 ping 命令可以获取网络延迟信息。在 C++ 中,可以使用 system() 函数调用 ping 命令并解析输出结果。例如: ```cpp #include <iostream> #include <cstdio> #include <cstring> using namespace std; float getDelay(const char* ipAddress) { char cmd[100]; sprintf(cmd, "ping -c 1 %s | grep 'time=' | awk '{print $7}'", ipAddress); FILE* fp = popen(cmd, "r"); if (!fp) { cerr << "Error: Failed to execute ping command." << endl; return -1; } char output[100]; fgets(output, sizeof(output), fp); pclose(fp); return atof(output); } ``` 2. 速率:可以使用系统调用获取接口的最大带宽,例如在 Linux 上,可以读取 `/sys/class/net/eth0/speed` 文件获取接口的最大速率。例如: ```cpp #include <iostream> #include <fstream> #include <string> using namespace std; float getMaxBandwidth() { ifstream ifs("/sys/class/net/eth0/speed"); if (!ifs.is_open()) { cerr << "Error: Failed to open file." << endl; return -1; } string line; getline(ifs, line); ifs.close(); return stof(line); } ``` 3. 吞吐量:可以使用网络库(如 libpcap 或 WinPcap)捕获网络数据包并计算吞吐量。例如: ```cpp #include <iostream> #include <pcap.h> using namespace std; void packetHandler(u_char* userData, const struct pcap_pkthdr* pkthdr, const u_char* packetData) { int* pktCount = reinterpret_cast<int*>(userData); (*pktCount)++; } int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t* descr = pcap_open_live("eth0", BUFSIZ, 0, -1, errbuf); if (!descr) { cerr << "Error: " << errbuf << endl; return -1; } int pktCount = 0; pcap_loop(descr, -1, packetHandler, reinterpret_cast<u_char*>(&pktCount)); pcap_close(descr); cout << "Packets received: " << pktCount << endl; return 0; } ``` 4. 包率:可以使用 ping 命令的包统计信息。例如: ```cpp #include <iostream> #include <cstdio> #include <cstring> using namespace std; float getPacketLoss(const char* ipAddress) { char cmd[100]; sprintf(cmd, "ping -c 10 %s | grep 'packet loss' | awk '{print $6}'", ipAddress); FILE* fp = popen(cmd, "r"); if (!fp) { cerr << "Error: Failed to execute ping command." << endl; return -1; } char output[100]; fgets(output, sizeof(output), fp); pclose(fp); return atof(output); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值