• netstat 及 ifconfig 是如何工作的。


    ----------------------------------------
    netstat 统计udp包错误
    ----------------------------------------
    netstat -s -u
    用来统计udp 包信息,输出如下:(举例)
    我们会关注Udp 的3个errors.
    包接受errors
    接受缓冲errors
    发送缓冲errors

    发送缓冲通常是没有问题的,而问题往往会在接受缓冲上。

    $ netstat -s -u
    IcmpMsg:
        InType3: 52
        OutType3: 52
    Udp:
        263172957 packets received
        52 packets to unknown port received
        2368 packet receive errors
        11251 packets sent
        2368 receive buffer errors
        0 send buffer errors
        IgnoredMulti: 2027
    UdpLite:
    IpExt:
        InMcastPkts: 263167436
        OutMcastPkts: 652
        InBcastPkts: 2027
        OutBcastPkts: 4
        InOctets: 303655790429
        OutOctets: 10832225
        InMcastOctets: 276773987020
        OutMcastOctets: 28308
        InBcastOctets: 496617
        OutBcastOctets: 310
        InNoECTPkts: 288733932
    MPTcpExt:


    我跟踪了一下代码, 该错误信息的输出只是读取了
    /proc/net/snmp 文件, 可输出IcmpMsg, Udp, UdpLite: 段信息
    /proc/net/netstat 文件, 可输出IpExt,MPTcpExt 段信息。

    如果想真正找到udp包为何错误, 还要看内核是怎样把错误放进去的了。
    netstat 工具只是一个接口,告诉你一个统计信息。

    程序的技巧在于它定义好了一个大的数据结构,所要的信息都在这里了。
    象Iptab,Udptab,等等tab都是
    一个项数组构成. 每一个项是由
    struct entry {
        const char *title;  //台头
        char *out;        //输出格式等
        enum State type; //是否是数字等等
    };

    static const struct tabtab snmptabs[] =        //分为6个组, 每个组内各项对应你看到的各列数据。
      {   
          {"Ip", Iptab, sizeof(Iptab), &f_raw},
          {"Icmp", Icmptab, sizeof(Icmptab), &f_raw},
          {"Tcp", Tcptab, sizeof(Tcptab), &f_tcp},
          {"Udp", Udptab, sizeof(Udptab), &f_udp},
          {"Sctp", Sctptab, sizeof(Sctptab), &f_sctp},
          {"TcpExt", Tcpexttab, sizeof(Tcpexttab), &f_tcp},
          {NULL}
      };

    ----------------------------------------
    ifconfig 是怎样工作的。
    ----------------------------------------
    下载linux 源码包 net-tools
    apt source net-tools
    然后配置,编译和调试.
    net-tools 包含了好几个工具,较常用的是ifconfig,netstat,route等
    下面分析一下ifconfig
    其源代码入口为ifconfig.c 的main()
    核心部分是读取接口函数if_readlist()->if_readlist_proc()
    打开: "/proc/net/dev" 文件, 从中获取了它的接口名称s=get_name(name, buf)
    并获取了所有域值信息get_dev_fields(s, ife); //此处的s 是 buf去掉名称后的地址。

    一个scanf 就全搂过来了。
    剩下的就是打印了。
    由此看出ifconfig 也是从proc 文件系统下读取信息并显示的。

    问: ip地址是从哪里来得? 查:
           safe_strncpy(name, inet_ntoa(sin->sin_addr), len);
        sin->sin_addr 从哪里来?从ife->addr_sas 来,它调用了
        int if_fetch(struct interface *ife)  
        在其中调用了socket 的ioctl 函数获取的。
        fd = get_socket_for_af(AF_INET);
        if (fd >= 0) {
        safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
        ifr.ifr_addr.sa_family = AF_INET;
        if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) {
            ife->has_ip = 1;
            ife->addr = ifr.ifr_addr;
        }
        其中ife->addr 与 ife->addr_sas 是一个联合 union
        可见ip地址还是用ioctl(fd,SIOCGIFADDR,&ifr) 来获取到的。

  • 相关阅读:
    知识图谱:信息抽取简易流程
    存储过程的简单使用以及Mybatis调用存储过程
    Linux 2.6.4.30 Arm Architecture源码深度剖析---基于《ARM Linux内核源码剖析》
    echarts图从隐藏到显示以后大小有问题的解决方法
    JAVA面向接口编程课堂练习(马戏团)
    Golang web 项目中实现自定义 recovery 中间件
    负载均衡之一致性哈希算法详解
    百战c++(数据库1)
    react中关于函数调用()与bind this的原因
    【Vue源码分析】Vue3.0的优化
  • 原文地址:https://blog.csdn.net/hejinjing_tom_com/article/details/126096744