在UDP应用层面测试实现丢包的检测

我们已经已经做好在FPGA上的UDP的用户接口,也在PC上做好了UDP的收发函数,这里可以加上一些逻辑和代码实现UDP是否丢包以及是否错报的实验。

首先来看开UDP接收的用户层面的接口:

这里给出了udp长度,包头包尾分别用 sof和eof指示,还有我方以及对方的IP和端口。所有这些信号都在valid=1是有效。

这很简洁的接口,写起测试模块很容易

-------------

为了实行包内数据数据校验我们就是设置每一包内的所有字节递加,为了判断出包是否丢失我们让每包第一个字节的数字也依次递加。实现的 c代码如下:

全部完整PC运行的测试代码如下:

const static int    BUFFER_LENGTH = 12;
//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
 WSADATA wsaData;                                   //指向WinSocket信息结构的指针
 SOCKET src_socket;
 SOCKADDR_IN sin,saClient;                          //设置两个地址,sin用来绑定
                                                    //saClient用来从广播地址接收消息
 char cRecvBuff[800];                               //定义接收缓冲区
 int nSize,nbSize;
 int iAddrLen=sizeof(saClient);
 if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)           //进行WinSocket的初始化
 {
         printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
         return -1;
 }
 src_socket=socket(AF_INET, SOCK_DGRAM,0);
 sin.sin_family = AF_INET;
 sin.sin_port = htons(7001);             //发送端使用的发送端口,可以根据需要更改
 sin.sin_addr.s_addr = htonl(INADDR_ANY);
 if(bind( src_socket, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
 {
  printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
  return -1;
 }
 while(1)
 { 
  nSize = sizeof ( SOCKADDR_IN );
  if((nbSize=recvfrom (src_socket,cRecvBuff,800,0,
   (SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误
  {
   printf("Recive Error");
   break;
  }
  cRecvBuff[nbSize] = '\0';                              //字符串终止
  printf("%s\n",cRecvBuff);                              //显示所接收到的字符串
 
 
 }
 return 0;
}

----

在FPGA端我们写两个模块,分别是检测是否丢包的chk_udp_lost以及包内数据是否正确的chk_udp_frame,代码实现如下:


module chk_udp_lost(
input clk , rst ,
input valid,sof,
input [7:0]din,
output reg [31:0] lost_count,ok_count  
);

reg [7:0]  r;  wire r_equ_din = r == din ; 
always@ (posedge clk ) if (rst) r<=0; else if(valid & sof) r<=din+1;

always @ (posedge clk) 
casex ({ rst,valid,sof,r_equ_din })
4'b1xxx:{lost_count,ok_count}<=0;
4'b0111:ok_count <=ok_count+1;
4'b0110:lost_count<=lost_count+1;
endcase 

endmodule
module chk_udp_frame(
input clk , rst ,
input valid,sof,eof,
input [7:0]din,
output reg [31:0]err_count,ok_count  
);
reg [7:0] dinr ;always @ (posedge clk) dinr<=din;
 reg [7:0] st ; 
always @ (posedge clk )if (rst) st<=0; else case(st)
0:st <=10;
10:st<=15;
15:if (valid & sof) st<=20;
20:if (valid & eof )st<=30;
30:st<=35;
35:st<=40;
40:st<=10;
default  st<=0;
endcase 

reg [7:0] r ;
always @ (posedge clk)if (rst)r<=0; else case (st)
0,10:  r<=0;
15:if (valid & sof) r<= din ; 
20: r <= r+1;
endcase 

reg err  = 0 ;
always @ (posedge clk)if (rst)err<=0; else case (st)
0,10:  err<=0;
15:  err<=0; 
20:if (r!=dinr)err <=1;
endcase 

always @ (posedge clk) if (rst)err_count<=0;else if (st==40) if (err )err_count<= err_count +1 ;
always @ (posedge clk) if (rst)ok_count<=0;else  if (st==40) if (~err) ok_count<=ok_count + 1 ;

endmodule

这里注意chk_udp_lost模块由于第一数据需要初始化,这时候也会产生导致lost_coun加1,所以说是实际丢包数应该是lost_count-1,我们没有必要改代码,统计结果的时候注意下就好。

----------

在板子上运行,实际看结果:

 我们看到丢包和包内数据出错是存在的,虽然很低。并且我发现在电脑同时运行其他大型编译程序的时候(CPU使用率上升,更多进程分享存储带宽),时候丢包和包内错误会明显上升。

关于错误是在哪里产生,无非两点 FPGA端和PC端。

1,FPGA端导致错误,最大可能是FPGA与PHY接口部分的有一段数据穿越异步时钟,那部分产生的错误。哪里用了一个FIFO,设置流水级数是三级的时候出粗很多,设置为9级(最高)的时候才能得到上述截图的结果,因此我们可以怀疑这部接口虽然量上完善了,但是质上还没完美。

2,电脑端发送产生的丢包或者错误。当电脑开多个程序分别运行的时候,就能明显感觉到出错率的提升。

其实也好判断上述两点:现在是PC链接FPGA,我们用PC链接PC看看错误率情况。或者用FPGA链接FPGA看看错误率情况,前提是FPGA板子的UDP发射部分保证不出错,(这已经测试实现了,之后文字介绍)。

------

想起孙子兵法一句话:

微乎微乎至于无形,神乎神乎至于无声,故能为敌之司命

要细致入微,我们尽力研究透彻了项目设计中遇到的每个细节,哪怕不是我们当前项目的要求,这样融汇贯通,能达到做一个项目经验和功力的提升非常大。

又想起了兵法里面的另外一段:

声不过五,五声之变,不可胜听也;
色不过 五,五色之变,不可胜观也;
味不过五,五味之变,不可胜尝也;
战势不过奇正,奇正之变,不可胜穷也。
奇正相生,如循环之无端,孰能穷之哉

基本的知识点就那么点,我们从具体的设计里面深究下去挖到根源,之后总结出来这些基本规律,也就是上段说的五声五色五味,之后自己设计的时候运用上融汇贯通灵活运用上这色声味的基本原理规律或者套路,就能提出诸多方案并在这些方案中选择最优化的设计。

提到声味色,心经有讲:

无色声香味触法,无眼耳鼻舌身意

这是更高层次的抽象,已经上升到唯识层面了。已经将总结的五声五色五味升华成了诸法空性了。对我们的指导意义是及时消化这写规律,得其义忘其形。

非法非非法,一切都是无,之后就是《金刚经》的那句

一切有为法,如梦幻泡影,如露亦如电,应作如是观。

要看穿,要悟空,具体而言

无我相,无人相,无众生相,无寿者相.

觉悟到诸法空性,也就能看穿世间远离颠倒梦想了,也就修佛入门了,接下来就是无主宰非自然三世因果六道轮回...

你我程序猿工程狮凡夫俗子三尺微命一介书生,到不了那么高的境界无法乘风归去。要在这婆娑世界风雨红尘中携妻雏承上启下忙生活,暂且写写代码调调板子以混口狗粮。时有发骚,写写博文以自娱...

那咱们下篇就继续DEBUG哈,调试的内容是ICMP_REQUEST的信息提取以及ICMP_REPLY的生成。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Iperf3是一款网络性能测试工具,它可以进行TCP和UDP的带宽测量。不过在UDP测试中,Iperf3的丢包率可能不是很准确。 首先,UDP是一种无连接协议,数据包不会保证被传输到接收端。因此,在进行UDP测试时,即使在正常情况下发送的数据包没有丢失,也可能在网络拥塞或延迟等情况下发生数据包丢失的情况。这种情况下,Iperf3的UDP测试会误判数据包丢失率。 其次,Iperf3对于UDP测试丢包率计算方法并不精确,它通常使用公式“丢包率=1-(接收数据包数量/发送数据包数量)”来计算。但是这种计算方式并没有考虑丢失数据包的时间以及数据包的大小等因素。因此,在一些特殊情况下,Iperf3的丢包率算出来的数据可能会偏高或偏低。 因此,如果要进行准确的网络丢包测试,建议使用其他的网络性能测试工具或者结合Iperf3进行多种测试结果的比较。同时,在进行测试时应该考虑网络环境、延迟等因素,以及多次测试取平均值的情况。 ### 回答2: Iperf3是一款开源的网络性能测试工具,可以用来测试TCP和UDP网络吞吐量、延迟、带宽等性能指标。然而,由于UDP传输不可靠的特性,iperf3在进行UDP传输测试时可能会出现丢包情况,这也是网络中常见的现象之一。 然而,有时候iperf3 udp测试丢包率的结果并不准确。这主要是由于以下几个原因: 1、网络拥塞在UDP测试中会导致数据包的丢失,但是由于网络拥塞是瞬时现象,因此,UDP测试只测量了瞬间网络状态,而未测量网络性能的长期表现。 2、iperf3 UDP测试可能存在数据包重传的问题。在udp传输过程中,如果数据包丢失,则发送端通常会对丢失的数据包进行重传,因此,重传数据包的数量可能会导致iperf3测试结果偏差。 3、使用不同的操作系统和运行环境进行iperf3测试也可能会影响测试结果。不同操作系统和运行环境的网络协议实现方式不同,可能会对UDP传输性能产生不同的影响,从而导致测试结果不准确。 因此,为了获得更准确的测试结果,我们应该注意以下几点: 1、尝试进行多次测试,以便获得更准确的平均值。 2、将iperf3测试结果与其他网络性能测试工具的结果进行比较,以验证iperf3测试结果的准确性。 3、使用同一操作系统和运行环境的系统进行测试,可以消除不同操作系统的差异。 总之,iperf3 udp测试丢包率不准是一种常见现象,我们在进行UDP传输测试时应该注意这些可能影响测试结果的因素,并采取相应的措施进行测试,以获得准确的测试结果。 ### 回答3: Iperf3是一款基于UDP和TCP协议的网络测速工具,它可以用于测试网络带宽、延迟、丢包率等几个方的性能。 然而,在使用iperf3进行UDP测试时,我们可能会发现测试结果显示的丢包率并不准确,这是因为UDP协议本身就存在一些特性导致的。 首先,UDP协议是向无连接的,它不像TCP协议那样需要进行握手和连接,因此,在网络拥堵时,数据包可能会因为网络负荷过重而被丢弃,这种情况测试结果会显示出很高的丢包率。但是,也有可能是因为网络的拥堵导致路由器缓冲区满了,导致后续的数据包发生了乱序和最终的丢失,这也会导致测试结果的丢包率不准确。 其次,UDP协议是不可靠的,它只是尽力地将数据包送至目的地,而不保证送达的可靠性。在网络状况较坏的情况下,数据包可能会出现丢失或者大量重传,都会对测试结果产生影响,使得丢包率显示不准确。 另外,在进行UDP测试时,我们可以采用多次测试并取平均值的方式,以减小测试误差,并且加上选项"--udp-bw"设置限制带宽,避免过多大数据包丢失,从而更加准确的得出测试结果。 综上所述,iperf3 UDP测试丢包率不准确,是由于UDP协议本身的特性造成的,并不代表iperf3工具本身的问题。在进行UDP测试时,我们需要了解UDP协议的性质,并采取正确的测试方式,才能得到准确的测试结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值