三十天学不会TCP,UDP/IP网络编程 - UDP的实践--DHCP

在经历了一顿忙碌加出去玩了玩以后,我又开始从新更新了~这是最新的一篇~完整版能够去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到,在gitbook的后台流量上看到了有不少盆友都看了我目前写的这么多文字,说实话,真心是有点感动,也有不少的成就感。正是这种感动支撑着我在玩回来和“快过年了,有事节后再说”的双重懒惰压力下,我以为我仍是在有空的时候更新下文字。git

若是对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,虽说如今这种“看不见”的东西真正能在实用中遇到的机会很少,可是我始终以为不管计算机的语言,热点方向怎么变化,做为一个程序员,不少基本的知识都应该有所了解。而当时在网上搜索资料的时候,这方面的资料真的是少的可怜,因此,我有幸前两年接触了这方面的知识,我以为我应该把我知道的记录下来,虽然写的不必定很好,可是但愿能给须要帮助的人多个参考。个人计划是用半年时间来写完这一系列文章,这个标题也是我对太多速成文章的一种态度,好了,废话再也不多扯了,下面是其中的一节内容,更多内容能够去gitbook上找到。程序员

每一个上网的人都知道,每一个终端都有一个IP地址,而前面说过IANA只负责分配大节点的IP地址,不可能小到每个终端系统都由这么一个机构来分配具体的IP地址。因此当IANA分配完大的IP地址段以后,每一个IP地址段的地址由各个子网本身负责分配,而如何保证分配的地址不重复并且可以被回收关系到IP地址的有效使用的问题,由于毕竟一个子网的IP地址是有限的。而这件事情就是由DHCP来负责的,而DHCP协议就是一个工做在UDP上面的普遍运用的协议。编程

DHCP概述

DHCP学名“Dynamic Host Configuration Protocol”,翻译过来就是动态主机配置协议,它还有个初代产品,叫作bootp, 这也是为何在wireshark里面是搜不到DHCP而必须使用bootp来过滤获得DHCP数据包的缘由。DHCP能够在局域网中很好的起到分配IP地址而且提供管理功能,这样使得每一个机器在有DHCP服务器的状况下都能方便而又快捷的得到IP地址。DHCP在server端和client端分别使用不一样的端口号进行通讯,在server端是用的67而在client端是68。windows

DHCP的报文中大部分信息都是和IP地址相关的,是时候再一次献上个人手绘版:服务器

 

 

其中前4个字节主要是一些信息相关的,好比:cookie

字节1:消息操做码,顾名思义,用来标识这是咋样的一个DHCP数据包网络

字节2和字节3:硬件类型和硬件地址长度tcp

字节4:跳数,这个能够忽略它spa

字节5-8:消息的标识,用来标识一组消息。计算机网络

字节9-10: 从获取到IP地址或者续租过程到如今所消耗的时间,至于什么叫租期和续约会在后面详细说明

字节11-12:标记

字节13-16:客户IP地址

字节17-20:申请IP地址回复中客户机的IP地址,这句话有点拗口,因此叫"Your IP Address“,你的IP地址,虽说俗了点,可是不会乱

字节21-24:在DHCP中使用的下一台服务器的地址,这个要联系具体的过程看,一会儿就能明白是什么意思

字节25-32:用于导入接替代理的IP地址,在这一节文章中能够忽略

字节33-48:客户机硬件地址,也就是“你的硬件地址”

字节49-112:任意服务器主机名称,以null做为终止符

字节113-240:在DHCP协议中使用的引导文件名称

剩下的变长部分是一些DHCP协议中可能使用的选项。

这一系列罗列枯燥无味,不须要花任何功夫去记忆或者试图强行理解他们,除非你须要他们来装b,由于结合下一节,你会发现其实这些能够很天然的被记忆。

“DORA”

当你看完这节介绍以后,即便你没有记住DHCP的大部分细节,你只要记住这个“DORA”过程就已经了解全部DHCP的过程,在具体介绍"DORA"以前,为了风格的一致性,先来概要的介绍下DHCP协议。

“DORA”这个缩写是Discover,Offer,Request和Acknowledge的统称,反映的是DHCP协议交互的四个步骤,在通过这四个步骤之后,一个客户端就得到了地址,通讯的草图请看个人灵魂画稿:

 

下面来具体介绍下这个四个步骤,大体过程是这样的:

Dicovery -- 探索阶段,能够理解为客户机取服务器探索有没有能够用IP地址。在这一个阶段,因为客户机并不知道服务器在哪里,因此他会在网络上发送一个广播,而在DHCP报文中的客户端MAC地址中填入本身的MAC地址。并且能够在选项中加入本身的最后一个申请的IP地址,固然前提是你有IP地址,这样若是该地址仍然处于IP地址池的可用状态,若是是受权的服务器,服务器会直接接受,而若是是非受权的服务器,服务器会直接拒绝这个请求,而后让客户机从新申请新的IP。

Offer -- 服务器在收到探索阶段的数据包以后,搜索本身管理的IP地址池而且在验证在当前分配策略下仍然有可用的IP地址以后,它会选择一个IP地址而且将其填入Your IP address字段。在大多数状况下,服务器会把一些其余重要信息填入选项字段,好比子网掩码,DHCP服务器地址,这个地址在多少时间内能够不须要再一次探索是否可用,也就是租期等等。因此你能够在客户机上看到,当用户拿到IP地址后,也会拿到子网掩码等等这些信息。

Requst-- 客户端在收到服务器提供的IP地址以后,理论上应该就结束,最多再发一个确认消息就能够了,那么为何会有这个request消息呢,这个消息的产生是由于通常一个局域网中不会只有一个DHCP服务器,客户再次以广播消息的方式发送DHCP数据包,这一次客户机会把给本身提供IP地址的服务器地址放在option里面而且加上本身的IP地址,这样作的目的是让其余DHCP服务器收回本身可能已经提供出去的客户机的IP地址,从新放入地址池,由于此时客户机已经拥有了本身的IP地址。

Acknowledge--服务器的最后确认,这个时候整个过程就所有结束了。

在继续看一看这里面更有意思的一些的细节以前,我以为应该使用一个现实的抓包例子省得文章陷入于说明的无聊之中,在windows上若是你想抓一个完整的DHCP整个过程的数据包,出来要打开wireshark而且输入bootp(不是dhcp)做为过滤器以外,你只须要采用ipconfig -release 命令再加上ipconfig -renew命令。若是你只用ipconfig -renew命令,绝大数状况下你只能看到request和ack消息,后面会说明一下这是为何。

 

从这个抓包截图至少能够看出这么几个信息,在discover和request阶段,客户机这边全是广播的消息,而客户机被分配的IP地址是192.168.11.44,接着就是一组请求使用一个transaction ID,也就是DHCP数据包中xid字段。至此,客户机就拥有了本身的IP地址。而通常在获得这个IP地址以后,客户机会向网络广播一个ARP消息其中的IP地址就写本身刚刚得到IP地址,若是你还记得前面的内容,那么就会记得这样作的目的是看看网络上会不会产生网络冲突,再一次确认在当前局域网中没有相同的IP地址被使用,从而能够放心的使用这个IP地址。

 

在上面的过程当中,Discover和Request的操做码都是1,而剩下的两个都是2,那么服务器到底怎样分辨是discover仍是request呢?答案是DHCP报文里面的option字段,具体的说是option 53,在这里会标识出究竟是Dicover仍是Request,是Offer仍是Acknowledge。

另一个有意思的事情是DHCP报文包里会有一个magic cookie,是一个固定值,为0x63825363,十进制就是99 130 83 99,是否是特别像一个IP地址?为何会有东西,缘由是由于前面说的Bootp和DHCP在报文格式上彻底相同,若是没有这么一个东西,彻底没法分辨究竟是什么报文,至于为何是这个值,我也不知道,只能说规定如此。

租约

试想一下这样的问题,当某一个客户机获取了IP地址以后,而后这个机器就从这个网络上移除了,DHCP服务器如何知道这个IP地址如今不须要被用从而从新放入可分配的IP地址池中呢?对于如今最多见的就是手机,一会儿连在这个WIFI上,一会儿连在那WIFI上,甚至不少时候某一个WIFI只会连一次之后不再会去那个地方也就不再会连上某个WIFI。当我写下这个例子的时候,深深感到技术时代发展之快,要知道前几年,这个例子的主题仍是笔记本电脑。某一个客户机在离开一个局域网时不会自动发一个release消息给DHCP服务器的,由于这很难作到,离开意味着你已经不和这个网络相链接了,如何可以发消息给DHCP服务器?

为了解决这个问题,在DHCP的机制里,租期和租约是一个很重要的概念,客户机获取到的IP地址并不真正属于他,而是向DHCP服务器租的,这个时间通常是48个小时。在48个小时以后,被分配出去的IP地址又会从新返回IP池做为可分配的IP,而若是在这48个小时以内,客户机再一次请求续租这个IP地址,那么服务器端就会从新设置计数器,直到下一个48小时到期。

具体怎么作到这一点呢?若是你还记得前面Request或者Discover阶段中,一个用户能够把本身的IP地址写在Option字段,若是服务器是受权能够分配该IP地址的,那么就会直接获得IP地址,这就是“续租”。因此若是在前面不用ipconfig -release 而后使用ipconfig -renew的话,单独的ipconfig -renew只会产生两个消息,由于这只是一个续租的过程。

其实对于DHCP租期这个事情能够有一个很直观的认识,前提是你天天来公司会有看看本身IP地址的需求,你会发现,有时候你的IP地址好几天都不变,而当周末回来周一从新连上网络的时候,每每IP地址变了,这就是前面说的租期和租约的原理。

相关文章
相关标签/搜索