http协议进阶(二)URL与资源

一、URL的语法 

URL是互联网资源的标准化名称

URL提供了一种定位互联网上任意资源的手段,但这些资源要通过不同方案(协议:比如http、ftp、smtp)来访问,因此URL语法会略有差异

大部分URL都遵循通用的语法,而且不同URL方案风格和语法都有重叠

大多数URL协的语法都建立在下面9个部分构成的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)

通用URL组件:

 

1、方案-使用什么协议

方案:实际上规定了如何访问指定资源的主要标识符,它告诉负责解析URL的应用程序应该是用什么协议

方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)

 

2、主机与端口

想要在往上寻找到资源,应用程序需要知道哪台机器装载了资源,以及在机器的什么地方可以找到对目标资源进行访问的服务器,URL的主机和端口提供这2点信息

主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。比如下面2个URL就是指向同一个资源

主机名指向:http://joes-hardware.com:80/index.html

IP指向:161.58.228.45:80/index.html

端口组件标识了服务器正在监听的网络端口。对下层使用TCP协议的http协议来说,默认端口为80

 

3、用户名和密码

有些服务器都要求输入用户名和密码才允许用户访问数据,比如FTP(文件传输协议),如下面几个例子

ftp://ftp.prep.ai.mit.edu/pub/gnu

没有用户名和密码,只有标准的协议、主机和路径;如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码,比如FTP

ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu

指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来

ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu

指定了用户名和密码,两者之间由字符“:”隔开

 

4、路径

路径说明了请求的资源位于服务器的什么地方,通常是一个分级的文件系统路径;比如:

http://joes-hardware.com:80/seasona/index-fall.html

这个URL中的资源路径就是seasona/index-fall.html,很像Unix文件系统中的文件系统路径

路径是服务器定位资源所需的信息,可以用“/”将http URL中的路径组件划分为一些路径段(path segment),每个路径段都有自己的参数字段

 

5、参数

对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问

有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如

ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕

参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如

ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d      

参数为type=d,其中参数名为type,值为d

 

6、查询字符串

在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如

http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731

问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点

如下图:查询目的是检查清单中是否size为large、color为blue的条目

网关基本都是希望查询字符串以一系列“名/值”对的形式出现,名值对之间用“&”分隔

上面的例子,查询组件有2个名/值对:item=12731和color=blue

 

7、片段

有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节

为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:

http://www.joes-hardware.comtools.html#drills

这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills

服务器处理的是整个对象,URL片段仅由客户端使用并展示

 

二、URL快捷方式

web可以理解并使用URL的快捷方式,比如缩略,自动扩展(用户输入关键部分,浏览器负责填充)

 

1、相对URL

URL有2种方式:绝对的和相对的。目前为止,我们使用的URL基本都是绝对的,它包含了访问资源所需的全部信息

相对URL是不完整的,要从相对URL中获取访问资源的全部信息,就必须相对于另一个基础(base)的URL进行解析

相对URL是URL的一种便捷缩略记法,下面是一个嵌入了相对URL的HTML文档实例

<html>
<head><title>joe's tools</title></head>
<body>
<h1>tools page</h1>
<h2>hammers<h2>
<p>joe's hardware online has the largest selection of<a herp="./
hammers.html">hammers
<a/>on earth
</body>
</html>

上面的例子是资源http://www.joes-hardware.com/tools.html的HTML文档,在这个文档中包含了URL./hammers.html的超链接

虽然看起来不完整,但实际上是合法的相对URL,这个URL可以相对于它所在的文档中的URL对其进行解释

使用缩略形式的相对URL语法,写HTML时就可以省略URL中的方案、主机和其他一些组件,这些组件可以从所属资源的基础URL中推导出来,其他资源的URL也可以用这种缩略形式来表示

下图说明了如何从基础URL中推导出缺失的组件信息

相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换

PS:相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;

    因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能

 

1.1 基础URL

基础URL是作为相对URL的参考点来使用的,可以来自以下不同的地方:

在资源中显式提供:有些资源会显式指定基础URL

比如:HTML文档中可能会包含一个定义了基础URL的HTML标记<BASE>,通过它来转换HTML文档中的所有相对URL

封装资源的基础URL:如果在一个没有显式指定基础URL的资源中发现一个相对URL,如上面的HTML文档所示,可将其所属资源的URL作为基础

没有基础URL:某些情况没有基础URL,一般意味着你有一个相对URL,但有时可能只是一个不完整或者损坏的URL

 

1.2 解析相对引用

解析:要将相对URL转换为一个决定URL,需要将相对URL和决定URL划分成组件段,这样,实际上只是在解析URL,但这种做法会将其划分为一个个组件,可以称之为解析/分解URL

将基础和相对URL划分成组件,可以下用下图的算法来完成转换

这个算法将一个相对URL转换成了其绝对模式,之后,就可以用其引用资源

 

2、自动扩展URL

很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展

自动扩展特性有以下2种方式:

2.1 主机名扩展

只要有些小提示,浏览器就可以帮你将输入的主机名扩展为完整的主机名,比如:输入baidu,构建出www.baidu.com;弊端在于有时候会为其他http应用程序带来问题,比如代理,后面详细解释

2.2 历史扩展

将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择

PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释

 

三、URL字符集

URL是可移植的:它命名了互联网上所有的资源,需要通过各种不同协议来传输资源,资源在传输时采取了不同的机制,因此,信息的安全传输就很重要

安全传输意味着URL传输不能丢失信息,但有些协议,比如SMTP(简单邮件传输协议),传输方法就是剥去一些特点的字符

URL是可读的:因此,即使不可见、不可打印的字符能穿过邮件程序,从而成为可移植的,也不能在URL中使用

URL是完整的:有人希望URL中包含初通用的安全字母表之外的二进制数据或字符,因此需要一种转义机制,将不安全的字符编码为安全字符再传输

 

1、URL字符集

1.1 很多计算机应用程序使用的都是ASCII字符集,ASCII使用7位二进制码来表示大多数按键和少数不可控字符,其移植性也很好,但考虑到全球用户太多,以及有时候URL中会包含任意二进制数据

就需要将转义序列集成进来,通过转义序列将ASCII字符集的有限子集对任意字符值或数据进行编码,这样就实现了可移植和完整性

1.2 编码机制

为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数,下面是几个例子

1.3 字符限制

URL中,有几个字符被保留起来,有着特殊含义。有些字符不在定义的ASCII字符集中,还有些字符会和某些协议网关产生混淆,因此不赞成使用

 

四、常见协议

下面附录一个关于常用常见的协议列表

 

五、URL未来发展

URL可用来命名所有现存对象,其还提供一种可在各种协议间共享的统一命名机制,但并不完美;因为URL只表示实际地址,而不是准确的名字,意味着如果资源地址有变化,URL就无法对其进行定位

永久统一资源定位符(PURL),其本质是搜索资源过程中引入一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和追踪

客户端可以向定位符请求一个永久的URL,定位符可以以一个资源为响应,将客户端重定向到资源当前的URL去

 

posted @ 2016-09-10 15:00  老_张  阅读(...)  评论(... 编辑 收藏