使用ioctl函数唯其如此临时的修改ip地址么

使用ioctl函数唯其如此临时的修改ip地址么,第1张

ip地址只是一个配置信息,没有永久修改这个概念,你想达到永久修改的意思,那就让你的程序,开机的时候被调用一次就好了。

想要重启以后仍然有效,你需要修改etc/network/interfaces配置文件,使用

Qfile类读写文件,要root权限

如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上,每一个网卡设备都有一个mac地址,但是却可 以有多个网络层地址,比如IP地址,然而这个事实无法很好地像用户提供 *** 作接口,所以就引出了ip别名(IP aliases)和辅助ip(secondary IP addresses)的概念。其实很容易理解这个事实,按照分层的思想,下层总是为上层服务,也就是为上层提供舞台,上层利用下层的服务,而不必让下层知 道自己的情况,如果一个拥有合理mac地址的网卡没有配置网络层地址(比如IP地址)这件事合理的话,那么为这个设备配置多个IP地址也是合理的,正好像 一个ip可以对应多个应用层端口一样,也就是说,下层对上层总是一对多的关系,在分层架构中这种关系是合理的。下面我们就看一下linux的网卡的ip地 址结构。刚才说了在linux中,一个网卡可以有多个IP,那么这多个ip有什么关系呢?其实这些ip组成了一个吊链结构,所谓吊链结构就是一些节点链接 成一条链,然后每个节点带有自己的一条链

每个节点代表的ip地址标识一个网段,这个节点的ip就是这个网段的 Primary地址,它下面所带的ip就是这个网段的Secondary地址,也就是说一个网卡可以带有各个节点所带链表长度之和个ip地址,而且这些 ip不是线形的,而是上述的吊链结构。我们看一下这么做有什么好处。玩过Cisco路由器的朋友可能都知道有个Secondary IP的概念,这个特性可以创建逻辑子网,也就是说在一个物理网口上连接两个子网,这咋看起来好像不可思议,其实很简单,比如这个网口接到一台交换机上,如 果这个网口没有配置Secondary IP的话,那么这台交换机只能连接一个网段的主机,比如19216811/24,但是,如果它配置了Secondary IP,那么就可以连接两个网段的主机,比如19216811/24和10001/24,道理就是这么简单,但是却很有用,该机制可以被路由汇 总策略所使用。注意上面这个例子中的Secondary IP不是这里说的linux的Secondary address,在linux中恰恰相反,只要一个网卡上配置的ip不是一个网段的,那么都是Primary IP,就是吊链结构中上面的那条主链中的IP,linux中的Secondary address是主链结点的子链结点中的IP,这一点一定注意,概念是不能混淆的。前面说的只是吊链中主链的作用,那么子链呢?其实想象一下也很简单,比 如一台机器上运行着一个代理服务器或者负载均衡服务,代理服务器或者负载均衡服务和主服务器要监听相同的端口,那么就可以用secondary address来解决了,只要需要在同一网段监听同一个端口的应用都是吊链中子链存在的原因,因此可以说,主链对外部或者说对下面链路层虚拟了多块网卡, 而子链向上层虚拟了多台机器,配置了吊链结构的linux主机如果说只有一块网卡,那么外部会认为它有多块网卡,对于内部,应用层会认为彼此在不同的主机 上,这就是效果。 除了上面大体的介绍之外,还有很多细节,吊链在主链上是没有主次的,子链除了第一个节点其它节点也不分主次,都是平行的关系,但是子链中的第一个节点总是 链接在主链中,它们携带的地址就是primary地址,它们下面隶属的子链携带的地址就是这个primary地址的secondary地址,如此看来,一 旦主链上一个节点被删除了,那么它的子链也将不复存在,所谓皮之不存毛将焉附。但是这种策略总是显得不是那么优美,因为父亲犯错,儿子也要受连累,这在现 代社会早就不时行了,那么就需要改变机制了,因此linux中特意有了一个选项,就是当一个primary地址被删除时,如果它有secondary地址 的话,那么它的第一个secondary地址(长子)继承被删除的primary地址的位置成为primary地址,这样就显得很合理了,要不然在删除 primary地址的时候,如果有程序用secondary地址,那么要么延迟删除,要么程序崩溃,采用自动提升策略的话就不会出现问题。 至于说IP aliases,那是以前版本有的了,就是一个实现问题,解决的问题和现在的secondary IP机制一样,它主要就是在物理网卡名字后面加上后缀从而成为虚拟网络接口,本质上和secondary IP机制没有区别,区别就是IP aliases显得不是那么直观,而secondary IP却是真正让应用看到了一个网卡的多个地址,比如你要是用IP aliases的话,有的时候你总是会问eth0:0是什么?我就曾经在内核里面拼命找eth0:0这个网络设备的注册代码,都要疯掉了也没有找到,其实 我并不是很傻,但是我却因为那个该死的名字作出了傻事。 下面就可以看看linux内核的实现代码了,首先弄明白一些数据结构,最重要的就是net_device,其次就是in_device,然后就是in_ifaddr,明白了这三个数据结构,一切就明白了,这是真的。

struct net_device { void ip_ptr; //指向一个in_device结构,这字段从net_device中分离表明一个网卡可以支持多种网络层协议的 } struct in_device { struct net_device dev; //指向它隶属的net_device,也就是网卡 atomic_t refcnt; //引用计数 int dead; struct in_ifaddr ifa_list; //所有的ip地址链表 }; struct in_ifaddr //代表一个ip地址 { struct in_ifaddr ifa_next; //上面的in_device中的ifa_list字段就是靠这个字段连成链的 struct in_device ifa_dev; //回指in_device结构 struct rcu_head rcu_head; u32 ifa_local; //ip地址 u32 ifa_address; u32 ifa_mask; //掩码 u32 ifa_broadcast; //广播地址 u32 ifa_anycast; unsigned char ifa_scope; unsigned char ifa_flags; //只有IFA_F_SECONDARY标志,因为除了这个就是primary地址了 unsigned char ifa_prefixlen; char ifa_label[IFNAMSIZ]; //名字,在ip aliases时代,它就可能是ethx:y的形式,在secondary ip时代,它统一就是ethx };注 意,上面的结构并没有将linux网卡的ip地址结构表示为吊链结构,所谓的吊链结构只是逻辑上的,在数据结构上,一个网卡所有的ip地址全部都在 ifa_list中被链接成一个线性的链表,至于是primary地址还是secondary地址就看in_ifaddr的ifa_flags字段了。每 当有新的地址被设置的时候,inet_insert_ifa总是被调用,linux为何没有在代码上将ip地址表示为吊链结构呢?我也不知道,个人感觉一 个net_device带有一个primary ip链表,然后每个primary ip节点带有一个secondary ip链表,这样会更好一些的,我觉得inet_insert_ifa实现的十分拙劣。添加地址可以通过两个用户空间程序搞定,一个是ifconfig,另 一个是ip addr add,ifconfig是基于ioctl进行地址添加的,而ip程序是基于netlink进行地址添加的,不管哪一种方式都可以达到目的,现在就可以看 看另一个问题了:为何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig设置的地址ip addr show却是可以看到。这个问题通过看代码一眼就可以明白,在ifconfig获得ip地址的时候,代码:

for (ifap = &in_dev->ifa_list; (ifa = ifap) != NULL; ifap = &ifa->ifa_next) { if (!strcmp(ifrifr_name, ifa->ifa_label) && sin_origsin_addrs_addr == ifa->ifa_address) { break; } }取 的是这个被找到的ifa的ip地址,而我们知道,所有的ifa链接成一个线性链表,那么找到了第一个就不会再往后走了,因此只能得到一个结果,就是链表最 前面的那个,而ip add show就不同了,具体在函数inet_dump_ifaddr中实现,该函数遍历所有的ifa,并且传到用户空间缓冲区。这里可以做一个实验:首先用 ip addr add添加几个不在同一个网段的primary ip地址,然后再ifconfig一个和前面的ip都不在一个网段的ip,然后可以用ifconfig查看一下,发现不是刚刚用ifconfig设置进去 的那个ip,而是用ip addr add添加进去的,这就说明ifconfig永远都是取的ifa链表最前面的那一个,还有一点要注意,就是如果你用ip addr add添加了很多的secondary ip地址,那么恰好你用ifconfig设置的ip地址和那些secondary ip在一个网段,那么所有的secondary ip都将被删除,这些都是sencondary ip的规范决定的,而且在代码中也有体现。另外还要注意,路由表的表项都是基于primary ip的,因为所有的 *** 作都是以primary ip为主的,比如在添加路由的时候:

void fib_add_ifaddr(struct in_ifaddr ifa) { struct in_device in_dev = ifa->ifa_dev; struct net_device dev = in_dev->dev; struct in_ifaddr prim = ifa; if (ifa->ifa_flags&IFA_F_SECONDARY) { //如果ifa是个sencondary地址,那么就找到它隶属的primary地址后然后以这个primary为主进行设置 prim = inet_ifa_byprefix(in_dev, prefix, mask); if (prim == NULL) { printk(KERN_DEBUG "fib_add_ifaddr: bug: prim == NULL/n"); return; } } fib_magic(RTM_NEWROUTE, RTN_LOCAL, addr, 32, prim); //添加进路由表 }到 此为止我们知道了不少东西,最重要的就是linux中网卡ip地址的吊链结构以及这么设计的好处,另外就是设置ip地址的方式有ioctl和 netlink。其实网卡拥有多个ip并不会带来什么冲突,本质上ip和网卡没有什么关系,它们唯一的关系就是靠网络分层模型联系在一起的,细节上就是靠 路由联系在一起的,比如我添加路由的时候指定了一个目的地址和下一跳ip地址以及一个网卡出口,那么内核会根据提供的目的地址将路由插在合式的位置,然后 将nh的网络设备设置为你提供的网卡出口,等到传输数据的时候就会查找路由从而找到出口,就是这么简单,你自己手动设置的路由可以随意设置,即使完全错误 内核也会将之加入路由表的,还有一种路由是内核自动生成的,就是在网卡刚刚up的时候,这时通过网卡的net_device找到其in_device然后 找到其ip地址,这样的路由称为链路路由。 通过secondary IP机制,你可以认为你的机器有很多网卡,对于应用,监听同一端口的应用会认为它们在局域网中不同的机器上,你可以随意使用这些ip地址而不会发生混乱,路由和底层的arp会处理好这一切,当然前提是你将路由设置对。 附: 用户空间有ifup/ifdown,/sbin/ip,ifconfig,还有netplugd守护进程,这些有何关系吗?这中间ip程序是最基本的,没 有任何策略,策略就是参数指定,要么就是别的程序调用它,而netplugd就是一个监控守护进程,通过netlink监控网卡状态,然后根据不同的监控 结果调用/etc/netplugd/netplug脚本,进而可能调用ifup/ifdown脚本,而后者就是脚本,其中会调用ifup-eth脚 本,最终整理好参数后调用ip程序(典型的就是:ip link set eth0 up/down),当然ip程序完全可以自己调用,比如ip addr add以及ip route add等等,而ifconfig没有那么绕圈子,就是通过ioctl进行设置,可以通过strace来观察。这其中奥妙大了去了,说白了就是策略和机制分 离,另外还体现出linux中的很多功能都是很小的程序组合而成的。

Linux的ip地址的吊链结构以及ip地址的寻址特性(详见《关于IP网段间互访的问题—路由是根本》)充分说明了linux的协议栈实现多么的完美,完全符合分层和封装模型,使得下层的逻辑和上层的逻辑完全解除耦合,也就是说ip层完全不依赖链路层以及物理层的物理布局,最后记住,ip层事情比如寻址路由只由ip层实现,之所有有链路层发现的路由,完全是为了方便。

LRESULT AcceptThread(LPVOID parm)

{

CSocket skt=(CSocket )parm;

CSocket acceskt=new CSocket();

while(1)

{

skt->Accept(acceskt);//这里会停止,只到有连接过来。

AfxBeginThread(ReceiveThread,acceskt);

acceskt=new CSocket();

}

}

ethtool eth0

[root@voipack ~]# ethtool eth0

Settings for eth0:

Supported ports: [ TP ]

Supported link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Advertised auto-negotiation: Yes

Speed: 100Mb/s

Duplex: Full

Port: Twisted Pair

PHYAD: 0

Transceiver: internal

Auto-negotiation: on

Supports Wake-on: umbg

Wake-on: g

Current message level: 0x00000007 (7)

Link detected: yes

这里最多可0X0000000 *** 作完成

0X0000001 不正确的函数

0X0000002 系统找不到指定的文件

0X0000003 系统找不到指定的路径

0X0000004 系统无法打开文件

0X0000005 拒绝存取

0X0000006 无效的代码

0X0000007 内存控制模块已损坏

0X0000008 内存空间不足,无法处理这个指令

0X0000009 内存控制模块位址无效

0X000000A 环境不正确

0X000000B 尝试载入一个格式错误的程序

0X000000C 存取码错误

0X000000D 资料错误

0X000000E 内存空间不够,无法完成这项 *** 作

0X000000F 系统找不到指定的硬盘

0X0000010 无法移除目录

0X0000011 系统无法将文件移到其他的硬盘

0X0000012 没有任何文件

0X0000019 找不到指定扇区或磁道

0X000001A 指定的磁盘或磁片无法存取

0X000001B 磁盘找不到要求的装置

0X000001C 打印机没有纸

0X000001D 系统无法将资料写入指定的磁盘

0X000001E 系统无法读取指定的装置

0X000001F 连接到系统的某个装置没有作用

0X0000021文件的一部分被锁定,现在无法存取

0X0000024 开启的分享文件数量太多

0X0000026 到达文件结尾

0X0000027 磁盘已满

0X0000036 网络繁忙

0X000003B 网络发生意外的错误

0X0000043 网络名称找不到

0X0000050 文件已经存在

0X0000052 无法建立目录或文件

0X0000053 INT24失败(什麼意思?还请高手指点站长一二)

0X000006B 因为代用的磁盘尚未插入,所以程序已经停止

0X000006C 磁盘正在使用中或被锁定

0X000006F 文件名太长

0X0000070 硬盘空间不足

0X000007F 找不到指定的程序

0X000045B 系统正在关机

0X000045C 无法中止系统关机,因为没有关机的动作在进行中

0X000046A 可用服务器储存空间不足

0X0000475 系统BIOS无法变更系统电源状态

0X000047E 指定的程序需要新的windows版本

0X000047F 指定的程序不是windwos或ms-dos程序

0X0000480 指定的程序已经启动,无法再启动一次

0X0000481 指定的程序是为旧版的 windows所写的

0X0000482 执行此应用程序所需的程序库文件之一被损

0X0000483 没有应用程序与此项 *** 作的指定文件建立关联

0X0000484 传送指令到应用程序无效

0X00005A2 指定的装置名称无效

0X00005AA 系统资源不足,无法完成所要求的服务

0X00005AB系统资源不足,无法完成所要求的服务

0X00005AC系统资源不足,无法完成所要求的服务

110 0x006E 系统无法开启指定的 装置或档案。

111 0x006F 档名太长。

112 0x0070 磁碟空间不足。

113 0x0071 没有可用的内部档案识别字。

114 0x0072 目标内部档案识别字不正确。

117 0x0075 由应用程式所执行的 IOCTL 呼叫 不正确。

118 0x0076 写入验证参数值不正确。

119 0x0077 系统不支援所要求的指令。

120 0x0078 此项功能仅在 Win32 模式有效。

121 0x0079 semaphore 超过逾时期间。

122 0x007A 传到系统呼叫的资料区域 太小。

123 0x007B 档名、目录名称或储存体标语法错。

124 0x007C 系统呼叫层次不正确。

125 0x007D 磁碟没有设定标。

126 0x007E 找不到指定的模组。

127 0x007F 找不到指定的程序。

128 0x0080 没有子行程可供等待。

129 0x0081 %1 这个应用程式无法在 Win32 模式下执行。

130 0x0082 Attempt to use a file handle to an open disk partition for an

operation other than raw disk I/O

131 0x0083 尝试将档案指标移至档案开头之前。

132 0x0084 无法在指定的装置或档案,设定档案指标。

133 0x0085 JOIN 或 SUBST 指令 无法用於 内含事先结合过的磁碟机。

134 0x0086 尝试在已经结合的磁碟机,使用 JOIN 或 SUBST 指令。

135 0x0087 尝试在已经替换的磁碟机,使用 JOIN 或 SUBST 指令。

136 0x0088 系统尝试删除 未连结过的磁碟机的连结关系。

137 0x0089 系统尝试删除 未替换过的磁碟机的替换关系。

138 0x008A 系统尝试将磁碟机结合到已经结合过之磁碟机的目录。

139 0x008B 系统尝试将磁碟机替换成已经替换过之磁碟机的目录。

140 0x008C 系统尝试将磁碟机替换成已经替换过之磁碟机的目录。

141 0x008D 系统尝试将磁碟机 SUBST 成已结合的磁碟机 目录。

142 0x008E 系统此刻无法执行 JOIN 或 SUBST。

143 0x008F 系统无法将磁碟机结合或替换同一磁碟机下目录。

144 0x0090 这个目录不是根目录的子目录。

145 0x0091 目录仍有资料。

146 0x0092 指定的路恕w经被替换过。

147 0x0093 资源不足,无法处理这项 指令。

148 0x0094 指定的路拿o时候无法使用。

149 0x0095 尝试要结合或替换的磁碟机目录,是已经替换过的的目标。

150 0x0096 CONFIGSYS 档未指定系统追踪资讯,或是追踪功能被取消。

151 0x0097 指定的 semaphore事件 DosMuxSemWait 数目不正确。

152 0x0098 DosMuxSemWait 没有执行;设定太多的 semaphore。

153 0x0099 DosMuxSemWait 清单不正确。

154 0x009A 您所输入的储存媒体标 元长度限制。

155 0x009B 无法建立其他的执行绪。

156 0x009C 接收行程拒绝接受信号。

157 0x009D 区段已经被舍弃,无法被锁定。

158 0x009E 区段已经解除锁定。

159 0x009F 执行绪识别码的位址不正确。

160 0x00A0 传到 DosExecPgm 的引数字串不正确。

161 0x00A1 指定的路恕ㄔ萧T。

162 0x00A2 信号等候处理。

164 0x00A4 系统无法建立执行绪。

167 0x00A7 无法锁定档案的部份范围。

170 0x00AA 所要求的资源正在使用中。

173 0x00AD 取消范围的锁定要求不明显。

174 0x00AE 档案系统不支援自动变更锁定类型。

180 0x00B4 系统发现不正确的区段号码。

182 0x00B6 作业系统无法执行 %1。

183 0x00B7 档案已存在,无法建立同一档案。

186 0x00BA 传送的旗号错。

187 0x00BB 指定的系统旗号找不到。

188 0x00BC 作业系统无法执行 %1。

189 0x00BD 作业系统无法执行 %1。

190 0x00BE 作业系统无法执行 %1。

191 0x00BF 无法在 Win32 模式下执行 %1。

192 0x00C0 作业系统无法执行 %1。

193 0x00C1 %1 不是正确的 Win32 应用程式。

194 0x00C2 作业系统无法执行 %1。

195 0x00C3 作业系统无法执行 %1。

196 0x00C4 作业系统无法执行 这个应用程式。

197 0x00C5 作业系统目前无法执行 这个应用程式。

198 0x00C6 作业系统无法执行 %1。

199 0x00C7 作业系统无法执行 这个应用程式。

200 0x00C8 程式码的区段不可以大於或等於 64KB。

201 0x00C9 作业系统无法执行 %1。

202 0x00CA 作业系统无法执行 %1。

203 0x00CB 系统找不到输入的环境选项。 \r

205 0x00CD 在指令子目录下,没有任何行程有信号副处理程式。

206 0x00CE 档案名称或副档名太长。

207 0x00CF ring 2 堆衬洏峇丑C

208 0x00D0 输入的通用档名字元 或 不正确, 或指定太多的通用档名字元。

209 0x00D1 所传送的信号不正确。

210 0x00D2 无法设定信号处理程式。

212 0x00D4 区段被锁定,而且无法重新配置。

214 0x00D6 附加到此程式或动态连结模组的动态连结模组太多。

215 0x00D7 Can't nest calls to LoadModule

230 0x00E6 The pipe state is invalid

231 0x00E7 所有的 pipe instances 都在忙碌中。

232 0x00E8 The pipe is being closed

233 0x00E9 No process is on the other end of the pipe

234 0x00EA 有更多可用的资料。

240 0x00F0 作业阶段被取消。

254 0x00FE 指定的延伸属性名称无效。

255 0x00FF 延伸的属性不一致。

259 0x0103 没有可用的资料。

266 0x010A 无法使用 Copy API。

267 0x010B 目录名称错。

275 0x0113 延伸属性不适用於缓冲区。

276 0x0114 在外挂的档案系统上的延伸属性档案已经毁损。

277 0x0115 延伸属性表格档满。

278 0x0116 指定的延伸属性代码无效。

282 0x011A 外挂的这个档案系统不支援延伸属性。

288 0x0120 意图释放不属於叫用者的 mutex。

298 0x012A semaphore 传送次数过多。

299 0x012B 只完成 Read/WriteProcessMemory 的部份要求。

317 0x013D 系统找不到位於讯息档 %2 中编号为 0x%1 的讯息。

487 0x01E7 尝试存取无效的位址。

534 0x0216 运算结果超过 32 位元。

535 0x0217 通道的另一端有一个行程在接送资料。

536 0x0218 等候行程来开启通道的另一端。

994 0x03E2 存取延伸的属性被拒。

995 0x03E3 由於执行绪结束或应用程式要求,而异常终止 I/O 作业。

996 0x03E4 重读I/O 事件不是设定成通知状态。

997 0x03E5 正在处理重读I/O 作业。

998 0x03E6 对记忆体位置的无效存取。

999 0x03E7 执行 inpage 作业发生错

使用 虚拟ip最多的场景可能是双机 ,往往结合着keepalived使用。其实没有双机软件也可以使用虚拟ip,下面介绍两种方法ip addr和ifconfig进行增删查虚拟ip。

增加虚拟ip :

ip addr add ip/netmask dev 网口名称,比如ip addr add 192168880/24 dev eth0

查看虚拟ip : 

ip addr show device_name或ip addr | grep eth0

ip addr =ip a= ip add list 查看网卡的ip和mac等,即使网卡处于down状态,也能显示出网卡状态,但是ifconfig查看就看不到。

删除虚拟ip:

ip addr del ip/netmask dev 网口名称,比如ip addr del 192168880/24  dev eth0

清空指定网卡的所有ip:

ip addr flush dev 接口

ip addr *** 作时的注意事项:

说明:网卡配置的ip一般为Primary ip,虚拟ip一般为Secondary ip,当删除Primary ip时Secondary ip也有可能同时被删除。

先查看ipv4或ipv6相应网卡开启提升参数promote_secondaries为1,当Primary ip被删除后,它的第1个Secondary ip将继承为Primary ip。

#  cat /etc/sysctlconf  | grep promote_secondaries

netipv4confeth0promote_secondaries=1

默认不开启,查不到结果则表明未开启。

Secondary ip和Primary ip标注如下

[root@localhost ~]# ip addr show eth0

2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:19:b9:ef:44:8b brd ff:ff:ff:ff:ff:ff

    # Primary ip

    inet 172160230/24 brd 172160255 scope global eth0

    inet 1011230/24 scope global eth0

    # Secondary ip

    inet 1011231/24 scope global secondary eth0

在linux中在一个网卡上配置的同一个网段的ip有Primary IP和Secondary address之分,如果不是同一个网段的ip总有一个是Primary IP,一条链上的吊链结构中上面的那条主链中的IP是Primary IP,Secondary address是主链结点的子链结点中的IP,一 旦主链上一个节点被删除了,那么它的子链也将不复存在,随之被删除。

可以通过调整一个参数来实现,当一个primary ip被删除时,如果它有secondary ip的话,那么它的第1个secondary地址(长子)成为primary地址,这样就显得很合理了,要不然在删除 primary地址的时候,如果有程序用secondary地址,要么延迟删除,要么程序崩溃。

开启的方法(主机重启后仍然生效的)

echo "netipv4confeth0promote_secondaries=1" >>/etc/sysctlconf

ifconfig eth1:1 192168510/24  up:起别名

ifconfig eth0:1 19216885 netmask 2552552550 up

ifconfig eth1:1 192168510/24 down : 删别名

ifconfig eth0:1 19216885 netmask 2552552550 down

ifconfig eth1 up :启用eth1网卡

ifconfig eth1 down : 禁用eth1网卡,这种禁用是从数据链路层断掉,但是网络层ip还在,有时候能ping 通,大概率是缓存表没有更新

ifdown eth0 : 禁用网卡,删除了网络层ip

二者本质上没有什么区别,只是表述方式不同。如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上 每一个网卡设备都有一个mac地址 , 但是却可以有多个网络层地址 ,比如IP地址,然而这个事实无法很好地像用户提供 *** 作接口,所以就引出了ip别名(IP aliases)和辅助ip(secondary IP addresses)的概念。其实很容易理解这个事实,按照分层的思想,下层总是为上层服务,也就是为上层提供舞台,上层利用下层的服务,而不必让下层知道自己的情况,如果一个拥有合理mac地址的网卡没有配置网络层地址(比如IP地址)这件事合理的话,那么为这个设备配置多个IP地址也是合理的,好比一个ip可以对应多个应用层端口一样,也就是说,下层对上层总是一对多的关系,在分层架构中这种关系是合理的。

比如一台机器上运行着一个代理服务器或者负载均衡服务,代理服务器或者负载均衡服务和主服务器要监听相同的端口,那么就可以用secondary ip来解决,只要需要在同一网段监听同一个端口的应用都是吊链中子链存在的原因,因此可以说,主链对外部或者说对下面链路层虚拟了多块网卡, 而子链向上层虚拟了多台机器,配置了吊链结构的linux主机如果说只有一块网卡,那么外部会认为它有多块网卡,对于内部,应用层会认为彼此在不同的主机 上,这就是效果。

添加地址可以通过2个用户空间程序搞定,一个是ifconfig,另一个是ip addr add,ifconfig是基于ioctl进行添加地址的,而ip是基于netlink进行添加地址的,不管哪一种方式都可以达到目的。 但为何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig设置的地址ip addr show却是可以看到这个问题先放一放。

ip addr增加的虚拟ip在物理主机或虚拟机重启后失效。

方法1:把命令加到/etc/rclocal里面

ip addr add 1921682674/32 dev eth1

方法2:高可用双机倒换后进行虚拟ip的增加

方法3:在/etc/sysconfig/network-scripts添加网卡名字,比如ifcfg-eth0:0,DEVICE=eth0:1 ---->子接口名

ONBOOT=yes

BOOTPROTO=static

IPADDR=192168109108

NETMASK=2552552550

ip addr *** 作ip时需要注意

ip addr和ifconfig的区别

以上就是关于使用ioctl函数唯其如此临时的修改ip地址么全部的内容,包括:使用ioctl函数唯其如此临时的修改ip地址么、从ip addr add和ifconfig的区别看linux网卡ip地址的结构、跪求关于在MFC中使用WSAIoctl第二个参数SIORCVALL的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10138313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存