老U知道家里的电脑要上网,必须先在路由器上填写用户名和密码,然后拨号才能成功。拨号上网的原理是怎么的呢?
老U家的网络结构是图2-1这样的。
图2-1 ADSL接入结构图
从运营商接过来一根电话线,通过一个分离器(有些分离器直接集成在 ADSL MODEM上),分别接着电话机和 ADSL MODEM的 LINK口(RJ11),ADSL MODEM的 LAN口(RJ45)连接 SOHO路由器的 WAN口,路由器的多个 LAN口分别连接需要上网的各个设备。
分离器作用在于分离两组不同的信号,一组是电话,一组是上网。这两种信号频率不同。电话用的是3.4kHz以下频率,ADSL用的是4k~1.5MHz的高频段。装了分离器,不仅减少了上网时电话通话可能产生的噪声,同时也避免了打电话时上网掉线的风险,使两者工作互不影响。
ADSL MODEM起到模拟信号和数字信号转换的作用,负责把数字信号调制成模拟信号从电话线发出去,把接收到的模拟信号解调成数字信号传给网络设备。ADSL技术提供的上行和下行带宽不对称,因此称为非对称数字用户线路。
ADSL采用频分复用技术把电话、上行数据和下行数据三个相对独立的信道一起运行在电话线上,互不干扰。用户可以边打电话边上网,不用担心上网速率和通话质量的下降。理论上,ADSL 可在5 000米的范围内,在一对铜缆双绞线上提供最高1 Mbps的上行速率和最高8Mbps的下行速率(也就是我们通常说的带宽),能同时提供话音和数据业务。一般来说,ADSL 速率取决于线路的距离,线路越长,速率越低。
ADSL2+技术可以提供最高24Mbps的下行速率,和第一代ADSL 技术相比,ADSL2+在速率、距离、稳定性、功率控制、维护管理等方面进行了改进。
家用SOHO路由器是连接局域网和广域网的设备。它的WAN口连接ADSL MODEM,通常通过PPPoE(PPP over Ethernet)协议从运营商获取IP地址;它的LAN口连接局域网内需要上网的设备,自己担任DHCP(Dynamic Host Configuration Protocol)服务器,通过DHCP协议给这些设备分配私网IP地址,同时自己兼任局域网上网设备的网关。
说明
21世纪前10年,ADSL接入是最为常见的宽带上网方式。与此同时,小区宽带接入、PON接入、光纤到户等也有不少应用。相关的技术在后续章节都会覆盖。
PPPoE是在以太网上建立点对点协议(Point to Point Protocol,PPP)的连接,由于以太网技术使用广泛,而PPP协议在传统的拨号上网应用中显示出良好的可扩展性和优质的管理控制机制(如计费),二者结合而成的PPPoE协议得到了宽带接入运营商的认可并广为采用。PPPoE不仅有以太网的快速简便的特点,同时还有PPP的强大功能,任何能被PPP封装的协议都可以通过PPPoE传输。报文的封装结构如图2-2所示。
图2-2 PPPoE封装图
PPPoE协议采用Client/Server方式,它将PPP报文封装在以太网帧之内,在以太网上提供点对点的连接。PPPoE有两个主要的阶段:Discovery阶段和PPP Session阶段。其中Discovery阶段有点类似于交友的初始阶段,某高帅富在网上发了个交友贴,很多妹子回应约他,他却挑选了一个很有意思却没附照片的妹子,双方约定某个咖啡馆碰头聊一聊。PPP Session阶段则像是双方决定在咖啡馆一对一见面沟通,然后约定怎么去这个咖啡馆,碰头后怎么确定身份(对个“天王盖地虎,宝塔镇河妖”的暗号吧),一顿开心的午餐之后,互相留下了联系方式。
协议运行原理:Discovery阶段主要用于选择接入服务器,确定所要建立的PPP会话标识符Session ID,同时获得对方点到点的连接信息。
一个典型的Discovery阶段包括以下4个步骤:
PADI(PPPoE Active Discovery Initiation)
PADI 是PPPoE发现阶段的第一步。SOHO路由器以广播的方式发送PADI数据包,请求建立链路。
PADO(PPPoE Active Discovery Offer)
PADO是PPPoE发现阶段的第二步。访问集中器AC(Access Concentrator)以单播的方式发送一个PADO数据包对SOHO路由器的请求做出应答。
PADR(PPPoE Active Discovery Request)
PADR 是PPPoE发现阶段的第三步。因为PADI数据包是广播的,所以SOHO路由器可能收到不止一个的PADO报文。SOHO路由器根据一定的策略选择一个AC,然后向选中的AC单播一个PADR数据包。
PADS(PPPoE Active Discovery Session-confirmation)
PADS是PPPoE发现阶段的最后一步。当AC在收到PADR报文时,就准备开始一个PPP的会话了。它为PPPoE会话创建一个唯一的会话ID并单播一个PADS数据包给SOHO路由器做出响应。
完成四步交互后,SOHO路由器和访问集中器(AC)双方就能获知对方唯一的MAC地址和唯一的会话ID。MAC地址和会话ID 共同定义了唯一的PPPoE会话。
SOHO路由器收到PADS后,双方进入PPP会话阶段。在会话阶段,Session ID必须是Discovery阶段所分配的值。PPP会话阶段主要包括LCP、认证、NCP三个协商过程。LCP阶段主要完成建立、配置和检测数据链路连接。认证协议类型由LCP协商决定采用询问握手认证协议(CHAP)还是密码认证协议(PAP),认证的过程就会用到我们在运营商申请宽带时获得的账号和密码。NCP是一个协议族,用于配置不同的网络层协议,常用的是IP控制协议IPCP(IP Control Protocol),它负责配置SOHO路由器WAN口的IP地址和DNS地址等工作。当SOHO路由器认证完毕并通过NCP获取了IP地址等信息后,我们在路由器的WEB页面上就能够看到WAN口获取的IP地址。一般情况下,这个时候LAN网络中的设备就可以上网了。
任何一方希望结束会话,它们可以通过发送PADT(PPPoE Active Discovery Terminate)报文以中止PPP会话。
PPPoE很容易检查到用户下线,可通过一个PPP会话的建立和释放对用户进行基于时长或流量的统计,计费方式灵活方便。PPPoE可以提供动态IP地址分配方式,用户无须任何配置,网管维护简单。
根据前面ARP解析的知识,我们知道一台电脑必须具备IP地址、掩码、网关地址等信息,为了上Internet,还需要配置后面提到的DNS(Domain Name System)服务器地址等信息。若依靠管理员手工维护,工作量很大,也容易出错。DHCP协议的出现彻底实现了上网设备的自动配置。
DHCP的前身是BOOTP,BOOTP原本用于实现无盘主机连接网络。无盘主机使用BOOTROM(无盘启动ROM接口)而不是硬盘实现系统启动并连接上网,BOOTP则可以自动地为那些无盘主机设定TCP/IP环境(包括IP地址、掩码、网关、DNS服务器等)。但BOOTP有一个缺点:你在设定前须事先获得客户端的MAC地址,而且与IP地址的对应是静态的。换而言之,BOOTP非常缺乏“动态性”,若在有限的IP资源环境中,BOOTP一对一的对应会造成非常大的IP地址浪费。
DHCP可以说是BOOTP的增强版本,它分为两个部分:一个是服务端,而另一个是客户端。所有的IP网络配置资料都由DHCP服务端集中管理,并负责处理客户端的DHCP请求;而客户端则会采用服务端分配的IP网络配置信息。相比BOOTP,DHCP通过“租约”的概念,有效且动态地分配客户端的IP地址。
DHCP的基本原理有点类似于租房子。妹子发帖求租,宣称生活简单爱干净;看到帖子的房东们纷纷回应提供房源;妹子顶帖确定其中一家;其他房东看到后就不再为她预留房源了。房东与妹子签订了一年的租房合同,同时约定住满半年的时候要跟房东续租,如果半年后妹子没联系到房东,妹子会再住4个半月后再联系一次房东,如果还是联系不上,妹子就会认为租这个房子有风险,可能房东随时会不租了,于是租期满后她就会重新找房子住。
DHCP的实际工作过程如下:首先,网络中必须至少有一台DHCP服务器存在,它会监听来自客户端的DHCP请求,并与客户端协商TCP/IP的设定环境。它提供两种IP分配方式:自动分配,一旦DHCP客户端第一次成功地从DHCP服务端申请到IP地址之后,就永远使用这个地址;动态分配,当DHCP第一次从DHCP服务端申请到IP之后,并非永久地使用,只要租约到期,客户端就得释放这个IP,以给其他工作站使用——客户端可以比其他主机更优先地延续(Renew)租约,或是申请其他的IP。动态分配显然比自动分配更加灵活,尤其是当你的实际IP地址数量不足的时候。例如:你是一家运营商,只能提供200个IP给客户,但并不意味着你的客户最多只能有200个。因为你的客户不可能全部在同一时间上网,于是你就可以将这200个IP轮流地租用给上线的客户使用。
DHCP客户端首次启动要经历下面四个阶段:
(1)发现阶段,用于客户端寻找Server。当DHCP客户端首次启动的时候,发现本机上没有任何IP地址,它会向网络发出一个DHCP DISCOVER的广播报文。
(2)提供阶段,服务端向客户端提供IP。当DHCP服务端监听到客户端发出的DHCP DISCOVER广播后,它会从那些还没有租出的IP中,选择最前面的的空置IP,连同其他TCP/IP设置,回应客户端一个DHCP OFFER报文。由于客户端在开始的时候还没有IP地址,所以在其DHCP DISCOVER消息内会带上其MAC地址信息。DHCP服务端回应的DHCP OFFER则会根据这些信息传递给要求租约的客户端。根据服务端的设定,DHCP OFFER会包含一个租约期限的信息。
(3)选择阶段,客户端选择Server接受IP租约。如果客户端收到网络上多台DHCP服务端的回应,只会挑选其中一个DHCP OFFER(通常是最先抵达的那个),并且会向网络发送一个DHCP REQUEST广播消息,告诉所有DHCP服务端它将指定接受哪一台服务端提供的IP地址。
(4)确认阶段,被选择的DHCP Server收到Client返回的DHCP REQUEST报文后,根据Client ID和Request IP Address来查找有没有相应的租约记录,如果有则发送DHCP ACK报文作为回应,否则返回DHCP NAK报文作为拒绝。
当 Client端收到 Server返回的 DHCP ACK报文后,会发送目的地址为 Server分配给自己的地址的免费 ARP 作最后的确认,如果没有检测到冲突,则将此地址与自己绑定,同时配置相应参数。如果检测到冲突,就向 DHCP Server广播发送 DHCP DECLINE报文、通知 DHCP Server禁用这个 IP地址,然后 DHCP Client开始新的地址申请过程。
DHCP消息交互的流程如图2-3所示。
图2-3 DHCP消息交互图
与Client首次登陆网络进行地址申请相比,再次登陆网络时,DHCP Server和DHCP Client间的交互会简略很多。DHCP Client再次登录网络时,只需要广播包含上次分配的IP地址的DHCP REQUEST报文,不需要再次发送DHCP DISCOVER报文。DHCP Server会优先让Client使用它以前曾用过的地址,尽量保持Client地址的稳定。
客户端获取到IP地址后还有一个租期机制与续约的过程,IP的租约期限是非常考究的,并非如我们租房子那样简单。在租约期限一半的时候就会发出单播DHCP REQUEST消息给分配IP地址的那个DHCP服务器。如果此时得不到DHCP服务端的确认的话,Client还可以继续使用该IP,然后在租约期限的7/8时刻再次发送广播的DHCP REQUEST消息给所有DHCP服务器。如果还得不到确认的话,DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。
从前面的描述中,我们不难发现:DHCP DISCOVER是以广播方式进行的,其情形只能在同一网段之内进行,因为路由器是不会转发广播消息的——否则容易造成攻击。那么,如果DHCP服务端在其他网段怎么办呢?要解决这个问题,我们可以用DHCP中继(通常由路由器担任)来中继客户的DHCP请求,然后将客户端发出去的广播请求报文转换为单播传递给DHCP服务端,并且将服务端的回复传给客户。若不使用DHCP中继,也可以在每一个网段内安装一个DHCP服务端,如此一来设备成本会增加,而且管理也比较分散。
老U的驿站组网比较简单,SOHO路由器下面就一个网段,也就不涉及DHCP中继的需求。
PC通过DHCP获取到IP地址后,PC就可以打开浏览器上网了。老U打开了中国工商银行的网站(http://www.icbc.com.cn),OK,很顺利地实现了上网。但是老U 立刻又有了疑问:没有输入工商银行的IP地址,浏览器怎么知道网站在哪里呢?
如果我们每访问一个网站都需要知道和填写IP地址,那上网的乐趣可大打折扣了。于是网络工程师设计了一个叫DNS的网络协议,用户只需要记住相对直观且有意义的域名,PC就能自动通过DNS找到该域名所对应的IP地址。
DNS(Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,提供将主机名和域名转换为IP地址的服务。
通常 Internet 主机域名的一般结构为:主机名。三级域名。二级域名。顶级域名,例如www.icbc.com.cn。一个完整的域名由2个或2个以上的部分组成,各部分之间用英文的句号“。”来分隔。最后一个“。”的右边部分称为顶级域名(TLD,也称为一级域名),最后一个“。”的左边部分称为二级域名(SLD),二级域名的左边部分称为三级域名,以此类推,每一级的域名控制它下一级域名的分配。
顶级域有两种划分方法:地理域和通用域。地理域是为世界上每个国家或地区设置的,由ISO-3166定义,如中国是cn,美国是us,日本是jp。通用域是指按照机构类别设置的顶级域,主要包括com(商业组织)、edu(教育机构)等。随着互联网的不断发展,新的通用顶级域名也根据实际需要不断扩充,新增的通用顶级域名有biz(商业)和info(信息行业)等。
域名右侧通常省略了一个句点“。”,这个点号表示根域。全球共有13台根域名逻辑服务器,实际物理根服务器数量远大于这个数字,在2014年1月25日的数据为386台,分布于全球各大洲。根域名服务器中虽然没有每个域名的具体信息,但储存了负责每个顶级域(如com、net、org等)解析的域名服务器的地址信息。
域名层次如图2-4所示。比如www.icbc.com.cn,cn表示中国,com.cn表示中国的公司,icbc.com.cn表示中国工商银行,www.icbc.com.cn表示中国工商银行提供的Web服务主机。
图2-4 域名层次图
当 DNS 客户机需要查询应用程序中使用的域名时,如果hosts文件中没有查到,它会先查询本地DNS 服务器(网卡TCP/IP中配置的DNS服务器,一般通过DHCP从DHCP Server获取)来解析该域名。具体如图2-5所示。
图2-5 DNS解析过程示意图
(1)在浏览器中输入www.icbc.com.cn域名,操作系统会先检查自己本地的hosts文件是否有这个域名映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
(2)如果hosts文件里没有这个域名的映射,则查找本机DNS解析器缓存,如果有这个域名的映射关系,则直接返回,完成域名解析。
(3)如果本机的hosts文件和DNS解析器缓存中都没找到相应的域名映射关系,则DNS客户机首先找TCP/IP参数中设置的首选DNS服务器,我们称它为本地DNS服务器。本地DNS服务器收到查询后,如果发现域名包含在本地配置的区域资源中,则直接返回解析结果给客户机,完成域名解析。
(4)如果要查询的域名不在本地DNS服务器的区域资源中,但该服务器已缓存了此网址的映射关系,则调用这个映射完成域名解析。
(5)如果本地DNS服务器的本地区域资源与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询。
如果未启用转发模式,本地DNS服务器就把请求发至13台根DNS服务器,根DNS服务器收到请求后返回这个域名(.cn)的顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,会向这台服务器进行解析。这台负责.cn域的服务器如果自己无法解析,它会返回下一级负责二级域(com.cn)的DNS服务器地址。本地DNS服务器收到这个地址后,继续找该服务器解析www.icbc.com.cn。不断重复上面的动作,直至找到www.icbc.com.cn主机对应的IP。
如果用的是转发模式,本地DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析。上一级服务器如果不能解析,则找根DNS或把请求转至上上级,以此循环。解析的结果也是层层依次回复,最后把结果返回给本地DNS服务器,由此本地DNS服务器再返回给客户机。
老U学到这里,发现DNS真的很重要,万一有人伪造了DHCP服务器发送了虚假的DNS服务器IP地址,把正常的银行域名关联到了钓鱼网站的IP上,那实在是太危险了——这甚至吓得老U有点强迫症,每次上银行网站前都要检查自己的DNS。
前面我们讲的DNS都是一个域名对应一个IP地址,但是在一些特殊的场景下,如果仅使用一台服务器提供服务,访问压力太大,服务器性能不足,需要多台服务器进行负载分担时,一个域名就需要对应多个IP地址。这个时侯DNS是如何工作的呢?RR-DNS(Round-Robin DNS),这种轮询调度的方法经常会被用到。在客户端进行域名查询时,DNS服务器根据域名查找数据库,域名与IP地址是一对多的关系,如图2-6所示。
图2-6 RR-DNS示意图
最初域名指向表中的第一个地址。当第一个客户端查询域名时,DNS服务器会将第一个IP地址返回给客户端,并将域名指向第二个IP地址。当第二个客户端查询域名时,DNS服务器会将第二个IP地址返回给客户端,同时将域名指向第三个IP地址。当最后一个地址被返回后,域名将重新指向第一个地址。
不过实现中,DNS服务器会返回该域名下对应的所有的IP地址,但通过更改IP地址的排序实现轮询的目的。客户端会优先采用排序在最前面的IP地址进行访问。这样可以达到同样的负载分担效果,还能减轻DNS服务器的压力。
下面以yahoo.com为例,使用同一个客户端对该域名进行第一次解析,DNS服务器返回了三个IP地址,顺序如图2-7所示。
图2-7 第一次解析DNS服务器返回的三个IP地址顺序
在客户端上执行ipconfig/flushDNS将本地缓存的域名解析表项删除,再进行第二次解析,DNS服务器又返回三个IP地址,顺序如图2-8所示。
图2-8 第二次解析DNS服务器返回的三个IP地址顺序
在客户端上执行ipconfig/flushDNS将本地缓存的域名解析表项删除,再进行第三次解析,DNS服务器还是返回三个IP地址,顺序如图2-9所示。
图2-9 第三次解析DNS服务器返回的三个IP地址顺序
通过比较,我们可以看到,虽然每次都返回了三个IP地址,但是三次解析到的IP地址顺序是不一样的。客户端默认会以第一个IP地址作为目标地址。这样不同的用户端、不同的时间,解析到的IP地址会在三个IP地址中进行轮询,就可以让客户端访问不同的服务器,达到负载分担的作用。
然而,RR-DNS并不能很好地解决其中一些问题,譬如,当服务器集群分别处于不同的运营商时,我们希望电信的客户端访问电信的服务器,而网通的客户端访问网通的服务器,因为跨运营商的访问会带来额外的延时。但轮询方式并不关心这种需求,只是让服务器轮流地提供服务。
智能DNS服务器可以根据来自客户端的报文,自动判断用户所处在哪一个运营商里,智能地将对应地址返回给用户,从而避免跨运营商访问的情形发生。智能DNS组网参见图2-10。
图2-10 智能DNS组网示意图
譬如一个企业在三个运营商(电信、联通、移动)都有服务器,同样有三个来自不同运营商网络的访问客户端进行域名解析。通过电信运营商接入的客户端向企业服务器发起DNS请求解析时,智能DNS会自动根据客户端IP地址,判断出它是来自电信运营商,于是将电信服务器的IP返回给客户端。
智能DNS还能够自动判断用户的上网线路所属地域,例如是浙江电信还是福建电信,然后智能返回对应的浙江电信或福建电信的服务器的IP地址。
智能DNS还可以进行宕机处理。智能DNS能够实时地检测出宕机服务器IP,并将该地址从解析IP地址中剔除。这样客户端DNS解析到的IP保证是一个运行正常的服务器,从而提供一个高度可靠、永不宕机的服务。
家园网友互动
Q:lwz122422787 发表于 2015-8-11 21:49
DHCP对于接入的设备可以自动进行网络配置,如果随便接入一台岂不是可以得到我的网络的很多信息?????
A:网语者 发表于 2015-8-13 11:10
这位网友其实不用太担心,可以通过一些安全特性来解决,具体的方法可以学习一下DHCP Snooping相关的内容,我个人觉得还是很有意思的。
上网的原理大致弄清楚了,老U在脑海中理了几遍,却总觉得哪里不对劲——哦,家里的出口路由器才一个公网IP,而内网却有那么多设备在同时上网,路由器怎么知道回来的报文究竟给哪台设备呢?