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://[email protected]://ftp.prep.ai.mit.edu/pub/gnu

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

ftp://anonymous:[email protected]://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去

写到这里,基本上关于URL与资源的内容整理完了,当然,相关的一些其他信息就需要大家对照具体的信息去寻找了。。。。。。

本来这周二就整理的差不多了, 一直因为琐碎的的工作上的事和身体原因,没发布,所以,随笔顶部的内容,大家忽略。。。

时间: 2024-10-04 12:25:50

http协议进阶(二)URL与资源的相关文章

HTTP协议(二)之HTTP请求

一.HTTP请求的方法 在HTTP/1.1协议中,定义了8种发送HTTP请求的方法,有GET.POST.OPTION.HEAD.PUT.DELETE.TRACE.CONNECT.PACH.根据HTTP协议的解释,不同的方法对资源有不同的操作方式: 1.PUT:增 2.DELETE:删 3.POST:改 4.GET:查 其中最常用的时GET和POST.GET和POST的主要区别在数据的传递上. 1.GET 在URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如: http://lo

HTTP协议(二)header标头说明

HTTP协议(二):header标头说明 Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12 Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control: no-cache Content-E

java进阶 ------ 基于URL高层次的网络编程

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 统一资源定位符URL URL(Uniform Resource Locator)表示Internet上某一资源的地址,通过URL我们可以访问internet上的各种网络资源,比如最常见的WWW,FTP站点. URL的组成: protocol://resourceName 协议名(protocol)指明获取资源所使用的传输协议,如http,ftp,gopher,file等,资

Java进阶(二十五)Java连接mysql数据库(底层实现)

Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜索.特将之前使用的方法做一简单的总结.也能够在底层理解一下连接数据库的具体步骤. 实现 首先需要导入相关的jar包,我使用的为:mysql-connector-java-5.1.7-bin.jar. 下面来看一下我所使用的数据库连接方法类: MysqlUtil.java package cn.edu

第二章 URL与资源

在本章需要学习如下内容 1,URL语法,以及各种url组件的含义及其所做的工作 2,web客户端都支持的url快捷方式(相对url和自动扩展url) 3,url编码和字符规则 4,因特网信息系统支持常见的url协议 5,url的未来,包括urn(可以将资源从一个地方搬到另一个地方但不影响访问) url的语法格式如下 <scheme>://<user>:<password>@<host>:<port>/<path>;<param&

http协议进阶(一)http概述

之前一段时间将http协议的一些基础的知识学习并且整理了笔记,发到了博客上,最近间歇性看更深入的一些关于http协议的东西,顺带也整理上来...... 当然,可能有些内容会和之前的博客内容重叠,但基本都是在其基础上进行了加深巩固,后面,估计会顺带说一下TCP协议的一点东西,嗯,就这样... ——参考书籍<HTTP权威指南> 1.web客户端和服务器 http客户端发出请求,其中包含请求内容,发给服务器,服务器再返回内容中回送请求的数据,http客户端和服务器构成了万维网的基本组件 我们常说的客

Android 网络编程(2)——URL互联网资源指针

URL(Uniform Resource Locator)对象代表统一资源定位器,它是指向互联网"资源"的指针.资源可以是简单的文件或目录,也可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询.通常情况而言,URL可以由协议名.主机.端口和资源组成.即满足如下格式: protocol://host:port/resourceName 例如如下的URL地址: http://www.baidu.com/index.php URL类提供了多个构造器用于创建URL对象,一旦获取了URL对

分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)

当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚拟化并不是最好的选择. 一种替代方案是使用轻量级虚拟化技术 -- 所谓的 LinuX Container 容器 (LXC),它提供的是系统级虚拟化.与跑虚拟机相比,LXC 可以在一个轻量级沙箱容器里面跑多个 Linux 操作系统.当你需要设置一些易于克隆的开发环境.测试环境,或想在安全沙盒里安装应用

《HTTP权威指南》读书笔记-URL与资源

一.URL组成 大多数的URL方案的URL语法都建立在这个由9个部分构成的通用格式上: <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>,几乎没有哪个URL包含了所有这些组件.URL最重要的3个方案(scheme).主机(host)和路径(path) 2.URI每一个web服务器资源都有一个名字,这个名