当前位置:网站首页>netstat 及 ifconfig 是如何工作的。
netstat 及 ifconfig 是如何工作的。
2022-08-03 07:39:00 【hjjdebug】
----------------------------------------
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) 来获取到的。
边栏推荐
猜你喜欢
随机推荐
基于SSM开发的的小区物业管理系统小程序源码
流行和声基础大笔记
ArcEngine(八)用IWorkspaceFactory加载矢量数据
学习笔记:机器学习之逻辑回归
Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
如何在安装GBase 8c数据库的时候,报错显示“Host ips belong to different cluster?
第十二天&接口和协议
volta管理node版本
sqlserver2019安装失败
PMP每日一练 | 考试不迷路-8.2(包含敏捷+多选)
推荐系统-排序层-特征工程:用户特征、物品特征
boot - SSE
@Async注解的坑,小心
001-进程与线程
Mysql如何对两张表的相同字段,同时查询两张数据表
如何让背景色在任何设备宽高都能填充整个屏幕
ORB-SLAM2提取特征点
C语言实现树的底层遍历--超简代码
information_schema
最佳高质量字体