你知道URL、URI和URN三者之间的区别吗?

这是一个经典的技术争论,许多人都会自问:URL、URI,很可能还有URN,它们之间的区别是什么。虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL、URN或者这两者的组合,所以了解这三者之间的区别将会非常有趣并让人受益匪浅。如果你恰好在某个地方碰到了这些东西,那么至少应该知道它们的含义。

我认为,尽管对一般人来说,不了解这三个缩略词之间的技术差异以及它们各自的含义并不是什么问题。但是,如果你作为一个计算机科学家、一个Web开发者、一个系统管理员,或者更笼统地说,你工作在IT领域,那么了解这些知识就非常有必要了。

这篇文章旨在于清楚地讲解URL、URI和URN之间的区别,帮助你快速理解这些必备知识。你是不是对这个话题也感到困惑?那么我们开始吧!

起源

这三个缩略词是Tim Berners-Lee在一篇名为RFC 3986: Uniform Resource Identifier (URI): Generic Syntax的文档中定义的互联网标准追踪协议。

引文:

统一资源标识符(URI)提供了一个简单、可扩展的资源标识方式。URI规范中的语义和语法来源于万维网全球信息主动引入的概念,万维网从1990年起使用这种标识符数据,并被描述为“万维网中的统一资源描述符”。

区别

首先我们要弄清楚一件事:URL和URN都是URI的子集。

换言之,URL和URN都是URI,但是URI不一定是URL或者URN。为了更好的理解这个概念,看下面这张图片。

通过下面的例子(源自 Wikipedia),我们可以很好地理解URN 和 URL之间的区别。如果是一个人,我们会想到他的姓名和住址。

URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。

相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。引自这篇文章:

所有的URN都遵循如下语法(引号内的短语是必须的):


  1. <URN>::="urn:"<NID>":"<NSS>

其中NID是命名空间标识符,NSS是标识命名空间的特定字符串。

一个用于理解这三者的例子

我们来看一下上述概念如何应用于与我们息息相关的互联网。

再次引用Wikipedia ,这些引文给出的解释,比上面人员地址的例子更为专业:

关于URL:

URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。

关于URN:

URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。

现在,如果到Web上去看一下,你会找出很多例子,这比其他东西更容易让人困惑。我只展示一个例子,非常简单清楚地告诉你在互联网中URI 、URL和URN之间的不同。

我们一起来看下面这个虚构的例子。这是一个URI:


  1. http://bitpoetry.io/posts/hello.html#intro

我们开始分析 http://是定义如何访问资源的方式。另外 bitpoetry.io/posts/hello.html是资源存放的位置,那么,在这个例子中, #intro是资源。 

URL是URI的一个子集,告诉我们访问网络位置的方式。在我们的例子中,URL应该如下所示:


  1. http://bitpoetry.io/posts/hello.html

URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式,如下所示: 


  1. bitpoetry.io/posts/hello.html#intro

就是这样。现在你应该能够辨别出URL和URN之间的不同。

如果你忘记了这篇文章的内容,至少要记住一件事:URI可以被分为URL、URN或两者的组合。如果你一直使用URI这个术语,就不会有错。

为了纠正一些错误,已经更新了这篇文章。如果你发现新的错误,无论是技术上的还是语法上的,请不要犹豫,告诉我们吧!

本文来自合作伙伴“Linux中国”,原文发布日期:2015-09-25  

时间: 2024-10-31 13:45:19

你知道URL、URI和URN三者之间的区别吗?的相关文章

@private、@protected与@public三者之间的区别

@private.@protected与@public三者之间的区别   类之间关系图   @private只能够使用在声明的类当中,其子类也不能够使用用@private声明的实例变量   @protected只能在声明的类当中使用,但其子类具有使用@protected声明变量的资格   @public可以全局使用,属性是具有全局属性的   实例变量其实是支持KVO的,如果你帮实例变量写了setter,getter方法   相关源码 #import <UIKit/UIKit.h> @inter

组件,控件,类这三者之间的区别

问题描述 各位大侠:初学.NET,想问下组件,控件,类这三者之间的区别? 解决方案 解决方案二:控件:在ide中左边工具条中出现的东东,可以直接拖到界面上使用的组件:编译后的实体.比如在一个解决方案中有一个项目是对数据库操作的,如果写得比较好,以后可以继续在其他解决方案中使用,那么可以将其编译成组件,可以提高效率(webcast中mordenc#第9讲有简单介绍,可以看看)类:一种数据结构,可以包含数据成员,函数成员等等,通俗点说,你可以定义一个公共类,那么一个公共变量.公共方法可以放在这个类中

开发人员、程序员与计算机科学家三者之间的区别

导读:原文作者Alan Skorkin写了一篇<The Difference Between A Developer, A Programmer And A Computer Scientist>,文中讲述如何区分程序员.开发人员和计算机科学家之间的区别,发表了个人见解.现将译文<开发人员.程序员与计算机科学家三者之间的区别>转载,以下是文章内容: 我经常使用这三个几乎可以互换的词,是的,甚至包括计算机科学家.毕竟,我们中的大多数人都拥有计算机科学学位,那这三者有什么不同呢?然而,

innerHTML,outerHTML,innerTEXT三者之间的区别_javascript技巧

与innerHTML不同,outerHTML包括整个标签,而不仅限于标签内部的内容.对于一个id为"testdiv"的div来说,outerHTML.innerHTML以及innerTEXT三者的区别可以通过下图展示出来:

简单说说Java SE、Java EE、Java ME三者之间的区别_java

1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面. 服务器.嵌入式环境和实时环境中使用的 Java 应用程序.Java SE 包含了支持 Java Web 服务开发的类, 为 Java Platform,Enterprise Edition(Java EE)提供基础. 2. Java EE(Java Platform,Enterprise Edition).这个版本以前称为 J2EE.企业版本帮助开发

java中数组list map三者之间的互转介绍_java

三者之间转换关系,一张图清晰呈现.  上代码: 其中的maputils是apache的collection包. 复制代码 代码如下: package util; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.MapUtil

总结有关IP地址、主机名及MAC三者之间的联系

相信很多做网络的兄弟,也和烂泥一样经常碰到由IP地址查找主机名等等之类的问题,那么今天我就此类问题做一个总结. 首先在此声明,我这个总结全部是基于windows自身的网络工具进行操作的,不使用第三方软件的.先看我手工绘制的这三者之间的关系,如下图: 一.知道主机名,查看IP地址及MAC地址 Ping 主机名 我们可以得到IP地址,然后我们IP地址可以得到MAC地址具体命令如下: Ping 主机名→IP地址 Nbtstat –A IP地址→MAC地址 二.知道IP地址,查看主机名及MAC地址 Pi

游标、事务并发和锁三者之间的那点事

对数据库学习的不断深入,对游标的认识也在逐渐加深,游标与事务.锁有着密不可分的关系. 无论是事务.锁还是游标相对于数据库来说最主要目的是保证数据的完整性.对事务并发.锁定的深入学习才能更加完善对游标的理解.少说废话,下面进入本篇文章的正题. 首先,我们讲解游标与事务并发的那点事 事务是为完成特定任务,将一条或多条的SQL语句组合在一起.有效的使用事务不但可以提高数据的安全性,而且还可以增强数据的处理效率.如果没有锁定且多个用户同时访一个数据库,多个事务使用相同的数据时就会出现事务并发的问题. 我

《Storm企业级应用:实战、运维和调优》——3.8 Worker、Task、Executor三者之间的关系

3.8 Worker.Task.Executor三者之间的关系 Storm集群中的一个物理节点启动一个或者多个Worker进程,集群的Topology都是通过这些Worker进程运行的.然而,Worker进程中又会运行一个或者多个Executor线程,每个Executor线程只运行一个Topology的一个组件(Spout或Bolt)的Task任务,Task又是数据处理的实体单元.Worker是进程,Executor对应于线程,Spout或Bolt是一个个的Task:同一个Worker只执行同一