开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
ifocnfig实际上还是比较简单的,只是一般只是使用,没有过多的去追究其实现本质,今天我就从以下几个方面来探讨一下:
- 安装
- 使用
- ifconfig实现方式
1.安装 安装比较简单,sudo apt-get install net-tools就好了
2.使用
这个工具很常见,具体的使用我就不细说了,而且网上一搜也是一大片的,没必要过多说明,下图是ifconfig -h查看的使用方法,大家可以参考下,网上说的会比ifconfig -h查看到的更为详细
3.ifconfig实现方式 我手上的代码是安卓上的,和咋们使用sudo apt-get install net-tools方式安装的ifconfig对应的代码会有区别,但实现的原理是相同的。
我把ifconfig的实现分为三部分,分别是内核处理,应用层处理和内核与用户态间的通信三部分
- 内核与用户态间的通信 内核和应用层的通信方式很多,如共享内存,netlink,ioctl,sys节点等等,但在ifconfig中,主要使用的是ioctl的方式,既然是ioctl的方式,那么就需要内核和用户态间协商cmd的,下图就是我截取的部分cmd的
对于ioctl来说,除了需要cmd外,还要考虑的就是fd,并不是所有的ifconfig命令都会使用同一个fd的,下面的图是安卓mtk平台上的代码情况,从图中可以看出,主要是使用了三个fd,从代码看,主要使用的是TT.socket。
除了fd和cmd外,
- 应用层处理 应用层处理比较简单,就是根据传递的参数,进行if else判断,然后执行对应的操作,之后就是通过ioctl与内核交互,内核根据cmd和传递的参数执行相应的操作,在这个过程中,有时候需要通过ioctl及对应的cmd获取相应的信息,然后再通过ioctl通知内核做相应的操作。
对于ifconfig -h,ifconfig -version等这类的命令是不需要采用ioctl的了。
-内核处理 内核处理也是比较简单的,前面已经说过了,是通过ioctl交互的,如下图所示的部分代码,就是内核处理ioctl的代码,其实说白了就是根据cmd的,做对应的处理
每一个cmd的处理说白了也与网络有点关系,在此就不过多介绍了,就给大家先介绍下整体的框架,好了解着一部分。