在本文中,我们将给您介绍关于IOS开发中,如何获取DHCP服务器地址!的详细内容,并且为您解答dhcp服务器获取ip的相关问题,此外,我们还将为您提供关于AndroidNDK开发中SO包大小压缩方法详
在本文中,我们将给您介绍关于IOS 开发中,如何获取 DHCP 服务器地址!的详细内容,并且为您解答dhcp服务器获取ip的相关问题,此外,我们还将为您提供关于Android NDK 开发中 SO 包大小压缩方法详解、Android 开发中 Activity 的正确打开方式、CentOS-1810 系统 DHCP 服务器 ISC DHCP 软件配置说明、Debian9.5 系统 DHCP 服务器 ISC DHCP 软件配置说明的知识。
本文目录一览:- IOS 开发中,如何获取 DHCP 服务器地址!(dhcp服务器获取ip)
- Android NDK 开发中 SO 包大小压缩方法详解
- Android 开发中 Activity 的正确打开方式
- CentOS-1810 系统 DHCP 服务器 ISC DHCP 软件配置说明
- Debian9.5 系统 DHCP 服务器 ISC DHCP 软件配置说明
IOS 开发中,如何获取 DHCP 服务器地址!(dhcp服务器获取ip)
我开发一个应用,基于 IOS 的,公司是做路由器系统的,所以会有不同 DHCP 地址,我想寻求 DHCP 地址
(不是 ip, 网关,路由器地址)
Android NDK 开发中 SO 包大小压缩方法详解
背景
这周在做Yoga包的压缩工作。Yoga本身是用BUCK脚本编译的,而最终编译出几个包大小大总共约为7M,不能满足项目中对于APK大小的限制,因此需要对它进行压缩。
这里先将Yoga编译脚本用CMAKE重新改写,以便可以在android studio中直接使用并输出一个AAR的包。后面又对它进行了压缩,最终将Yoga包的大小压缩到200多KB。
下面整理了一些可以用于减少NDK开发中Android SO包大小的方法:
1.STL的使用方式
对于C++的library,引用方式有2种:
- 静态方式(static)
- 动态方式(shared)
其中,静态方式在编译时会将用到的相关代码直接复制到目的文件中;而动态方式则会将相关的代码打成so文件,以便多次引用。由于编译器在编译时并不能知道所有被引用的地方,所以同时会打入了很多不相关的代码。
所以,如果项目中引用library的函数较多时,用动态方式可以避免多次拷贝,节省空间。相反,则直接使用静态方式会更节省空间。
NDK开发中,可以通过gradle的设置来配置:
defaultConfig{ externalNativeBuild{ cmake{ // gnustl_shared 动态 arguments "-DANDROID_STL=gnustl_static" } } }
在Yoga中,项目里的stl使用较少时,安卓运行时使用static的方式,而不是shared,所以这里采用static的方式。在采取了这种方式后,包的大小从2.7M缩减到了2M。
2.不使用Exception和RTTI
C++的exception和RTTI功能在NDK中默认是关闭的,但是可以通过配置打开的。
Android.mk:
APP_CPPFLAGS += -fexceptions -frtti
CMake:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -frtti")
Exception和RTTI会显著的增加包的体积,所以非必须的时候,没有必要使用。
RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型,即运行时获取对象的实际类型。C++通过下面两个操作符提供RTTI。
(1)typeid:返回指针或引用所指对象的实际类型。
(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。
在yoga中,RTTI的选项是默认打开的,而代码中其实并没有用到相关的功能,这里可以直接关闭。
Exception
使用C++的exception会增加包的大小,而目前JNI对C++的exception的支持是有bug的,比如下面这段代码就会引起程序的crash(对于低版本的android NDK)。
因此要在程序中引入exception要自己实现相关逻辑,yoga就是这么做的,这个又增加了一些包体大小。对于开发者来说,exception可以帮助快速定位问题,而对于使用者并不是那么重要,这里可以去掉。
try { ... } catch (std::exception& e) { env->ThrowNew(env->FindClass("java/lang/Exception"), "Error occured"); }
在yoga中,在关闭RTTI和Exception功能并把exception相关的代码都去掉后,包的大小从2M缩减到的1.8M。
3.使用 gc-sections去除没有用到的函数
去除未使用的代码显然可以减少包体的大小,而在NDK的开发中,并不需要手动的来做这一点。可以开启编译器的gc-sections选项,让编译器自动的帮你做到这一点。
编译器可以配置自动去除未使用的函数和变量,以下是配置方式:
CMake:
# 去除未使用函数与变量 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") # 设置去除未使用代码的链接flag SET_TARGET_PROPERTIES(yoga PROPERTIES LINK_FLAGS "-Wl,--gc-sections")
Android.mk:
LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections LOCAL_CFLAGS += -ffunction-sections -fdata-sections LOCAL_LDFLAGS += -Wl,--gc-sections
4.去除冗余代码
在NDK中,链接器还有一个选项 “-icf = safe”,可以用于去除代码中的冗余代码。但是要注意的是,这个选项也有可能去除定义好的inline函数,这里必须要做好权衡。
下面是配置方式:
CMake:
SET_TARGET_PROPERTIES(yoga PROPERTIES LINK_FLAGS "-Wl,--gc-sections,--icf=safe")
Android.mk:
LOCAL_LDFLAGS += -Wl,--gc-sections,--icf=safe
5.设置编译器的优化flag
编译器有个优化flag可以设置,分别是-Os(体积最小),-O3(性能最优)等。这里将编译器的优化flag设置为-Os,以便减少体积。
CMake:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
Android.mk
LOCAL_CPPFLAGS += -Os LOCAL_CFLAGS += -Os
在采用了3,4,5这几种方式后,Yoga包的大小从1.8M减少到了1.7M。这里减少的比较少是因为Yoga在这方面已经做的挺好了,其他的库可能会更有效。
6.设置编译器的 Visibility Feature
还有个减少包体大小的方法,就是设置编译器的visibility feature。
Visibility Feature就是用来控制在哪些函数可以在符号表中被输入,由于C++并不是完全面向对象的,非类的方法并没有public这种修饰符,因此,要用Visibility Feature来控制哪些函数可以被外部调用。
而JNI提供了一个宏-JNIEXPORT来控制这点。所以只要对函数加上这个宏,像这样:
// JNIEXPORT就是控制可见的宏 // JNICALL在NDK这里没有什么意义,只是个标识宏 JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)
然后在编译器的FLAGS选项开启 -fvisibility = hidden 就可以。这样,不仅可以控制函数的可见性,并且可以减少包体的大小。
CMake:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
7.设置编译器的Strip选项
我在把Yoga库编译成AAR包的过程中发现,它的体积明显会大于最后打包进APK的大小,这点非常不合理,但是无法找到原因。
最终搜索到这是谷歌NDK的一个bug,在打AAR包的过程中,无论是debug版本还是release版本,NDK toolchain不会自动的把方便调试的C++ 符号表(Symbol Table)中数据删除,而只会在打APK包的时候进行这一操作。这就导致了打成的AAR包中的SO体积明显偏大。
找到原因后这个问题就很好解决了,可以手动的在链接选项中加入 strip参数,配置如下所示:
SET_TARGET_PROPERTIES(yoga PROPERTIES LINK_FLAGS "-Wl,--gc-sections,--icf=safe,-s")
在强制进行strip操作后,将Yoga包的体积从1.7M成功减少到了282KB。
8.去除C++代码中的iostream相关代码
使用STL中的iostream相关库会明显的增加包的体积,而NDK本身是有预编译库(android/log.h)可以代替这一功能的,在Yoga这里,用log的函数代替了iostream中的所有函数,如:
//代替所有的iostream库里函数 //cout << obj->toString() << endl; __android_log_print(ANDROID_LOG_VERBOSE,"Yoga","Node is: %s",obj->toString().c_str());
在做完代替之后,yoga包的体积从282KB减少到了218KB。
总结
在做完这一系列工作后,最终成功的压缩了Yoga包的体积,从几M到最后输出一个218KB的AAR包提供使用。以上几种方法并不局限于Yoga包的缩减。在NDK开发中,要缩减SO包的体积都可以按照这几种方式尝试一下。
以上就是Android NDK 开发中 SO 包大小压缩方法详解的详细内容,更多关于Android NDK开发SO包压缩的资料请关注其它相关文章!
- Android数据缓存框架内置ORM功能使用教程
- Android 性能优化实现全量编译提速的黑科技
- Android neon 优化实践示例
- Android开发OkHttp执行流程源码分析
- Android 动态加载 so实现示例详解
- Android中FileProvider的各种场景应用详解
Android 开发中 Activity 的正确打开方式
adb shell dumpsys activity
输入这个命令可以得到一个清晰的 Task 视图,比如你有多少个 Task ,哪些 activity 在其对应的 Task 等相关信息。
下图是一张运行这个命令的输出截图。
从图中可以看出,有两个 Task (#103, #102) 。
Task #103 : affinity = “cn.six.task2”, size = 3 (它里面有三个activity)
— Activity One
— Activity Three
— ActivityTwo
Task #102 : affinity = “cn.six.adv”, size = 1
— Activity One
拥有了这个神奇的命令—— “adb shell dumpsys activity” ,我们就可以更好地探索 Activity 的启动模式啦…
Default
到达此 activity 的 Intent ,系统会默认地在目标 Task 中创建一个新的实例并将默认的启动模式属性设置为 "default" 。
“Default” 是 activity 的默认启动模式,也就是说当你未给 activity 指定启动模式的时候,系统默认会给一个 “Default” 作为它的启动模式。
SingleTop
如果一个启动模式为 SingleTop 的 activity 实例在目标栈顶,intent 启动该 activity 时系统将通过 onNewIntent 的方法将 intent 传递给已有的那个实例而不会新创建一个的实例。
注意:并不是清除栈顶的 activity !!!(也就是说只要栈顶不是本 activity ,都会创建新的实例,是本 activity 则重用不新建)。
SingleTask
这个是最难理解的,下文中我会搭配几个例子来细细讲解这个复杂的启动模式。
1. A(Default) -> B(singleTask)
我们有两个 Activity ,A 和 B ,其中 B 是 SingleTask 模式,现在从 A 跳转到 B 。
首先在 Manifest 中写入启动模式,如下:
?
1 2 3 4 |
|
Android 官方文档中提到 “ intent 启动一个(SingleTask) 的 Activity ,系统会将这个 Activity 创建在一个新的 Task 根部”。 SO ,听起来会是这个样子?
但实际上,当我们运行命令 “adb shell dumpsys activity” 时,发现 B 这货诡异地和 A 出现在一个 Task 中。
这个问题有一点小难表达,因为这里面 B 使用了 android:taskAffinity
属性。 后文中会有详解。
2. A(Default) -> B(singleTask) : B has a taskAffinity attribute
在 manifest 中这样写:
?
1 2 3 4 |
|
在这里, A 启动 B 的效果就不一样啦。如下:
这个和上一个例子的唯一不同就是属性 “android:taskAffinity” 。 当你不声明 affinity 属性, 那么 activity 就会以包名作为其默认值。在这个例子中, 默认的 affinity 值就是 “cn.six.adv” 。
当 A 启动 B ,即使 B 的启动模式是 singleTask ,但也只有当 android:taskAffinity
属性和 A 不同时才会创建新的 task 。
看到这里,第一个例子是不是就顿时豁然开朗? 为什么 A 和 B 在同一个 Task 中呢?因为它们的 taskAffinity
属性值是一样滴。
用逻辑来表达,就像是这样:
?
1 2 3 4 5 6 7 8 |
|
那么这个例子中, A 跳转 B, B 的启动模式是 “singleTask” , 并且 B 的 taskAffinity 不是 “cn.six.adv” 。 所以 B 会在一个新建的 Task 中。
3. A(default) -> B(singleTask) -> C(singleTask) -> B(singleTask)
manifest 如下:
?
1 2 3 4 5 |
|
(1). A -> B
因为 C 的 affinity 是 “task2” ,而 Task 中已经有一个和它一样属性值的 B ,所以 C 会被放在 Task 2 中。
(3) A -> B -> C -> B
首先看一下实际结果
好奇怪啊! C 去哪里啦?
事情呢,是这个样子滴。 C->B , B 的启动模式是 singleTask 而且它的 affinity 属性值是 “task2”, 当系统发现有一个 affinity 属性值为 task2 的 Task 2 所以就把 B 放进去了。但是, 其中已经有一个 B 的实例在 Task 2 之中。 所以系统会将已有的 B 的实例赋予一个 CLEAR_TOP(清除顶部)标志。所以 C 是这么没的。
4. SingleTask 小结
?
1 2 3 4 5 6 7 8 9 10 |
|
SingleInstance
SingleInstance 要比 SingleTask 好理解很多。
如果一个 Activity 的启动模式为 SingleInstance, 那么这个 Activity 必定会在一个新的 Task 之中, 并且这个 Task 之中有且只能有一个 Activity 。
再来一波栗子。
1. A(default) –> B(singleInstance) –> C(default)
(1). A -> B
(2). A -> B -> C
拥有 “singleInstance” 启动模式的 activity 不予许其他任何 Activity 在它的 Task 之中。所以它是这个 Task 之中的独苗啊。当它跳转另外一个 activity 时, 那个 Activity 将会被分配到另外一个 Task 之中——就像是 intent 被赋予了 FLAG_ACTIVITY_NEW_TASK 标志一样。
由于 B 需要一个只能容纳它的 Task , 所以 C 会被加上一个 FLAG_ACTIVITY_NEW_TASK 标识。所以 C(default) 变成了 C(singleTask) 。
然后结果变成了这样:
注:如果跳转的流程是 “A(default) –> B(singleTask) –> C(default)”, 那么结果会是这样:
如何去运用启动模式呢?
假如, 你需要在 service 在后台中做一些耗时操作,当它完成时, 你需要从此 service 中跳转进入一个 Activity 中,你会怎样做?
Service 是 Context 一种扩展, 它含有 startActivity(intent)
方法。但是当你调用service.startActivity(intent)
时,你的程序必然会崩。报错如下:
?
1 2 3 4 |
|
这就是上文中提到的。当一个 Activity A 跳转进入另一个 Activity B (它们的启动模式都为默认的 default ), 所以这个 B 会和 A 在一个 Task 之中。但是当你想让 service 跳转到 Activity B, 由于 service 并不是一个 Activity , 所以它没有相关的 task 信息。所以 Service 不会出现在 Activity 的任务栈之中。这种情况下,Activity B 就不知道自己的 Task 在哪里了。
为了解决上述问题,我们可以告诉 Activity B 它应该在一个新的 Task 之中:
?
1 2 3 4 |
|
瞅见没?这才是 Activity 的启动模式的正确打开方式。
CentOS-1810 系统 DHCP 服务器 ISC DHCP 软件配置说明
DHCP 全称 Dynamic Host configuration protocol, 动态主机配置协议。是一个局域网的网络协议,使用 UDP 协议工作,它可以为客户机自动分配 IP 地址、子网掩码以及缺省网关、DNS 服务器的 IP 地址等 TCP/IP 参数, 简单来说, 就是在 DHCP 服务器上有一个数据库, 存放着 IP 地址、网关、DNS 等参数。 当客户端请求使用时, 服务器则负责将相应的参数分配个客户端,避免客户端手动指定 IP 地址等。特别是在一些大规模的网络中。客户端数目较多,使用 DHCP 可以方便对这些机器进行管理,为客户机提供 TCP/IP 参数配置,如 IP 地址、网关地址和 DNS 服务器等,不仅效率高,而且不存在 IP 地址冲突的情况现在的无线路由器默认都带有 DHCP 功能,也就是说一个无线路由器同时也是一个 DHCP 服务器。
一、DHCP 有三种机制分配 IP 地址:
1. 自动分配方式:DHCP 服务器为主机指定一个永久性的 IP 地址,一旦 DHCP 客户端第一次成功从 DHCP 服务器租用到 IP 地址,就可以永久使用该地址。
2. 动态分配方式:DHCP 服务器给主机指定一个有时间限制的 IP 地址, 时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3. 手工分配方式:客户端的 IP 地址是由网络管理员指定的,DHCP 服务器只是将指定的 IP 地址告诉客户端主机。
三种地址分配方式中, 只有动态分配方式可以重复使用客户端不再需要的地址,下面是 DHCP 涉及的常见术语:
作用域:一个完整的 IP 地址段,DHCP 协议根据作用域来管理网络的分布、分配 IP 地址及其他配置参数。
超级作用域:用于管理处于同一个物理网络中的多个逻辑子网段。超级作用域中包含了可以统一管理的作用域列表。
排除范围:把作用域中的某些 IP 地址排除,确保这些 IP 地址不会分配给 DHCP 客户端。
地址池:在定义了 DHCP 的作用域并应用了排除范围后,剩余的用来动态分配给 DHCP 客户端的 IP 地址范围。
租约:DHCP 客户端能够使用动态分配的 IP 地址的时间。
预约:保证网络中的特定设备总是获取到相同的 IP 地址。
二、DHCP 协议的工作过程:
1. 发现阶段:即 DHCP 客户机寻找 DHCP 服务器的阶段。DHCP 客户机以广播的方式发送 DHCP discover 发现信息来寻找 DHCP 服务器(因为 DHCP 服务器的 IP 地址对客户机来说是未知的),由于客户机不知道 DHCP 服务器的 IP 地址,所以它使用 0.0.0.0 的地址作为源地址,使用 UDP68 端口作为源端口,使用 255.255.255.255 作为目标地址,使用 UDP67 端口作为目的端口来广播请求 IP 地址信息。广播信息中包含了 DHCP 客户机的 MAC 地址和计算机名,以便使 DHCP 服务器能确定是哪个客户机发送的请求。网络上每一台安装了 TCP/IP 协议的主机都会接收到这种广播信息,但只有 DHCP 服务器才会作出响应。
2. 提供阶段:即 DHCP 服务器提供 IP 地址的阶段。在网络中收到 DHCP discover 发现信息的 DHCP 服务器都会作出响应,它从尚未出租的 IP 地址中挑选一个分配给 DHCP 客户机,向 DHCP 客户机发送一个包含出租的 IP 地址和其他设置信息,因为 DHCP 客户机还没有 IP 地址,所以 DHCP 服务器使用自己的 IP 地址作为源地址,使用 UDP67 端口作为源端口,使用 255.255.255.255 作为目标地址,使用 UDP68 端口作为目的端口来广播,通过 DHCP offer 消息发送给客户端。
3. 选择阶段:DHCP 客户机选择某台 DHCP 服务器提供的 IP 地址的阶段。 如果有多台 DHCP 服务器向 DHCP 客户机发来的 DHCP offer,客户机只接收第一个收到的 DHCP offer,然后它以广播的方式回答一个 DHCP request 请求信息。该信息中包含它所选定的 DHCP 服务器请求 IP 地址的内容。之所以要以广播的方式回答,是为了通知所有的 DHCP 服务器,它将选择某台 DHCP 服务器所提供的 IP 地址。
4. 确认阶段:即 DHCP 服务器确认所提供的 IP 地址的阶段。当 DHCP 服务器收到 DHCP 客户机回答的 DHCP resquest 请求后,它便向 DHCP 客户机发送一个包含它提供的 IP 地址和其他设置的 DHCP ACK 确认信息,告诉 DHCP 客户机可以使用它所提供的 IP 地址。然后 DHCP 客户机便将其 TCP/IP 协议与网卡绑定,除了 DHCP 客户机所选择的服务器 IP 外,其他的 DHCP 服务器都将收回曾提供的 IP 地址
5. 重新登陆:以后 DHCP 客户机每次登陆网络时,就不需要再发送 DHCP discover 发现信息了。而是直接发送包含前一次所分配 IP 地址的 DHCP resquest 请求。当 DHCP 服务器收到这一信息后,它会尝试让客户机继续使用原来的 IP 并回答一个 DHCP ACK 确认信息,如果此 IP 地址无法分配个原来的 DHCP 客户机时(比如 IP 分配给其他 DHCP 客户机使用) ,则 DHCP 服务器给 DHCP 客户机回答一个 DHCP NACK 否认消息,当原来的 DHCP 客户机收到此消息后,它就必须重新发送 DHCP discover 发现信息重新请求新的 IP 地址。
6. 更新租约:DHCP 服务器向 DHCP 客户机出租的 IP 地址一般都由一个租借期限,期满后 DHCP 服务器会收回出租的 IP 地址。如果 DHCP 客户机要延长其 IP 租约,则必须更新其租约。DHCP 客户机启动时和 IP 租约期限过一半时,DHCP 客户机都会自动向 DHCP 服务器发送其更新租约的信息。
三、安装 DHCP 服务软件,Linux 用的 DHCP 软件是 Internet 系统协会的 DHCP 服务软件 ISC DHCP。
--------------------------------------------------------
[root@CentOS7 ~]# yum install dhcp.x86_64
--------------------------------------------------------
四、配置 DHCP 服务软件
DHCP 的主要配置文件 /etc/dhcp/dhcpd.conf。下面要做的就是对这个文件进行配置。配置 /etc/dhcp/dhcpd.conf 文件参数说明
DHCP 服务器的配置比较简单,所有的配置集中在 /etc/dhcp/dhcpd.conf 配置文件中,所有的配置语句可以分为 3 类:一类是参数,用于表明如何执行任务,是否要执行任务。第二类是声明语句,用来描述网络布局、客户、提供 ip 地址的策略等。还有一类是发送给客户的选项,实际上是加了 option 关键字的参数。其中每行开头的‘#’表示注释,而每一行配置最后都要以 “;” 作为结尾,这很重要。
1.DHCP 配置文件中的 parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户
ddns-update-style :
该参数用来指定 DHCP 服务器对 DNS 服务器进行更新时采用的更新类型。有 3 个类型分别是 ad-hoc、interim、none。ad-hoc 方式基本上已经不再采用,interim 表示 DNS 互动更新模式,none 表示不支持动态更新,一般设置为 none。
default-lease-time :
该参数的作用是定义默认的 IP 地址租约时间,其单位为秒。
max-lease-time :
该参数用来指定最大租赁时间长度,单位是秒。上面的是默认租约时间,这个是如果客户要求了租约时间,租约时间如果超过这个值,就以这个值为准,不以客户要求的为准。
server-name :
通知 DHCP 客户服务器名称。
hardware :
指定客户端的硬件接口类型和硬件地址。其格式如下:
hardware ethernet 0:0:c0:5d:bd:95;
fixed-address
指定为客户端分配一个或者多个固定 IP 地址,该参数只能出现在 host 声明语句中。如果指定了多个 IP 地址,那么当客户端启动时,它会被分配到相应子网中的那个 IP 地址上。
2.DHCP 配置文件中的 declarations (声明语句):用来描述网络布局、提供客户的 IP 地址等
subnet 语句
该语句用来定义一个作用域。其格式如下:
subnet 网络 子网掩码 {
[参数]
[选项]
}
range 语句
该语句定义了起始 IP 和终止 IP 提供动态分配 IP 的范围,如果只指定起始 IP 地址而没有终止 IP 地址,则范围只包含一个 IP 地址,在一个 subnet 语句中,可以有多个 range 语句,但是这些 range 语句所覆盖的 IP 地址范围不能交叉或者重复。其格式如下:
range 起始 IP 终止 IP;
host 语句
该语句用来定义用户保留地址,其格式如下:
host 主机名 {
[hardware]
[fixed-address]
}
这里的主机名可以自己定义,[hardware] 参数用来指定需要保留 IP 地址的客户端的 MAC 地址,[fixed-address] 用来指定分配的固定 IP 地址。
3. DHCP 配置文件中的 option(选项):用来配置 DHCP 可选参数,全部用 option 关键字作为开始
subnet-mask :为客户端设定子网掩码。
domain-name :如果客户端的 /etc/resolv.conf 里面设置了 search 参数,这个域名就是对应 search 参数后面的设置。
domain-name-servers : 为客户端指明 DNS 服务器 IP 地址。
host-name :为客户端指定主机名称。
routers :为客户端设定默认网关。:
broadcast-address :为客户端设定广播地址。
ntp-server :为客户端设定网络时间服务器 IP 地址。
time-offset :为客户端设定和格林威治时间的偏移时间,单位是秒。
注意:如果客户端使用的是视窗操作系统,不要选择 "host-name" 选项,即不要为其指定主机名称
五、防火墙
DHCP 服务器需要开放入 UDP67 端口,出 UDP68 端口。客户端正好相反,或者最直接的是关闭防火墙。
六、配置举例
公司员工的笔记本可以获取的 IP 地址范围是 192.168.0.100 到 192.168.0.200, 子网掩码是 255.255.255.0, 网关是 192.168.0.1,DNS 为 114.114.114.114, 客户端的 /etc/resolv.conf 里面设置的 search 参数为 pipci.com,默认的 IP 地址租约时间 1 小时,最大租赁时间为 2 小时,为硬件 MAC 地址 0:0:c0:5d:bd:95 保留 IP 地址为 192.168.0.188 ,主机名为 pipci
1、在 dhcpd.conf 文件中添加下面的内容。
------------------------------------------------------------
[root@CentOS7 dhcp]# vi dhcpd.conf
ddns-update-style none;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.200;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option domain-name "pipci.com";
option domain-name-servers 114.114.114.114;
default-lease-time 3600;
max-lease-time 7200;
host pipci {
hardware ethernet 00:0c:29:27:c6:12;
fixed-address 192.168.0.188;
}
}
------------------------------------------------------------
其中这个文件中有提示配置模板文件的位置 /usr/share/doc/dhcp*/dhcpd.conf.example
3、重启 DHCP 服务
------------------------------------------------------------
[root@CentOS7 dhcp]# systemctl restart dhcpd.service
------------------------------------------------------------
4、查看 DHCP 服务
------------------------------------------------------------
[root@CentOS7 dhcp]# systemctl status dhcpd.service
------------------------------------------------------------
七、如果出现问题的可能有以下几种可能:
1. 配置文件有问题。
1.1 内容不符合语法结构,例如,少个分号;
1.2 声明的子网和子网掩码不符合;
2. 主机 IP 地址和声明的子网不在同一网段。
3. 主机没有配置 IP 地址。
Debian9.5 系统 DHCP 服务器 ISC DHCP 软件配置说明
DHCP 全称 Dynamic Host configuration protocol, 动态主机配置协议。是一个局域网的网络协议,使用 UDP 协议工作,它可以为客户机自动分配 IP 地址、子网掩码以及缺省网关、DNS 服务器的 IP 地址等 TCP/IP 参数, 简单来说, 就是在 DHCP 服务器上有一个数据库, 存放着 IP 地址、网关、DNS 等参数。 当客户端请求使用时, 服务器则负责将相应的参数分配个客户端,避免客户端手动指定 IP 地址等。特别是在一些大规模的网络中。客户端数目较多,使用 DHCP 可以方便对这些机器进行管理,为客户机提供 TCP/IP 参数配置,如 IP 地址、网关地址和 DNS 服务器等,不仅效率高,而且不存在 IP 地址冲突的情况现在的无线路由器默认都带有 DHCP 功能,也就是说一个无线路由器同时也是一个 DHCP 服务器。
一、DHCP 有三种机制分配 IP 地址
1. 自动分配方式:DHCP 服务器为主机指定一个永久性的 IP 地址,一旦 DHCP 客户端第一次成功从 DHCP 服务器租用到 IP 地址,就可以永久使用该地址。
2. 动态分配方式:DHCP 服务器给主机指定一个有时间限制的 IP 地址, 时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3. 手工分配方式:客户端的 IP 地址是由网络管理员指定的,DHCP 服务器只是将指定的 IP 地址告诉客户端主机。
三种地址分配方式中, 只有动态分配方式可以重复使用客户端不再需要的地址,下面是 DHCP 涉及的常见术语:
作用域:一个完整的 IP 地址段,DHCP 协议根据作用域来管理网络的分布、分配 IP 地址及其他配置参数。
超级作用域:用于管理处于同一个物理网络中的多个逻辑子网段。超级作用域中包含了可以统一管理的作用域列表。
排除范围:把作用域中的某些 IP 地址排除,确保这些 IP 地址不会分配给 DHCP 客户端。
地址池:在定义了 DHCP 的作用域并应用了排除范围后,剩余的用来动态分配给 DHCP 客户端的 IP 地址范围。
租约:DHCP 客户端能够使用动态分配的 IP 地址的时间。
预约:保证网络中的特定设备总是获取到相同的 IP 地址。
二、DHCP 协议的工作过程
1. 发现阶段:即 DHCP 客户机寻找 DHCP 服务器的阶段。DHCP 客户机以广播的方式发送 DHCP discover 发现信息来寻找 DHCP 服务器(因为 DHCP 服务器的 IP 地址对客户机来说是未知的),由于客户机不知道 DHCP 服务器的 IP 地址,所以它使用 0.0.0.0 的地址作为源地址,使用 UDP68 端口作为源端口,使用 255.255.255.255 作为目标地址,使用 UDP67 端口作为目的端口来广播请求 IP 地址信息。广播信息中包含了 DHCP 客户机的 MAC 地址和计算机名,以便使 DHCP 服务器能确定是哪个客户机发送的请求。网络上每一台安装了 TCP/IP 协议的主机都会接收到这种广播信息,但只有 DHCP 服务器才会作出响应。
2. 提供阶段:即 DHCP 服务器提供 IP 地址的阶段。在网络中收到 DHCP discover 发现信息的 DHCP 服务器都会作出响应,它从尚未出租的 IP 地址中挑选一个分配给 DHCP 客户机,向 DHCP 客户机发送一个包含出租的 IP 地址和其他设置信息,因为 DHCP 客户机还没有 IP 地址,所以 DHCP 服务器使用自己的 IP 地址作为源地址,使用 UDP67 端口作为源端口,使用 255.255.255.255 作为目标地址,使用 UDP68 端口作为目的端口来广播,通过 DHCP offer 消息发送给客户端。
3. 选择阶段:DHCP 客户机选择某台 DHCP 服务器提供的 IP 地址的阶段。 如果有多台 DHCP 服务器向 DHCP 客户机发来的 DHCP offer,客户机只接收第一个收到的 DHCP offer,然后它以广播的方式回答一个 DHCP request 请求信息。该信息中包含它所选定的 DHCP 服务器请求 IP 地址的内容。之所以要以广播的方式回答,是为了通知所有的 DHCP 服务器,它将选择某台 DHCP 服务器所提供的 IP 地址。
4. 确认阶段:即 DHCP 服务器确认所提供的 IP 地址的阶段。当 DHCP 服务器收到 DHCP 客户机回答的 DHCP resquest 请求后,它便向 DHCP 客户机发送一个包含它提供的 IP 地址和其他设置的 DHCP ACK 确认信息,告诉 DHCP 客户机可以使用它所提供的 IP 地址。然后 DHCP 客户机便将其 TCP/IP 协议与网卡绑定,除了 DHCP 客户机所选择的服务器 IP 外,其他的 DHCP 服务器都将收回曾提供的 IP 地址
5. 重新登陆:以后 DHCP 客户机每次登陆网络时,就不需要再发送 DHCP discover 发现信息了。而是直接发送包含前一次所分配 IP 地址的 DHCP resquest 请求。当 DHCP 服务器收到这一信息后,它会尝试让客户机继续使用原来的 IP 并回答一个 DHCP ACK 确认信息,如果此 IP 地址无法分配个原来的 DHCP 客户机时(比如 IP 分配给其他 DHCP 客户机使用) ,则 DHCP 服务器给 DHCP 客户机回答一个 DHCP NACK 否认消息,当原来的 DHCP 客户机收到此消息后,它就必须重新发送 DHCP discover 发现信息重新请求新的 IP 地址。
6. 更新租约:DHCP 服务器向 DHCP 客户机出租的 IP 地址一般都由一个租借期限,期满后 DHCP 服务器会收回出租的 IP 地址。如果 DHCP 客户机要延长其 IP 租约,则必须更新其租约。DHCP 客户机启动时和 IP 租约期限过一半时,DHCP 客户机都会自动向 DHCP 服务器发送其更新租约的信息。
三、安装 DHCP 服务软件,Linux 用的 DHCP 软件是 Internet 系统协会的 DHCP 服务软件 ISC DHCP
--------------------------------------------------------
root@debian:~# apt install isc-dhcp-server
--------------------------------------------------------
四、配置 DHCP 服务软件
DHCP 的主要配置文件有两个,分别位于 /etc/default/isc-dhcp-server 和 /etc/dhcp/dhcpd.conf。下面要做的就是对这两个文件进行配置。
五、查看本机网络信息,主要查看网络接口。
--------------------------------------------------------
root@debian:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:40:99:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe40:9919/64 scope link
valid_lft forever preferred_lft forever
--------------------------------------------------------
六、配置 /etc/default/isc-dhcp-server 文件
--------------------------------------------------------
root@debian:~# vi /etc/default/isc-dhcp-server
....... #上面的内容省略
On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="enp0s3" #将监听端口 INTERFACESv4 修改为上面的网络接口 enp0s3
#INTERFACESv6="" #屏蔽监听 ipv6
--------------------------------------------------------
七、配置 /etc/dhcp/dhcpd.conf 文件参数说明
DHCP 服务器的配置比较简单,所有的配置集中在 /etc/dhcp/dhcpd.conf 配置文件中,所有的配置语句可以分为 3 类:一类是参数,用于表明如何执行任务,是否要执行任务。第二类是声明语句,用来描述网络布局、客户、提供 ip 地址的策略等。还有一类是发送给客户的选项,实际上是加了 option 关键字的参数。其中每行开头的‘#’表示注释,而每一行配置最后都要以 “;” 作为结尾,这很重要。
1.DHCP 配置文件中的 parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户
ddns-update-style :
该参数用来指定 DHCP 服务器对 DNS 服务器进行更新时采用的更新类型。有 3 个类型分别是 ad-hoc、interim、none。ad-hoc 方式基本上已经不再采用,interim 表示 DNS 互动更新模式,none 表示不支持动态更新,一般设置为 none。
default-lease-time :
该参数的作用是定义默认的 IP 地址租约时间,其单位为秒。
max-lease-time :
该参数用来指定最大租赁时间长度,单位是秒。上面的是默认租约时间,这个是如果客户要求了租约时间,租约时间如果超过这个值,就以这个值为准,不以客户要求的为准。
server-name :
通知 DHCP 客户服务器名称。
hardware :
指定客户端的硬件接口类型和硬件地址。其格式如下:
hardware ethernet 0:0:c0:5d:bd:95;
fixed-address
指定为客户端分配一个或者多个固定 IP 地址,该参数只能出现在 host 声明语句中。如果指定了多个 IP 地址,那么当客户端启动时,它会被分配到相应子网中的那个 IP 地址上。
2.DHCP 配置文件中的 declarations (声明语句):用来描述网络布局、提供客户的 IP 地址等
subnet 语句
该语句用来定义一个作用域。其格式如下:
subnet 网络 子网掩码 {
[参数]
[选项]
}
range 语句
该语句定义了起始 IP 和终止 IP 提供动态分配 IP 的范围,如果只指定起始 IP 地址而没有终止 IP 地址,则范围只包含一个 IP 地址,在一个 subnet 语句中,可以有多个 range 语句,但是这些 range 语句所覆盖的 IP 地址范围不能交叉或者重复。其格式如下:
range 起始 IP 终止 IP;
host 语句
该语句用来定义用户保留地址,其格式如下:
host 主机名 {
[hardware]
[fixed-address]
}
这里的主机名可以自己定义,[hardware] 参数用来指定需要保留 IP 地址的客户端的 MAC 地址,[fixed-address] 用来指定分配的固定 IP 地址。
3. DHCP 配置文件中的 option(选项):用来配置 DHCP 可选参数,全部用 option 关键字作为开始
subnet-mask :为客户端设定子网掩码。
domain-name :如果客户端的 /etc/resolv.conf 里面设置了 search 参数,这个域名就是对应 search 参数后面的设置。
domain-name-servers : 为客户端指明 DNS 服务器 IP 地址。
host-name :为客户端指定主机名称。
routers :为客户端设定默认网关。:
broadcast-address :为客户端设定广播地址。
ntp-server :为客户端设定网络时间服务器 IP 地址。
time-offset :为客户端设定和格林威治时间的偏移时间,单位是秒。
注意:如果客户端使用的是视窗操作系统,不要选择 "host-name" 选项,即不要为其指定主机名称
八、防火墙
DHCP 服务器需要开放入 UDP67 端口,出 UDP68 端口。客户端正好相反,或者最直接的是关闭防火墙。
九、配置举例
公司员工的笔记本可以获取的 IP 地址范围是 192.168.0.100 到 192.168.0.200, 子网掩码是 255.255.255.0, 网关是 192.168.0.1,DNS 为 114.114.114.114, 客户端的 /etc/resolv.conf 里面设置的 search 参数为 pipci.com,默认的 IP 地址租约时间 1 小时,最大租赁时间为 2 小时,为硬件 MAC 地址 0:0:c0:5d:bd:95 保留 IP 地址为 192.168.0.188 ,主机名为 pipci
1、先备份原有的 dhcpd.conf 文件,因为里面是范例内容很多不方便看。
------------------------------------------------------------
root@debian:/etc/dhcp# mv -v dhcpd.conf dhcpd.conf.backup
------------------------------------------------------------
2、重新创建 dhcpd.conf 文件并添加下面的内容。
------------------------------------------------------------
root@debian:/etc/dhcp# vi dhcpd.conf
ddns-update-style none;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.200;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option domain-name "pipci.com";
option domain-name-servers 114.114.114.114;
default-lease-time 3600;
max-lease-time 7200;
host pipci {
hardware ethernet 00:0c:29:27:c6:12;
fixed-address 192.168.0.188;
}
}
------------------------------------------------------------
3、重启 DHCP 服务
------------------------------------------------------------
root@debian:/etc/dhcp# systemctl restart isc-dhcp-server.service
------------------------------------------------------------
4、查看 DHCP 服务
------------------------------------------------------------
root@debian:/etc/dhcp# systemctl status isc-dhcp-server.service
------------------------------------------------------------
十、如果出现问题的可能有以下几种可能:
1. 配置文件有问题。
1.1 内容不符合语法结构,例如,少个分号;
1.2 声明的子网和子网掩码不符合;
2. 主机 IP 地址和声明的子网不在同一网段。
3. 主机没有配置 IP 地址。
今天关于IOS 开发中,如何获取 DHCP 服务器地址!和dhcp服务器获取ip的介绍到此结束,谢谢您的阅读,有关Android NDK 开发中 SO 包大小压缩方法详解、Android 开发中 Activity 的正确打开方式、CentOS-1810 系统 DHCP 服务器 ISC DHCP 软件配置说明、Debian9.5 系统 DHCP 服务器 ISC DHCP 软件配置说明等更多相关知识的信息可以在本站进行查询。
本文标签: