linux内核之——丢包分析

来源:互联网 发布:出差 知乎 编辑:程序博客网 时间:2024/05/17 07:32

      内核丢包分析主要就是对流经网卡设备的数据包进行分类的分析,如何获得接受多少包,丢失多少包,错误多少包等状态进行简要的分析。

    对于丢包的分析,我从两个方面来说:1、关于内核网卡的收包时丢包原因;2、分析pcap的丢包原因。本章主要是分析一下网卡的丢包以及如何获取包状态的方式。

    cpu对外围设备的基本上都是通过中断方式进行调度,网卡也不例外,通过中断的方式通知cpu,得知什么时候发送数据包,什么时候接受数据包。在网卡驱动中,我们采用了这种思想,采用软中断的方式,调用发送和接受函数,来实现网卡的基本功能,接受和发送数据。当然,网卡驱动并不是这样就实现了,还需要对一些内存空间映射,寄存器的配置等等。我们现在只是对一个正常工作的网卡进行分析。

    在网卡驱动中有一个结构体,struct net_device结构体(include/linux/netdevice.h),我们主要是对该结构体的字段进行分析。现在就对该结构体的字段进行分析。

   rx_packets: 它是对网卡设备收到得数据包进行统计,他统计的包都是好的数据包,也就是说,该字段统计的数据包,都是上交到协议栈中的数据包。执行代码为:

   rx_bytes: 它是对网卡设备收到得一个包(好包)的长度进行统计,但是该长度并不是就是指一个纯数据的长度,该长度应该包括:

  insb(DATAPORT, skb_put(skb,pkt_len), pkt_len);          //网卡上读取数据包
  skb->protocol=eth_type_trans(skb,dev);                    //获取帧类型字段
  netif_rx(skb);                                                              //上交协议栈
  dev->last_rx = jiffies;                                                //时间戳
  lp->stats.rx_packets++;                                          //接受包数统计
  lp->stats.rx_bytes+=pkt_len;                                //接受字节统计