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地址。