dhcp编程
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息。
option字段
DHCP报文中的Options字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP服务器端配置了Options字段,DHCP客户端在申请IP地址的时候,会通过服务器端回应的DHCP报文获得Options字段中的配置信息。
获取IP地址过程
实验使用的linux 主机由两个网络接口,其中ens33使用DHCP获取IP地址,ens37使用静态IP地址;因此需要使用ens33来发送数据包。
Change_MAC.py用于MAC地址与Bytes类型相互转换。
DHCP_Discover.py用于发送DHCP Discover报文;其中GET_MAC.py见ARP章节。
DHCP_Request.py用于发送DHCP Request报文。
DHCP_FULL.py用于完成DHCP Client与DHCP Server的报文交互
Wireshark对远程linux主机抓包,结果如下
客户端以广播发送DHCP Discover包,其中报文操作类型为1(请求报文),DHCP客户端的MAC地址设置为00:0c:29:03:a1:08,option53设置报文类型为Discover,option55(请求选项列表)中包含请求的参数。
服务器以单播向客户端回复信息,其中报文操作类型为2(应答报文),分配给客户端的IP为192.168.160.146,option 53设置报文类型为offer,Option 54设置服务器标识为192.168.160.254,其他option为客户端请求列表的应答。
值得注意的是,交互的四个报文中Transaction ID均为0x00000000,表明是同一次DHCP交互报文。
2. 我的电脑已启用dhcp,但网络诊断却显示 以太网未启用dhcp.所以连不上网,怎么办
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址;给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
解决方法如下:
1、按win+r,输入Services.msc;
3. 如何自动获取ip地址
在大多数情况下,无法直接从本机自动获取IP地址,因为IP地址是由计算机网络中的路由器或DHCP服务器分配的。然而,你可以使用编程语言或命令行工具来获取你的IP地址。
1. 使用命令行工具获取IP地址:
- 在Windows上,打开命令提示符(按下Win + R键,然后键入cmd并按回车键),输入"ipconfig"命令,查找"IPv4地址"(通常是以"192.168."开头的地址)。
- 在Mac上,打开终端(通过应用程序->实用工具->终端),然后输入"ifconfig"命令,查找"inet"关键字旁边的IP地址。
- 在Linux上,打开终端,然后输入"ifconfig"命令或者"ip addr"命令,查找"inet"关键字旁边的IP地址。
2. 使用编程语言获取IP地址:
- Python: 使用socket库中的gethostname()和gethostbyname()函数来获取主机名和IP地址。示例代码如下:
```python
import socket
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print("Hostname:", hostname)
print("IP Address:", ip_address)
```
- java: 使用java.net包中的InetAddress类来获取本机IP地址。示例代码如下:
```java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIPAddress {
public static void main(String[] args) {
try {
InetAddress ip = InetAddress.getLocalHost();
System.out.println("IP Address: " + ip.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
```
- C#: 使用System.Net命名空间中的Dns类来获取IP地址。示例代码如下:
```csharp
using System;
using System.Net;
class GetIPAddress {
static void Main(string[] args) {
string hostName = Dns.GetHostName();
string ipAddress = Dns.GetHostEntry(hostName).AddressList[0].ToString();
Console.WriteLine("Hostname: " + hostName);
Console.WriteLine("IP Address: " + ipAddress);
}
}
```
无论使用哪种方法,你都可以获得本机的IP地址。注意,如果你的计算机连接到局域网或使用了代理服务器,获取的IP地址可能是局域网地址或代理服务器的地址,而不是公共IP地址。