请问DHCP如何分配IP地址

jerome_zou 2009-01-06 11:43:19
各位好,我公司要开发DHCP服务器,但是我一直不明白怎么分配IP地址。向大家请教一下。
首先客户端发送一个DHCP DISCOVER消息,服务器收到以后,应该怎么找到正确的IP地址给他呢?例如正确的应该是192.168.0.*,子网掩码是 255.255.255.0,请问应该根据什么可以知道子网掩码是255.255.255.0呢?如果知道子网掩码是255.255.255.0,那我怎么知道应该是192.168.0.*,而不是192.168.1.*或者其他的网段呢?
网上的资料只说从地址池里选一个,那地址池是不是应该按照子网的不同而有不同的地址池呢?我怎么知道应该从哪个地址池找IP地址呢?
请知道的能帮我分析一下,谢谢大家。
...全文
1141 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
云上飞翔 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 jerome_zou 的帖子:]
各位好,我公司要开发DHCP服务器,但是我一直不明白怎么分配IP地址。向大家请教一下。
首先客户端发送一个DHCP DISCOVER消息,服务器收到以后,应该怎么找到正确的IP地址给他呢?例如正确的应该是192.168.0.*,子网掩码是 255.255.255.0,请问应该根据什么可以知道子网掩码是255.255.255.0呢?如果知道子网掩码是255.255.255.0,那我怎么知道应该是192.168.0.*,而不是192.168.1.*或者其他的网段呢?
网上的资料只说从地址池里…
[/Quote]
答:兄弟,DHCP服务器是你公司开发的啊,当然由你来配置你们的DHCP服务器,共有几个IP地址池,范围是多少,租期是多少,有无固定IP地址分配(如:总经理的机器每一次上来时固定分配指定的IP)等等,这些全在你的掌控之下啊。这些都是你们的开发的DHCP服务器的基本的配置参数啊。否则你的程序怎么写啊。
ChDw 2009-01-06
  • 打赏
  • 举报
回复
所有配置信息都可以DHCP服务器中返回的,所以本机是不需要特别处理


DHCP服务器本身是已经设置好了掩码、网关及有效IP段的信息,服务器就根据客户端的MAC地址从有效IP段中找一个空闲的并返回给客户端,让客户端机器确认
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
哦,不好意思,上面那个英文的意思我明白了,因为是重用IP地址,所以才这样的。谢谢,如果可以的话,请加我一下QQ和MSN,开发这个我心里没底啊。
我QQ:5765996,MSN:jerome_zou@hotmail.com
云上飞翔 2009-01-06
  • 打赏
  • 举报
回复
答:中继工作过程详情见:RFC 1542(BOOTP relay ) 和RFC 3046(DHCP中继代理)
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiangnaisong 的回复:]
答:在有DHCP中继的情况下,DHCP服务器正是依据giaddr来检查其可用的几个地址池中,是否有与giaddr地址匹配的地址池,并从中选择分配的.如果giaddr字段有192.168.1.2的IP地址,则DHCP服务器将对192.168.1.1和192.168.1.254之间的地址进行检查。如果存在匹配,DHCP服务器则从匹配的地址池中选择可用地址,并直接将DHCPOFFER通过UDP发送给giaddr(网关- 中继代理).giaddr(网关- 中继代理)会将该DHCPOFFER)以广播方式转发给那个网段的DHCP客户端.
[/Quote]
谢谢,我明白一大半了,你的意思是说这个中继必须在DHCP服务器中已经配置好了子网掩码、IP地址之类的参数,所以如果giaddr有内容,只要去地址池里去找匹配的就可以了,对吗?如果遇见漏掉没有配置的,服务器就直接返回DHCPNAK消息,是这样吧?
另外DHCP文档(RFC2131,3.2 Client-server interaction - reusing a previously allocated network address )中有这句话If 'giaddr' is 0x0 in the DHCPREQUEST message, the client is on the same subnet as the server. The server MUST broadcast the DHCPNAK message to the 0xffffffff broadcast address because the client may not have a correct network address or subnet mask, and the client may not be answering ARP requests.
这个我有些不明白了,不是说giaddr没有的话,就说明没有中继,就应该和本地服务器的IP网段一样的,不是吗?为什么必须返回DHCPNAK呢?

云上飞翔 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jerome_zou 的回复:]
我理解的是,如果有中继(文档里说的relay agent?)的话,请求里的giaddr字段应该有这个中继的IP地址,可是我能够根据这个IP地址确认是哪个网段吗?我不太明白,能否说一下?
[/Quote]
答:在有DHCP中继的情况下,DHCP服务器正是依据giaddr来检查其可用的几个地址池中,是否有与giaddr地址匹配的地址池,并从中选择分配的.如果giaddr字段有192.168.1.2的IP地址,则DHCP服务器将对192.168.1.1和192.168.1.254之间的地址进行检查。如果存在匹配,DHCP服务器则从匹配的地址池中选择可用地址,并直接将DHCPOFFER通过UDP发送给giaddr(网关- 中继代理).giaddr(网关- 中继代理)会将该DHCPOFFER)以广播方式转发给那个网段的DHCP客户端.

jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
我理解的是,如果有中继(文档里说的relay agent?)的话,请求里的giaddr字段应该有这个中继的IP地址,可是我能够根据这个IP地址确认是哪个网段吗?我不太明白,能否说一下?
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiangnaisong 的回复:]
引用 3 楼 jerome_zou 的回复:
引用 2 楼 jiangnaisong 的回复:
现在我的问题是我知道怎么配IP地址池,以及范围、租期啥的。但是客户端发起DHCPDISCOVER请求之后,从请求里我怎么去判断应该从哪个IP地址池里面分配IP地址给他呢?

答:1)显然楼主对DHCP协议不清楚,才会问出这样不正确的问题.在没有中继的情况下,DHCPDISCOVER请求是以广播方式以UDP(服务器方PORT是67号)进行发送(此时自己的IP是:全0).由于没有中继,双方当然是在…
[/Quote]
你说的中继是不是指那个转发代理?客户说要用cisco cable modem termination system ( cmts )来作为转发代理,就是有中继吧。有中继的话应该怎么做呢?
jiangnaisong能否留个QQ或者MSN之类的联系方式,我想跟你好好问问。谢谢了,或者您告诉我哪个文档有写这个的?我看了rfc2131,rfc951,这两个看的多一些,rfc2132只看了一部分,准备当字典用的。
云上飞翔 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jerome_zou 的回复:]
引用 2 楼 jiangnaisong 的回复:
现在我的问题是我知道怎么配IP地址池,以及范围、租期啥的。但是客户端发起DHCPDISCOVER请求之后,从请求里我怎么去判断应该从哪个IP地址池里面分配IP地址给他呢?
[/Quote]
答:1)显然楼主对DHCP协议不清楚,才会问出这样不正确的问题.在没有中继的情况下,DHCPDISCOVER请求是以广播方式以UDP(服务器方PORT是67号)进行发送(此时自己的IP是:全0).由于没有中继,双方当然是在同 个IP网段中,从服务器的IP所有的网段中保留的IP范围段中进行动态分配的.
2)要写DHCP服务器程序还是比较简单的,这方面我还是比较熟悉的(因为以前用C写过),楼主现在用心去看一下DHCP协议,否则你是写不出来的.
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 scottxp 的回复:]
当时网络实验也没学好

dhcp是广播的,难道不是一个子网网关就是一个dhcp服务器么?
就拿路由器来说,不同的子网在不同的端口,配置参数也是针对某个端口的,怎能从一个端口为不同的子网分配ip?
[/Quote]
DHCP文档都是e文的,可能我看的有问题
DHCP文档中提到一个BOOTP转发代理,他可以把一个DHCP请求转发给DHCP服务器。
我的客户也提到“the cisco cable modem termination system ( cmts ) we use acts as a dhcp relay agent”
这个不是说可以在不同的子网下分配IP地址吗?
scottxp 2009-01-06
  • 打赏
  • 举报
回复
当时网络实验也没学好

dhcp是广播的,难道不是一个子网网关就是一个dhcp服务器么?
就拿路由器来说,不同的子网在不同的端口,配置参数也是针对某个端口的,怎能从一个端口为不同的子网分配ip?
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ChDw 的回复:]
所有配置信息都可以DHCP服务器中返回的,所以本机是不需要特别处理


DHCP服务器本身是已经设置好了掩码、网关及有效IP段的信息,服务器就根据客户端的MAC地址从有效IP段中找一个空闲的并返回给客户端,让客户端机器确认
[/Quote]
1楼的兄弟,我是做DHCP服务器,不是应用DHCP服务器软件,现在我就是不明白,应该可以配置很多个IP地址段,但是客户端发起请求以后,服务器怎么去判断从哪个地址段去找空闲的IP?这个是我程序的逻辑,我必须明白怎么判断才行。
客户端的MAC地址,服务器不可能都有的。即使有,也需要判断他是否到了另外一个网段里,然后才可以分配IP地址,不然网段错了,客户端就连不上网了。
jerome_zou 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangnaisong 的回复:]
答:兄弟,DHCP服务器是你公司开发的啊,当然由你来配置你们的DHCP服务器,共有几个IP地址池,范围是多少,租期是多少,有无固定IP地址分配(如:总经理的机器每一次上来时固定分配指定的IP)等等,这些全在你的掌控之下啊。这些都是你们的开发的DHCP服务器的基本的配置参数啊。否则你的程序怎么写啊。
[/Quote]
2楼的兄弟,我给老外做外包啊,他们打算开发自己的DHCP服务器,和他们的设备一起销售吧。具体我也不清楚。
我的理解是应该从客户端的DHCPDISCOVER请求中判断出客户端的网络,然后找到对应的IP地址池,然后找到一个未分配的IP地址给他。
现在我的问题是我知道怎么配IP地址池,以及范围、租期啥的。但是客户端发起DHCPDISCOVER请求之后,从请求里我怎么去判断应该从哪个IP地址池里面分配IP地址给他呢?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧