客户机向dhcp服务器请求获得IP地址的详细封包问题

客户机向dhcp服务器请求获得IP地址的详细封包问题,第1张

DHCP报文是封装在UDP报文中的。

UDP报文封装在IP报文里,IP报文封装在以太网报文里。

典型的DHCP过程是这样的:

1:客户机向服务器发送DHCP_DISCOVER报文,申请IP。

2:服务器向客户机返会DHCP_OFFER报文,指定一个将要分配的IP。

3:客户机向服务器发送DHCP_REQUEST报文,请求这个IP。

4:服务器PING几次(一般是3次)这个IP,如果没得到响应的话,就说明这个IP现在空闲,可以分配给客户机,所以向客户机发送DHCP_ACK报文,确认可以分配。如果得到相应,则发送DHCP_NAK报文,拒绝分配。

5:如果客户端收到DHCP_ACK,责发送一次免费ARP,判断这个IP是否已经被用。没有被用的话则绑定这个服务器分配来的IP,否则向服务器发送DHCP_DECLINE报文,拒绝这次分配。并重新执行第一步。

如果收到的是DHCP_NAK,则直接重新执行第一步。

大概过程是这样的,还有不明白的话再补充一下问题~

-----------------------------------------------------------

DHCP是应用层协议,UDP是传输层协议,IP是网络层协议,以太网是链路层协议。

数据在网络上传输的时候要自顶向下逐层封装的,关于这部份知识你可以参考一下TCP/IP分层模型。

客户机申请IP之前确实没有IP,DHCP_DISCOVER报文都是以广播形式发送的,IP头里的目的地址是255255255255,源地址是0000。

链路层目的地址是FF-FF-FF-FF-FF-FF,源地址是自己的mac地址。

这样服务器收到客户端发来的DISCOVER报文之后,会根据源mac地址向客户机发送单播的DHCP_OFFER报文。

requestgetRemoteAddr()如何获取用户真实的IP地址

要获得用户真实的IP地址需要借助请求报头中的x-forwarded-for变量。

requestgetHeader("x-forwarded-for");

完整实例如下

<%@ page contentType="text/html; charset=gb2312" %>

<%@ page import="javautil"%>

<%

String realIP = requestgetHeader("x-forwarded-for");

String ip = requestgetRemoteAddr();

Enumeration enum = requestgetHeaderNames();

while(enumhasMoreElements())

{

  String name = (String)enumnextElement();

  String value = requestgetHeader(name);

  outwrite(name + "=" + value + "<br$amp;>quot;$);

}

%>

你的IP地址是:<%=realIP%>

转载,仅供参考。

ip地址是根据每台电脑网络连接点而得到的一个“身份z”,查询ip地址可以让我们有效的知道该电脑在哪个位置。

根据IP地址查询具体地理位置的方法

百度地图有根据IP查询地址的API

>

如果是内网地址,可以使用NetworkInterface;如果想获取公网ip,可行方法之一是通过>

你可以试一下这个,比如你要想知道wqzbxhtop这个域名对应的IP 可以使用以下函数:

$hosts=gethostbynamel('wqzbxhtop');       //获取ip地址列表

print_r($hosts);

返回结是数组形式的返回结果:

以上就是关于客户机向dhcp服务器请求获得IP地址的详细封包问题全部的内容,包括:客户机向dhcp服务器请求获得IP地址的详细封包问题、request.getRemoteAddr怎么获取用户真实的IP地址、根据ip地址能查到具体地址吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9688317.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存