
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地址能查到具体地址吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)