ifconfig到底有啥秘密

164 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

ifocnfig实际上还是比较简单的,只是一般只是使用,没有过多的去追究其实现本质,今天我就从以下几个方面来探讨一下:

  • 安装
  • 使用
  • ifconfig实现方式

1.安装 安装比较简单,sudo apt-get install net-tools就好了

2.使用 这个工具很常见,具体的使用我就不细说了,而且网上一搜也是一大片的,没必要过多说明,下图是ifconfig -h查看的使用方法,大家可以参考下,网上说的会比ifconfig -h查看到的更为详细 企业微信截图_16690858469620.png

3.ifconfig实现方式 我手上的代码是安卓上的,和咋们使用sudo apt-get install net-tools方式安装的ifconfig对应的代码会有区别,但实现的原理是相同的。

我把ifconfig的实现分为三部分,分别是内核处理,应用层处理和内核与用户态间的通信三部分

  • 内核与用户态间的通信 内核和应用层的通信方式很多,如共享内存,netlink,ioctl,sys节点等等,但在ifconfig中,主要使用的是ioctl的方式,既然是ioctl的方式,那么就需要内核和用户态间协商cmd的,下图就是我截取的部分cmd的

企业微信截图_16690863412161.png

对于ioctl来说,除了需要cmd外,还要考虑的就是fd,并不是所有的ifconfig命令都会使用同一个fd的,下面的图是安卓mtk平台上的代码情况,从图中可以看出,主要是使用了三个fd,从代码看,主要使用的是TT.socket。

企业微信截图_16690873979241.png

除了fd和cmd外,

  • 应用层处理 应用层处理比较简单,就是根据传递的参数,进行if else判断,然后执行对应的操作,之后就是通过ioctl与内核交互,内核根据cmd和传递的参数执行相应的操作,在这个过程中,有时候需要通过ioctl及对应的cmd获取相应的信息,然后再通过ioctl通知内核做相应的操作。

对于ifconfig -h,ifconfig -version等这类的命令是不需要采用ioctl的了。

-内核处理 内核处理也是比较简单的,前面已经说过了,是通过ioctl交互的,如下图所示的部分代码,就是内核处理ioctl的代码,其实说白了就是根据cmd的,做对应的处理

企业微信截图_16690978671783.png

每一个cmd的处理说白了也与网络有点关系,在此就不过多介绍了,就给大家先介绍下整体的框架,好了解着一部分。