(计算机软件与理论专业论文)基于p2p的分布式存储的研究与实现.pdf_第1页
(计算机软件与理论专业论文)基于p2p的分布式存储的研究与实现.pdf_第2页
(计算机软件与理论专业论文)基于p2p的分布式存储的研究与实现.pdf_第3页
(计算机软件与理论专业论文)基于p2p的分布式存储的研究与实现.pdf_第4页
(计算机软件与理论专业论文)基于p2p的分布式存储的研究与实现.pdf_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 “基于p 2 p 的分布式存储系统”是四川省科技厅“青年软件创新工程”资助 项目。 本系统在p 2 p 的基础上采用了s e r v e r t o s e r v e r 的模型,各个s e r v e r 之间完 全对等,通过路由关系连接起来。客户从任何一个s e r v e r 上都可以查询并访问系 统中的所有文件,同时每一个s e r v e r 上的文件及其存储信息都被冗余备份到其他 s e r v e r 上,提供了较高的容错性。此外,本系统的文件存储信息采用x m l 方式 存放,有利于w e b 方式发布和查询信息。 在基础理论中,首先介绍了i o 模型,并对几种网络服务器内部架构进行了 分析和比较,最后介绍了x m l 语言的基本概念和相关语法。随后,我们讨论了 p 2 p 的各种资源查找算法,并详细描述了本系统使用的基于关键字的路由模型的 主要算法和设计。在对网络分布存储及其技术研究的基础上,我们设计了一个基 于p 2 p 模型的分布式存储系统。本系统采用分层结构,以路由层作为基础,在其 上实现了对象传输层和命令解释层。在命令解释层实现了一个基于线程池的任务 驱动的服务器框架模型,它监听u d p 端口,并维护个全局任务队列,所有收 到的命令都作为一个任务放到任务队列中由处理线程进行命令分发,调用对象传 输层处理;在对象传输层实现了资源查找算法,设计并实现了一套基于u d p 的 传输协议用于客户与服务器之间,以及服务器内部之间的命令交互,同时还设计 了以x m l 方式存放的文件存储指针格式;最后,实现了一个定时模块,使得各 种网络延时较大的任务可以通过定时队列得到异步响应,从而释放相应的处理线 程,并且对于延时太久的任务可以实现超时重发。 通过对本系统的初步测试,表明该系统实现了设计目标并具有较好的性能。 关键词: p 2 p 模型、资源查找、冗余 a b s t r a e t r e s e a r c h & i m p l e m e n t a t i o n o fd i s t r i b u t e ds t o r a g es y s t e mb a s e do np 2 pm o d e li s ap r o j e c ts u p p o a e db y “y o u t hs o r w a r ec r e a t i v ee n g i n e e r i n g f r o mt e c h n o l o g i c a l o m c eo fs i c h u a l l t h es y s t e mi sd e s i g n e da sas e r v e r - t o - s e r v e rm o d e lb a s e do np e e r - t o p e e r t e c h n o l o g y a l ls e r v e r sa r cp e e rt op e e r ,a n dl i n k e dw i t hr o u t e a n yc l i e n tc a nq u e r y a n da c c e s se v e r yf i l eo ft h es y s t e mf r o ma n yn o d e a n da n yf i l eo fe a c hn o d ei s b a c k u pt os o m e o t h e rs e r v e r sw i t hi t ss t o r a g ei n f o r m a t i o na u t o m a t i c a l l yt oi m p r o v e t h ef a u l t t o l e r a n ta b i l i t yo ft h ew h o l es y s t e m m o r e o v e r , f i l es t o r a g ei n f o r m a t i o ni s d e s c r i b e di nx m l l a n g u a g e ,w h i c hb e n e f i t st h ea c c e s sa n di s s u ep r o c e s so ft h ef i l e i n f o r m a t i o nt h r o u g hw e b i nt h i st h e s i s ,t h eg e n e r a ly om o d e l sa r ei n t r o d u c e df i r s t ,t h e ns o m et y p i c a l i n t e r n a la r c h i t e c t u r e sf o rn e t w o r ks e r v e r , a n db a s i cc o n c e p t ,s e m a n t i cr u l e so fx m l l a n g u a g ea r ed i s c u s s e ds e q u e n t i a l l y t h e n ,w ec o m p a r e da l lk i n d so fs e a r c ha l g o r i t h m f o rp 2 pr e s o l l r c e s ,a n dd e s c r i b e dt h ed e s i g np r i n c i p l eo fak e y w o r db a s e dr o u t i n g m o d e lt h a tr u n so no u rs y s t e mi nd e t a i l d e p e n d i n go no u rr e s e a r c ho nt h ed i s t r i b u t e d s t o r a g et e c h n o l o g y a sb e l o w , w ef i n a l l y d e s i g n e da n di m p l e m e n t e dap 2 pb a s e d d i s t r i b u t e ds t o r a g es y s t e m t h i sl a y e r e d s y s t e m i n c l u d e sa n u n d e r l y i n gr o u t e rl a y e r , a n u p p e ro b j e c t t r a n s f e rl a y e ra n dac o m m a n dd i s p a t c h l a y e rw h i c hi m p l e m e n t sa t h r e a d p o o l b a s e da n dt a s kd r i v e na r c h i t e c t u r e ,a n di sl i s t e n i n go na nu d p p o r t a g l o b a lt a s kq u e u ei sm a i n t a i n e di nt h ec o m m a n dd i s p a t c hl a y e ra n du s e dt od i s p a t c h a n dt r a n s f e re a c hc o m m a n dt ot h eo b j e c tt r a n s f e rl a y e r , i nt h eo b j e c tt r a n s f e rl a y e r , w e i m p l e m e n t e dar e s o u r c es e a r c ha l g o r i t h m ,a nu d pb a s e dt r a n s f e rp r o t o c o lf o rm e i n t e r a c t i o nb e t w e e nac l i e n ta n das e r v e ro rt w os e r v e r s a tl a s t ,at i m e rm o d u l ei s d e v e l o p e d ,i no r d e rt oi m p l e m e n taa s y n c h r o n o u sr e s p o n s ef o rt h o s eh i g hd e l a y e d t a s k st h r o u g has c h e d u l e dt a s kq u e u e ,a n dm a k e i tp o s s i b l ef o rt h o s et a s k st or e s e n d p a c k a g e u n d e r e x p i r a t i o ns i t u a t i o n f i n a l l y , w ep r o v e dt h a tt h ei n i t i a lg o a li sr e a c h e da n dag o o dp e r f o r m a n c ei s a c h i e v e db y t a k i n gt h es y s t e m i ns o m e f i m c t i o n a l i t yt e s t s k e y w o r d s : p 2 pm o d e l ,r e s o u r c el o c a t i o n ,t o l e r a n c e l i 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的 研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含 其他入已经发表或撰写过的研究成果,也不包含为获得电子科技大学或其它教 育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任 何贡献均已在论文中作了明确的说明并表示谢意。 签名:隘! 弛 日期:二卯呼年1 月。7 日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:煎:因导师签名:兰兰丝 日期:主p p 平年,z 月? 7 日 基于p 2 p 的分布式存储的研究与实现 1 1背景 第一章引言 当今社会是一个信息爆炸的社会,人们面对着与日俱增的各种信息,不仅要 处理它,更重要的是如何保存信息,为日常的工作和生活服务。于是,网络化存 储的概念被提出并得到了迅速发展。网络化存储是全新的存储方式,相对于r a i d 磁盘阵列、镜像盘之类的传统备份方法,它不仅提供了更加巨大的存储能力,而 且提供了基于网络的数据备份和恢复技术。 目前流行的网络存储系统主要有s a n ,n a s ,网格存储以及p 2 p 系统等。 s a n ( s t o r a g e a r e a n e t w o r k ,存储区域网) 是一种类似于普通局域网的高速 存储网络,它通过专用的集线器、交换机和网关建立起与服务器和磁盘阵列之间 的直接连接。s a n 不是一种产品而是配置网络化存储的一种方法。不过s a n 虽 然实现了网络存储,但其跨越的距离相当有限,无法满足广域网范围的数据恢复。 n a s 系统是直接挂在网上的专用文件服务器,具备快速、简单、可靠的性 能,支持u n i x 和w i n d o w sn t 多种网络环境。n a s ( n e t w o r k a t t a c h e d s t o r a g e , 网络附加存储) 系统实现了两个突破:理念上的突破把存储器直接接到网络 上,不再挂在服务器后端,避免了给服务器增加负担;技术上的突破通过专 用软件减少磁头臂机械移动的次数,克服由此造成的延时。但是到目前为止它还 只能局限于局域网的范围。 实现远程数据共享和恢复的技术主要有:i f c p 、f c i p 和i s c s i 等。这三种 都是i p 存储协议,通过它们可以构建基于以太网的s a n ,使得s a n 扩展到广 域网的范围。 网格( g r i d ) ,可以称作是第三代i n t e m e t ,它的主要特点是不仅仅包括计算 机和网页,而且包括各种信息资源,例如数据库、软件以及各种信息获取设备等, 它们都连接成一个整体,整个网络如同一台巨大无比的计算机,向每个用户提供 一体化的服务。目前网格还处于研究阶段,最著名的网格计算研究是美国的 g l o b u s 项目。 p 2 p 是p e e r - t o - p e e r 的缩写,p e e r 在英语里有”( 地位、能力等) 同等者”、r 同事”和”伙伴”等意义。这样一来,p 2 p 也就可以理解为”伙伴对伙伴”的意思,或 称为对等联网。早期的p 2 p 系统主要是一些文件共享和存储程序,如:n a p s t e r , g n u t e l l a 和m o j o n a t i o n 等。n a p s t e r 使用中心目录服务器去定位文件,而g n u t e l l a 是通过广播请求进行文件查询,m o j on a t i o n 则提供了分片存储和下载机制,但 基于p 2 p 的分布式存储的研究与实现 是这些系统在可靠性和扩展性方面都还做的远远不够。现在的p 2 p 系统都通过在 应用层建立一个逻辑网络( o v e r l a yn e t w o r k s ) ,从而可以实现基于关键字的路由 ( r d 3 r ) ,在此基础上可以进一步支持分布式哈希表( d h x ) 或分散式对象定位路 f q ( d o l r ) 。这些系统在可靠性和扩展性方面有了大大提高。其中有代表性的系 统包括:t a p e s t r y ,p a s t r y ,c a n 和c h o r d 。但是由于p 2 p 系统中各个节点主机 的不稳定性使得整个系统在可靠性方面有一定的局限性,针对这种情况人们又提 出了s e r v e rt os e r v e r 的模型。 鉴于s a n 和n a s 需要有专用硬件的支持,成本比较高,不适宜普及,而网 格涉及的范围太大,仍处于研究阶段,只有p 2 p 是目前最活跃,最适宜普及的网 络存储技术。但是纯粹的p 2 p 系统中,由于各个节点主机的不稳定性,使得整个 系统在可靠性方面有一定的局限性,因此采用s e r v e rt os e r v e r 的模型是一个比较 好的折衷方案。本实验室申请的四川省青年软件创新工程项目基于p 2 p 的分布 式存储平台就是一个s e r v e r t os e r v e r 的分布式存储系统,它可以充分结合当前 普遍应用的f i p 和w w w 服务,有利于普及推广,并且采用了基于物理拓扑结构 的逻辑网络路由,提供了强大的扩展能力和快速的路由定位能力。 1 2 论文组织结构 第一章是背景知识的介绍。 第二章介绍了一些基础知识和相关技术。 第三章介绍了资源查找和路由定位算法。 第四章给出了系统整体结构以及详细模块设计。 第五章描述了基于u d p 的命令协议设计和实现。 第六章是系统的功能性、容错性测试报告。 第七章是对我们系统的一个总结。 最后是参考资料和致谢。 基于p 2 p 的分布式存储的研究与实现 2 1 多线程 2 1 1 多线程概述 第二章基础理论和相关技术 线程( t h r e a d ) 技术早在6 0 年代就被提出,但真正应用多线程到操作系统 中去,是在8 0 年代中期,s o l a r i s 是这方面的佼佼者。传统的u n i x 也支持线程的 概念,但是在一个进程( p r o c e s s ) 中只允许有一个线程,这样多线程就意味着多 进程。现在,多线程技术已经被许多操作系统所支持,包括w i n d o w s n t ,当然, 也包括l i n u x 。 为什么有了进程的概念后,还要再引入线程呢? 使用多线程到底有哪些好 处? 什么的系统应该选用多线程? 我们首先必须回答这些问题。 使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方 式。我们知道,在l i n u x 系统下,启动一个新的进程必须分配给它独立的地址空 间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵” 的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的 地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程 所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要 的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的3 0 倍左右, 当然,在具体的系统上,这个数据可能会有较大的区别。 使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具 有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅 费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间, 所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然, 数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子 程序中声明为s t a t i c 的数据更有可能给多线程程序带来灾难性的打击,这些正是 编写多线程程序时最需要注意的地方。 除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发 的工作方式,当然有以下的优点: 1 ) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时 很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操 作,而使用多线程技术,将耗时长的操作( t i m ec o n s u m i n g ) 置于一个新的线程, 可以避免这种尴尬的情况。 基于p 2 p 的分布式存储的研究与实现 2 1 使多c p u 系统更加有效。操作系统会保证当线程数不大于c p u 数目时, 不同的线程运行于不同的c p u 上。 3 1 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几 个独立或半独立的运行部分,这样的程序会利于理解和修改。 2 1 2 线程池实现 多线程程序设计时,为了避免频繁的创建,删除线程,提高系统效率,一般 预先创建一个线程池处理连接请求。通常的做法是, _ 在使用t c p 连接时,用个线程叫“接受线程”,它等待新的连接并接受它 们。然后,接受线程将这个连接排队,并通知工作线程( 工作线程有多个) 有新完成的连接。于是。其中一个工作进程将一个连接从队列中摘下,接着 在此连接读取请求并处理,处理完后再接受下一个请求( 如这个连接是持续 连接的话) 或者再从队列中取下新的连接,当队列为空时睡眠。 _ 使用u d p 连接对,接受线程收到一个u d p 报文后,构造成一个任务,挂在 任务队列上,并通知工作线程( 工作线程有多个) 有新任务到来。于是,其 中一个工作进程将一个任务从队列中摘下,然后处理该任务,处理完后再从 队列中取下新的任务,当队列为空时就睡眠。 下面我们给出接受线程和线程池的框架程序: 接受线程: p t h r e a d _ m u t e x _ _ l o c k ( & t a s k m u t e x ) ; 锰入一个薪任务 p t h r e a dc o n d _ s i n g a l ( & t a s k _ c o n d ) ; 缈嗅醒线程遗中的线程 p t h r e a d _ m u t e x _ _ u n l o c k ( & t a s km u t e x ) ; 线程池中的线程t w h i l e 1 ) , p t h r e a d m u t e xl o c k ( & t a s k _ m u t e x ) ; w h i l e ( t a s k _ h e a d = = n u l l ) ,f 任务欧鼬是否薏空 , p t h r e a d _ c o n d _ w a i t ( & t a s k _ c o n d , & t a s k _ m u t e x ) ; 任务队勋为空睡眠在信号量上面 任务酞魂毒空扶任务双飘中摘下一个任务) 4 基于p 2 p 的分布式存储的研究与实现 p t h e a d _ m u t e x _ u n l o c k ( & t a j k _ m u t e x ) ; ( 处理任务然后继续查看任务孰现) , , 从上面的代码中可以看到,接受线程和线程池是生产者和消费者的关系,他 们之间采用了互斥锁和条件变量。 用互斥锁可以使线程顺序执行。互斥锁通常只允许一个线程执行一个关键部 分的代码,来同步线程。互斥锁也可以用来保护单线程代码。互斥锁函数: m u t e x n初始化一个互斥锁:ini,(3 m u t e x t ! o c k ( 3 t ) 给一个互斥锁加锁; m u t e x 订y l o c k ( 3 t ) 加锁,如失败不阻塞; m u t e xu n l o c k ( 3 t 1 解锁: m u t e xd e s t r o y ( 3 t ) 解除互斥状态: 如果两个进程有共享且可写的内存,且做了相应的初始化设置后( 参见 m m a p ( 2 ) ) ,互斥锁可以实现进程间的线程同步。互斥锁在使用前一定要初始化。 多线程等待一个互斥锁时,其获得互斥锁的顺序是不确定的。 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥 锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当 条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某 个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变 量阻塞的线程。这些线程将重新锁定互斥锁并重新溺试条件是否满足,般说来, 条件变量被用来进行线程间的同步。 函数p t h r e a d _ _ c o n dw a i t ( ) 往线程阻塞在一个条件变量上。线程解开m u t e x 指向的锁并被条件变量c o n d 阻塞。线程可以被函数p t h r e a d和函数_cond_signal p t k r e a de o n d _ b r o a d c a s t 唤醒,但是要注意的是,条件变量只是起阻塞私唤醒线程 的作用,具体的判断条件还需用户给出,例如一个变量是否为0 等等,这一点我 们从后面的例子中可以看到。线程被唤醒后,它将重叛检查判断条件是否满足。 如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过 程一般用w h i l e 语句实现。另一个用来阻塞线程的函数是p t h r e a dc o n dt i m e d w a i t ( ) ,它比函数p t h r e a dc o n d w a i t ( ) 多了个时间参数,经历a b s t i m e 段时间后, 即使条件变量不满足,阻塞也被解除。函数p t h r e a d _ c o n d _ _ s i g n a l ( ) 用来释放披 阻塞在条件变量c o n d 上的一个线程。多个线程阻塞在此条件变量上时,哪一个 线程被唤醒是由线程的调度策略所决定的。要注意的是必须用保护条件变量的 互斥锁来保护这个函数,否则条件满足信号又可能在测试条件和调用 基于p 2 p 的分布式存储的研究与实现 d t h r e a dc o n dw a i t 函数之间被发出,从而造成无限制的等待。 总的来说,预创建线程技术即线程池技术克服了请求到来时再创建线程的额 外开销,从而降低了服务器的时延,可以更快的处理请求。这样做还有一个好处 是,由于可以将任务分成凡个阶段( 如,接受请求、请求处理、响应等) 让几个 线程来做,这样消除了线程数和同时存在的连接数直接紧密的关联。 另一方面,多个线程间共享数据和合作的情形多了,这些共享的数据、工作 队列必须用互斥锁保护起来。这就增加了同步的开销,可以说是为了负载的扩展 性,牺牲了系统的扩展性。 总的来说,线程池模式的服务器在较高负载下工作也能达到较好的性能,通 常是比预创建进程服务器要高。但由于线程技术的使用对操作系统的依赖性是比 较强的,在某些系统中实施反而不一定能达到预期的性能( 如,一些系统没有内 核线程的实现) 。并且在多c p u 的环境下,性能要比单c p u 差,因为在多c p u 下的信号锁的开销很大。不过在l i n u x 2 6 内核下,多线程对多c p u 的支持有了 很大提高,移植到l i n u x 2 6 内核下将是下一步工作。 2 2u d p 程序设计 基于u d p 的网络程序使用数据报套接字定义了一种无连接的服务,数据通 过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。数据报套接 字一些基本特性如下: 一如果你发送了一个数据报,它可能不会到达。 _ 它可能会以不同的顺序到达。 如果它到达了,它包含的数据中可能存在错误。 数据报套接字也使用m ,但是它不使用t c p ,它使用使用者数据报协议u d p , 为什么说它们是“无连接”的呢? 因为它( u d p ) 不像流式套接字那样维护一个 打开的连接,你只需要把数据打成一个包,把远程的i p 姑上去,然后把这个包 发送出去。这个过程是不需要建立连接的。u d p 的应用例子有:世d ,b o o t p 等。 那么,数据包既然会丢失,怎样能保证程序能够正常工作昵? 事实上,每个使用 u d p 的程序都要有自己的对数据进行确认的协议。比如,n 可p 协议定义了对 于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程 序:“我已经拿到了! ”( 一个“a c k ”包) 。如果数据包发的送者在5 秒内没 有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了 a c k , 信号。 无连接服务器般都是面向事务处理的,一个请求一个应答就完成了客户程 序与服务程序之间的相互作用。若使用无连接的套接字编程,程序的流程可以用 茎王! ! ! 竺坌塑茎壹堡堕婴塑量窭里 一 图2 - 1 表示。 服务器 图2 - 1 无连接的s o c k e t 工作流程 2 3 关于x m l 的基础知识 2 3 1x v l l 产生的背景和用途 因为现在网络应用越来越广泛,仅仅靠h t m l 单一文件类型来处理于变万 化的文档和数据已经力不丛心,而且h t m l 本身语法十分不严密,严重影响网 络信息传送和共享。人们普遍选择了x m l 作为下一代w e b 运用的数据传输和交 互的工具。x m l 是e x t e n s i b l em a r k u pl a n g u a g e 的简写,是一种扩展性标识语言,是s g m l 的简化版,只不过省略了其中复杂和不常用的部分。s g m l 全称是”s t a n d a r d g e n e r a l i z e dm a r k u pl a l l g u a g e ”( 通用标识语言标准) 。看名称就知道:它是标志语 言的标准,也就是说所有标志语言都是依照s g m l 制定的,当然包括h t m l 。 s g m l 的覆盖面很广,凡是有一定格式的文件都属于s g m l ,比如报告,乐谱等 等,h t m l 是s g m l 在网络上最常见的文件格式。和s g m l 一样,x m l 也可 以应用在金融,科研等各个领域,我们所注重的只是x m l 在w e b 方面的运用而 已。x m l 使得在网络上使用s g m l 语言更加”简单和直接= 简化了定义文件类 型的过程,简化了编程和处理s g m l 文件的过程,简化了在w e b 上的传送和共 7 基于p 2 f 的分布式存储的研究与实现 享。 x m l 解决了企业业务数据的表示问题,它提供了交换数据的载体的描述和 定义。就像h t m l 定义了w e b 浏览器历看到的数据格式,一个格式适合的 h t m l 文档可以被支持h t m l 格式的任何一个浏览器打开,从而用户可以观看 h t m l 文档。同样,一个格式正确的x m l 文档其内容也应可以被支持x m l 的应用程序所读取,从而使数据被企业应用所接受。x m l 文档所描述的数据也 可以在企业业务流程中传递实际上是数据在不同的系统、不同的应用之间的处 理流转。如果没有一个标准的格式( 如x m l ) 定义,数据是无法被不同应用共 享的。除了易于建立和易于分析外,x m l 主要的优点还有它既是平台无关的, 又是厂商无关的。 2 3 2x m l 基本概念 232 ,l 标识 不论你是h t m l ,还是x m l ,标识的本质在于便于理解,如果没有标识,你 的文档在计算机看来只是一个很长的字符串,每个字看起来都一样,没有重点之 分。通过标识,你的文档才便于阅读和理解,你可以划分段落,列明标题。x m l 率,你更可以利用其扩展性来为文档建立更合适的标识。 在h t m l 里,有许多固定的标记,我们必须记住然后使用它们,你不能使 用h t m l 规范里没有的标记。而在x m l 中,你能建立任何你需要的标记。你可 以充分发挥你的想象力,给你的文档起一些好记的标记名称,比如。你的文档里 包含一些游戏的攻略,你可以建立一个名为 的标记,然后在g a l n e 下再 根据游戏类别建立 , 等标记。只要清晰,易于理解你可以建立任何 数量的标记。扩展性使你有更多的选择和强大的能力,但同时也产生个问题就 是你必须学会规划。你自己要理解自己的文档,知道它由哪几部分组成,褶互之 间的关系和如何识别它们。 关于建立标识还需要说明一点,标识是描述数据的类型或特性,比如宽 ,年龄 r 姓名 等,而不是数据的内容,比如: , ,( 张三) ,这些都是无用的标记。如果你学过数据库,你可以这样理解,标识就是 一种字段名。 2 3 2 ,2 结构化 “结构化“听起来太抽象了,我们这样理解,结构化就是为你的文档建立一 个框架,就象写文章先写一个提纲。结构化使你的文档看起来不会杂乱无章,每 一部分都紧密联系,形成一个整体。 结构化有两个原则: 茎王丝! 堕坌塑蔓查熊塑塑壅兰壅堡 1 每一部分( 每一个元素) 都和其他元素有关联,关联的级数就形成了结构。 2 标识本身的含义与它描述的信息相分离。 我们来看一个简单的例子帮助理解: 7 关于x m l 的基础知识 x m l 产生的背景和用途 x m l 基本概念 标识 结构化 这是本章的x m l 描述文档,可以看到标识分三级关联,非常清晰: 上面这样的文档结构,我们又称之为”文档树”,主千是父元素,如 ,分 支和页是子元素,如 和 。 2 3 2 3 显示 t 单独用x m l 不能显示页面,我们使用格式化技术,比如c s s 或者x s l ,才 能显示皿。标记创建的文档。 我们在前面讲到x m l 是将数据和格式分离的。x m l 文档本身不知道如何 来显示,必须有辅助文件来帮助实现。( x m l 取消了所有标识,包括f o n t ,c o l o r , p 等风格样式定义标识,因此x m l 全部是采用类似d h t m l 中c s s 的方法来定义 文档风格样式) x m l 中用来设定显示风格样式的文件类型有: 1 x s l x s l 全称是e x t e n s i b l es t y l e s h e e t l a n g u a g e ( 可扩展样式语言) 】是将来设计 x m l 文档显示样式的主要文件类型。它本身也是基于x m l 语言的。使用x s l , 你可以灵活的设置文档显示样式,文档将自动适应任何浏览器和p d a ( 掌上电 9 基于p 2 p 的分布式存储的研究与实现 _一一一 脑) 。x s l 也可以将x m l 转化为h t m l ,那样,老的浏览器也可以浏览x m l 文档了。 2 c s s c s s 大家很熟悉了,全称是c a s c a d i n gs t y l es h e e t s ( 层叠样式表) ,是目前用来 在浏览器上显示x m l 文档的主要方法。 3 b e h a v i o r s b e h a v i o r s 现在还没有成为标准。它是微软的i e 浏览器特有的功能,用它可 以对x m l 标识设定一些有趣动作。 2 - 3 2 4d o m d o m 全称是d o c u m e n to b j e c tm o d e l ( 文档对象模型) ,d o m 是用来干什么的 呢? 假设把你的文档看成一个单独的对象,d o m 就是如何用h t m l 或者x m l 对这个对象进行操作和控制的标准。 面向对象的思想方法已经非常流行了,在编程语言f 例如j a v a ,i s ) 中,都运用 面向对象的编程思想。在x m l 中,就是要将网页也作为一个对象来操作和控制, 我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,就要用到 a p i 。a p i 全称a p p l i c a t i o np r o g r a m m i n gi n t e r f a c e ,它是访问和操作对象的规则。 而d o m 就是一种详细描述h t m l x m l 文档对象规则的a p i 。它规定了 h t m l x m l 文档对象的命名协定,程序模型,沟通规则等。在x m l 文档中, 我们可以将每个标识元素看作一个对象它有自己的名称和属性。 x m l 创建了标识,西d o m 的作用就是告诉s c r i p t 如何在浏览器窗口中操作 和显示这些标识 2 - 3 3x m l 文档基本结构 x m l 文档包含三个部分: 1 一个x m l 文档声明; 2 一个关于文档类型的定义; 3 用x m l 标识创建的内容。 举例说明: ( ! d o c t y p ef i l e l i s ts y s t e m ”f i l e l i s t d t d 。 关于x m l 的基础知识 x m l 产生的背景和用途 1 0 茎王丝! 塑坌变塞堡堡盟堕墅量茎翌 c h a p t e r 其中第- - 行 就是一个x m l 文档的声明,第二行说明这个 文档是用f i l e l i s t d t d 来定义文档类型的,第三行以下就是内容主体部分。我们来 了解x m l 文档中有关的术语: 2 3 3 1 e l e m e n t ( 元素) : 元素在h t m l 我们已经有所了解,它是组成h t m l 文档的最小单位,在x m l 中也一样。一个元素由一个标识来定义,包括开始和结束标识以及其中的内容, 就象这样: x m l 产生的背景和用途 唯一不同的就是:在h t m l 中,标识是固定的,而在x m l 中,标识需要你 自己创建。 2 - 3 3 2t a g ( 标识、 标识是用来定义元素的。在x m l 中,标识必须成对出现,将数据包围在中 间。标识的名称和元素的名称是一样的。例如这样一个元素: x m l 产生的背景和用途 其中 就是标识。 2 _ 3 3 3a t t r i b u t e ( 属性) : 什么是属性? 看这段h t m l 代码: w o r d 。其中c o l o r 就是f o n t 的属性之一。 属性是对标识进一步的描述和说明,一个标识可以有多个属性,例如f o n t 的 属性还有s i z e 。x m l 中的属性与h t m l 中的属性是一样的,每个属性都有它自 己的名字和数值,属性是标识的一部分。举例: x m l 产生的背景和用途 x m l 中属性也是自己定义的,我们建议你尽量不使用属性,而将属性改成子 元素,例如上面的代码可以改成这样: x m l 产生的背景和用途 1 原因是属性不易扩充和被程序操作。 2 3 3 4d e c l a r a t i o n ( 声明) 在所有x m l 文档的第一行都有一个x m l 声明。这个声明表示这个文档是一 个x m l 文档,它遵循的是哪个x m l 版本的规范。个x m l 的声明语句就象 这样: 堇主! ! ! 堕坌塑蔓童堕盟堡茎皇塞翌 一 一一 2 335 d t d ( 文件类型定义) d t d 是用来定义x m l 文档中元素,属性以及元素之间关系的。通过d t d 文 件可以检测x m l 文档的结构是否正确。但建立x m l 文档并不一定需要d t d 文 件。关于d t d 文件的详细说明我们将在下面单独列项。 2 ,3 ,3 6 w e l l f o r m e dx m l ( 良好格式的x m l ) 一个遵守x m l 语法规则,并遵守x m l 规范的文档称之为”良好格式”。如果 你所有的标识都严格遵守x m l 规范那么你的x m l 文档就不定需要d t d 文 件来定义它。良好格式的文档必须以一个x m l 声明开始,例那: 其中你必须说明文档遵守的x m l 版本,目前是1 0 ;其次说明文档是”独立 的”,它不需要d t d 文件来验证其中的标议是否有效:第三,要说明文档所使用 的语言编码。默认的是u t f - 8 ,如果使用中文,你需要设置为g b 2 3 1 2 。 良好格式的x m l 文档必须有一个根元素,就是紧接着声明后面建立的第一个元 素,其它元素都是这个根元素的子元素,属于根元素一组。 良好格式的x m l 文档的内容书写时必须遵守x m l 语法。( 有关x m l 语法我们 将在下一章仔细讲解1 2 33 7 v a l i dx m l ( 有效的x m l ) 一个遵守x m l 语法规则,并遵守相应d t d 文件规范的x m l 文档称为有效 的x m l 文档。注意我们比较”w e l l - f o r m e dx m l “和”v a l i dx m l ”,它们最大的差 别在于一个完全遵守x m l 规范,一个则有自己的”文件类型定义( d i d ) n 。 将x m l 文档和它的d t d 文件进行比较分析,看是否符合d t d 规则的过程n q v a l i d a t i o n ( 确认) 。这样的过程通常我们是通过一个名为p a r s e r 的软件来处理的。 有效的x m l 文档也必须以一个x m l 声明开始,例如: 和上面例子不同的,在s t a n d a l o n e ( 独立) 属性中,这里设置的是”n o n ,因为它 必须和相应的d t d 一起使用,d t d 文件的定义方法如下: 其中: ”! d o c t y p e ”是指你要定义一个d o c t y p e ; ”t y p e o f - d e c “是文档类型的名称,由你自己定义,通常于d t d 文件名相同; ”s y s t e m p u b l i c ”这两个参数只用其一。s y s t e m 是指文档使用的私有 d t d 3 t - n n n :,而p u b l i c 则指文档调用一个公用的d t d 文件的网址。 基于p 2 p 的分布式存储的研究与实现 ”d t d n a l t l e “就是d t d 文件的网址和名称。所有d t d 文件的后缀名为 d t d ”。 我们还是用上面的例子,应该写成这样: 2 3 4x m l 文档基本语法 2 3 4 1x m l 文档语法: x m l 的文档和h t m l 的原代码类似,也是用标识来标识内容。创建x m l 文 档必须遵守下列重要规则: 规则1 :必须有x m l 声明语句 这一点我们在上一章学习时已经提到过。声明是x m l 文档的第一句,其格 式如下: 声明的作用是告诉浏览器或者其它处理程序:这个文档是x m l 文档。声明语句 中的v e r s i o n 表示文档遵守的x m l 规范的版本;s t a n d a l o n e 表示文档是否附带 d t d 文件,如果有,参数为n o ;e n c o d i n g 表示文档所用的语言编码,默认是u t f - 8 。 规则2 :是否有d 1 d 文件 如果文档是一个”有效的x m l 文档”( 见上一章) ,那么文档一定要有相应 d t d 文件,并且严格遵守d t d 文件制定的规范。d t d 文件的声明语句紧跟在 “l 声明语句后面,格式如下: 其中: ”! d o c t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论