最近在梳理HTTP协议的时候遇到URI/URL/URN这三个概念,查了很多资料都在说URL和URN是URI的子集,URI=URL+URN等等。感觉说的都不够细致,经过查阅了大量文档,在此总结一下,不知道能不能说明白。
URI:统一资源标志符(Uniform Resource Identifier)
URL:统一资源定位符(Uniform Resource Location)
URN:统一资源名称(Uniform Resource Name)
先说URI,统一资源标志符,什么是标志符呢?互联网上有很多资源,为了区分这些资源我们需要给这些资源打标记,打标记的方式有很多种,有些记录资源的位置,有些记录资源的名称。就好像我们给一个人打标记,可以记录这个人的住址,也可以记录这个人的身份证号。这是两种不同维度的打标记方式。但是不管那种方式,它的目的都是给这个资源做标记,打好的标记就叫统一资源标志符URI。URI规定了打标记的大概方法,它的格式为
协议:协议对应的内容。
这里参考百度百科的描述:URI(标识、定位任何资源的字符串)_百度百科 (baidu.com)

其中记录资源地址的打标记方式是为了能够让人找到这个资源,这种标记方式就叫统一资源定位符URL,通过URL能够准确地找到该资源。URL的格式大家都很熟悉了:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
例如:
https://developer.mozilla.org/en-US/docs/Learn
git@github.com:mdn/browser-compat-data.git
都属于URL
另一种记录资源名称的标记方式是为了能唯一识别这个资源,比如一个人只有一个身份证号,我们知道了这个身份证号就能知道这个人是谁,但是我们不能根据身份证号找到这个人。这种打标记的方式就叫统一资源名称URN。URN的格式是下面这样
urn:[NID]:[NSS]
例如:
urn:isbn:0451450523
因为URN不是很常见,所以很多人不熟悉,这里解释一下
urn: 表示协议名称,是一个固定值
NID:表示命名空间,例如isbn:表示书号(book number),isan:表示媒体编号(audiovisual number)还有很多可以去查
NSS:表示序号,一个序号表示一个资源
URN是怎样应用的呢?典型的一个例子就是把它嵌入到URL中,比如磁力下载链接
magnet:?xt=urn:btih:E7FC73D9E20697
有没有看到其中的URN
最后简单总结一下,URI就是指给资源做标记,URL是通过记录地址的方式来打标记,URN是记录唯一名称的方式来打标记。由于URN技术还不是很成熟,所以应用很少,我们见到大多URI都是以URL的形式表示的。
参考:Java魔法堂:URI、URL(含URL Protocol Handler)和URN - _肥仔John - 博客园 (cnblogs.com)