Python网络编程5-实现DHCP Client

Python014

Python网络编程5-实现DHCP Client,第1张

  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交互报文。

以下是代码:

all_tuple = []

sum_stu = int(input('请输入一共有多少个学生:'))

while(sum_stu>0):

a = input('请输入学生名字:')

class1 = float(input('第一门课的成绩:'))

class2 = float(input('第二门课的成绩:'))

class3 = float(input('第三门课的成绩:'))

score = class1 + class2 + class3

mid = score/3

one_tuple = (a,class1,class2,class3,mid,score)

all_tuple.append(one_tuple)

sum_stu -= 1

sorted_list = sorted(all_tuple,key=lambda x:x[5],reverse=True)

sum_stu = 1

for i in sorted_list:

print('第',sum_stu,'名',i[0],':',end='')

print('平均分:',i[4],',总分:',i[5])

sum_stu += 1