Freebsd

FreeBSD 11 不顯示 RX、TX 數據包和計數

  • March 7, 2017

我有一個 FreeBSD 11 系統,在其中我得到以下ifconfig命令輸出

# ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> groups: lo xn0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=503<RXCSUM,TXCSUM,TSO4,LRO> ether 0e:c2:a2:36:c1:b4 inet 10.0.0.71 netmask 0xffffff00 broadcast 10.0.0.255 nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> media: Ethernet manual status: active

這裡有兩個疑問:

  1. 為什麼我沒有像以前的 FreeBSD / ubuntu 系統那樣獲得 RX、TX 字節和數據包計數?我正在使用一個實用程序來解析此響應以獲取網路使用情況,但它失敗了(無法修改,它是第三方二進製文件)。
  2. FreeBSD 11 中的任何更改,因為它在舊版本中執行良好?我更感興趣的是解決這個問題或進行配置更改(如果這由某個.conf文件控制)而不是更改我的監視方法(例如解析來自iftop或其他命令的響應)

提前致謝 !

編輯 具體來說,在該二進製文件中使用了一個 C 庫來獲取結果為零的統計資訊。我附上了一個範常式式碼,它也為 rx/tx 字節返回零值,因為該資訊不可用。它使用庫getifaddrs中的函式sys/sockets

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>

struct if_data {
 unsigned char  ifi_type;
 unsigned char  ifi_physical;
 unsigned char  ifi_addrlen;
 unsigned char  ifi_hdrlen;
 unsigned char  ifi_recvquota;
 unsigned char  ifi_xmitquota;
 unsigned long  ifi_mtu;
 unsigned long  ifi_metric;
 unsigned long  ifi_baudrate;

 unsigned long  ifi_ipackets;
 unsigned long  ifi_ierrors;
 unsigned long  ifi_opackets;
 unsigned long  ifi_oerrors;
 unsigned long  ifi_collisions;
 unsigned long  ifi_ibytes;
 unsigned long  ifi_obytes;
 unsigned long  ifi_imcasts;
 unsigned long  ifi_omcasts;
 unsigned long  ifi_iqdrops;
 unsigned long  ifi_noproto;
 unsigned long  ifi_recvtiming;
 unsigned long  ifi_xmittiming;
 struct  timeval ifi_lastchange;
};


int main()
{
 struct ifaddrs    *ifap, *ifa;
 struct if_data    *ifadata = NULL;
 char *dev_name;

 if (getifaddrs(&ifap) < 0) {
   printf ("returning  for null");
   return 1;
 }

 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {

   if (ifa->ifa_flags & 0x01) {
     if ( ifa->ifa_addr->sa_family == AF_LINK) {
       if (ifa->ifa_data) {
         ifadata = (struct if_data *)ifa->ifa_data;
         dev_name = ifa->ifa_name;

         if (ifadata->ifi_ipackets == 0 && ifadata->ifi_opackets == 0)
         {
           printf("returning as zero for %s", dev_name);
           continue;
         }

         printf("name=%s ipkts=%ld opkts=%ld\n", dev_name,
           ifadata->ifi_ipackets, ifadata->ifi_opackets);

         printf("%lu", ifadata->ifi_ibytes);
         printf("%lu", ifadata->ifi_ipackets);
         printf("%lu",  ifadata->ifi_ierrors);
         printf("%lu", ifadata->ifi_iqdrops);
         printf("%lu", ifadata->ifi_imcasts);
         printf("%lu", ifadata->ifi_obytes);
         printf("%lu", ifadata->ifi_opackets);
         printf("%lu",  ifadata->ifi_oerrors);
       }
     }
   }
 }
 freeifaddrs(ifap);
 return 0;
}

要回答您的問題,我應該說,據我回憶,FreeBSD - 以及 macOS - 從未將RX/TX 數據包顯示為ifconfig命令的輸出。但是如果你說它在 7.x 和 8.x 中可用,我應該說至少在 10 和 11 中它不是,也許我沒有註意到 7.x 8.x 的時間。事實上,Linux 發行版包括 RHEL 衍生產品(RHEL、Fedora、CentOS、Scientific 等)、基於 Debian 的作業系統(Ubuntu、Debian Jessie 等)和大多數其他發行版都通過 RX/TX 數據包顯示ifconfig,但 FreeBSD 和 macOS 可以不是這樣。FreeBSD 的許多命令與 Linux 中的命令無關,其中許多只是以相同的方式呼叫,但實際上在許多情況下行為不同。與此同時,你的struct if_data對我來說看起來不太熟悉 - 也不正確,我建議你看看**<net/if.h>**. 換句話說,刪除您的if_data並嘗試包含準確的標題。

無論如何,要在 FreeBSD 中顯示輸入/輸出字節數,您應該使用netstat. 以下命令在 FreeBSD 和 macOS 上都可以正常工作:

netstat -idb [interface]

-i : interface
-d : show the number of dropped packets
-b : show the number of packets in and out

如果需要,您也可以使用 -B。它顯示有關 bpf() 對等點的統計資訊。這包括諸如 bpf 設備匹配、丟棄和接收的數據包數量等資訊,以及有關目前緩衝區大小和設備統計資訊的資訊。

順便說一句,對於監控網路流量,您還有另一個我強烈推薦的選項。您可以使用systat-ifstat選項來獲取介面的流量吞吐量、峰值和總計:

systat -ifstat

引用自:https://serverfault.com/questions/836079