信息在网络中的漫游(四)

本文分析一下DHCP和NAT

首先分析一下NAT,即网络地址转换。家中的路由器利用了这种技术,本来一个家庭只是从ISP那里申请到了一个IP,但是为什么能够同时供好几个终端同时上网,IP在家用路由器这里发生了什么?这只是NAT的应用场景之一,还有比如很多公司存在所谓的内部网络,处于内部网络的终端可以访问外部网络,但是外部网络却不能访问这些终端,这里使用的也是NAT技术。

从上面的描述中可以看出NAT至少有两个好处:一是缓解了IP资源不足的问题,或者说多路复用了IP;二是安全,至少保证了内网的安全,因为外网无法访问内网(但是内网却可以访问外网,有点信息不对称的赶脚)。而这两个好处大概就是促使NAT出现的原因。

现在考虑一个机构的情形:机构的网络一般分为两部分,一部分是对外的,称为外网;另一部分就是内网了。外网的终端一般都是一些网页服务器之类的,它们是对外宣传的窗口,所以必然要能被别的网络访问,因而要有独立的、合法的IP地址;内网的终端存放的都是机构的机密信息,不希望被外界访问,所以只需要私有IP(参见这里)就够了,然后提供几个或一个合法IP(以下称为公共IP)供它们访问外部网络。

划分外网和内网的关键是路由器,这样的机构显然需要搭建自己的路由器。假设该机构从上级ISP那里申请到一段IP,那么首先要给那些服务器分配合法的IP;然后要给内部网络留至少一个公共IP,考虑到上网机器很多,多留几个IP分担流量也是必要的。这样一来,其实可以把总的网络分为两个子网,一个作为外网,另一个做内网,相应的,IP也被分为两部分。子网的核心是交换机,于是只要在内网的那台交换机中集成NAT功能就可以了。

下面进入正题,NAT的原理是什么?跟路由器差不多,核心也是类似的NAT转换表,负责私有IP和公共IP的转换。比如内部一台终端的IP是192.1.23.78,当这台终端发送一个数据包到NAT(集成在路由器或交换机中)的时候,NAT将把这个包的源地址IP修改成某个公共IP,然后才发送到外部网络;同样的道理,当外部的数据包按照某个公共IP发送到NAT的时候,NAT要把该数据包的目的IP修改成对应的私有IP,那么问题来了,公共IP就那么几个还好说,但是内部的私有IP却是成千上百个,NAT如何知道这个进来的数据包应该发往哪个私有IP呢?

答案是这样的:内部终端向外发的数据包经过NAT的时候,这个包称为请求包(或者形象的说,是询问包),NAT会同时记录下这个包的目的IP和源IP,然后把源IP修改成公共IP;当一个包从外部进来的时候,这个包就是应答包,它必然对应一个请求包,而且是从对应请求包的目的IP代表的终端发来的,NAT检查这个应答包的源地址,这个地址必然是刚才某个请求包的目的地址,这样就能找到这个请求包的修改前的源地址,也就是私有IP地址。如下图:



那么家用的路由器原理也就很清楚了。


然后是DHCP,即动态主机配置协议。想象以下,有朋友来你家,想通过你家的路由器上网,那你是不是要亲自配置以下路由器中的转发表为你朋友的电脑配置一个IP呢?而且每天都有不同的朋友来,那你每天都要配置一次是不是就要抓狂?而这还不是最要命的,假如你是一家公司的网管,而公司每天都有成千上百个这样的“朋友”造访的话。。。是的,你这时就需要DHCP!!DHCP协议可以使子网内的终端自动获得IP,它非常适合这样的网络:在网络中,终端频繁的加入或离开。

要实现DHCP,需要一台特定的DHCP服务器,该服务器维护一个动态更新的可用IP地址表(或地址池),每当有新主机加入时,DHCP服务器从当前可用地址池中分配一个任意的地址给它;而当一台主机离开时,其地址便被回收。

这是大概的原理,需要注意的是,以上情况假设每个子网拥有一台DHCP服务器,它维护的地址池也就是该子网从路由器或上一级交换机那里得到的IP集合。但是显然,每个子网配置一台DHCP服务器太浪费了,实际情况是,一个组织或机构只需要一台或几台就够了,没有配置DHCP服务器的子网可以通过DHCP中继代理(该代理知道所有DHCP服务器的IP,所以它通常由路由器充当)使用位于其他子网的DHCP服务器。(这里留个问题,划分子网有什么好处?什么情况下需要划分子网?子网的物理边界是什么?)

下面是DHCP服务的详细过程:

1、新到达的主机首先要发现一个能与其交互的DHCP服务器,这可以通过DHCP发现报文来完成,这个报文是运输层报文,使用UDP向端口67发送;然后这个报文要被封装成IP数据报,即在原基础上添加源地址IP和目的IP,那么问题来了,该主机还不知道自己的IP更不知道要把IP数据报发给谁。。。

所以,这里要插播一段广告:前面的文章里说过,IP地址分为两部分,前一部分代表网络号(或子网号),后一部分代表子网内的主机号。但是,当网络号确定之后,主机号的集合里面有两个特殊的号码不能分配给子网内的任意一台主机,这两个号码分别是主机号全为0或全为1的那两个号码。全为0代表“本子网”,这个已经说过了;全为1则代表子网内的所有主机,也就是“广播”。所以,如果想要向某个子网的所有主机发送信息,可以使用“子网号 + 主机号全为1”这种形式。

然而这里的问题在于,新到达主机连自己所在的子网号也不知道,于是使用了特殊地址“255.255.255.255”,即所有位都是1的IP,包括网络号与主机号。大家一起约定,这个IP地址仅限于在发送主机所在的子网内传播而不会经过路由器向外传播,即路由器不会向其他路由器转发目的IP为255.255.255.255的IP数据报。同样的道理,如果把本子网IP的网络号部分全部改为0,即0.0.0.0,那么这个IP意味着“本主机”。严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。MAC地址有类似的机制。

综上,封装DHCP发现报文的IP数据报其源地址和目的地至分别是:0.0.0.0和255.255.255.255。这样一来,这个数据报虽然不会穿过路由器(即网关路由器),但是在链路层再次被封装后,会传播到网关路由器下的所有子网,而不仅仅限于原子网,这也正好符合DHCP路由器的分布情况。

2、位于各个子网的DHCP服务器会收到这个报文,然后用DHCP提供报文做出回应,IP数据报的目的地址仍然是255.255.255.255,即广播该报文。因为新到主机仍然没有IP,要确保该主机能收到提供报文,只好采用广播形式。提供报文包含的信息有:发现报文的事物ID、推荐的IP地址、网络掩码、IP地址租用期等。

3、由于做出回应DHCP服务器有不止一台,所以主机必须从中选择一个,然后用一个DHCP请求报文对选中的DHCP服务器进行响应,回显配置参数。

到此为止,新到来的主机得到了它的IP地址。


家用路由器就是这样工作的,终于弄懂了。


然后试着回答一下上面提出的问题,我觉得子网的物理边界应该是交换机,是交换机的存在保证了各个子网之间的“互不侵犯”,然后子网内的信息可以只在链路层交流,而不必通过网络层,即不必通过路由器。换言之,子网内路线上流动的信息总是MAC帧,而不会是IP数据报。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值