浅析URL

103 阅读14分钟

URL 概述

URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制。
URL 指的是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个独特的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。
一个 URL 由不同的部分组成,其中一些是必须的,而另一些是可选的。让我们以下面这个 URL 为例看看其中最重要的部分:

http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument


http:// 是协议。它表明了浏览器必须使用何种协议。它通常都是 HTTP 协议或是 HTTP 协议的安全版,即 HTTPS。Web 需要它们二者之一,但浏览器也知道如何处理其他协议,比如 mailto:(打开邮件客户端)或者 ftp:(处理文件传输),所以当你看到这些协议时,不必惊讶。


www.example.com 是域名。 它表明正在请求哪个 Web 服务器。或者,可以直接使用 IP address, 但是因为它不太方便,所以它不经常在网络上使用。


:80 是端口。 它表示用于访问 Web 服务器上的资源的技术“门”。如果 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)来授予其资源的访问权限,则通常会被忽略。否则是强制性的。


/path/to/myfile.html 是网络服务器上资源的路径。在 Web 的早期阶段,像这样的路径表示 Web 服务器上的物理文件位置。


?key1=value1&key2=value2 是提供给网络服务器的额外参数。 这些参数是用 & 符号分隔的键/值对列表。在返回资源之前,Web 服务器可以使用这些参数来执行额外的操作。


#SomewhereInTheDocument 是资源本身的另一部分的锚点. 锚点表示资源中的一种“书签”,给浏览器显示位于该“加书签”位置的内容的方向。例如,在 HTML 文档上,浏览器将滚动到定义锚点的位置;在视频或音频文档上,浏览器将尝试转到锚代表的时间。值得注意的是,#后面的部分(也称为片段标识符)从来没有发送到请求的服务器。

大多数网页浏览器不要求用户输入网页中“ https:// ”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(zh.wikipedia.org/w/index.php?title=Special:随机页面)就可以了。

由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。

DNS

  1. 域名系统介绍

    域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。

  2. DNS 资源记录类型 DNS 系统中,常见的资源记录类型有:

    • 主机记录(A 记录):A 记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的 IP 地址上。
    • 别名记录(CNAME 记录):CNAME 记录用于将某个别名指向到某个 A 记录上,这样就不需要再为某个新名字另外创建一条新的 A 记录。
    • IPv6 主机记录(AAAA 记录): 与 A 记录对应,用于将特定的主机名映射到一个主机的 IPv6 地址。
    • 服务位置记录(SRV 记录):用于定义提供特定服务的服务器的位置,如主机(hostname),端口(port number)等。
    • NAPTR 记录:它提供了正则表达式方式去映射一个域名。NAPTR 记录非常著名的一个应用是用于 ENUM 查询。
  3. 域名解析 DNS 通过允许一个名称服务器把他的一部分名称服务(众所周知的 zone)“委托”给子服务器而实现了一种层次结构的名称空间。此外,DNS 还提供了一些额外的信息,例如系统别名、联系信息以及哪一个主机正在充当系统组或域的邮件枢纽。任何一个使用 IP 的计算机网络可以使用 DNS 来实现他自己的私有名称系统。

    举一个例子,zh.wikipedia.org 作为一个域名就和 IP 地址 198.35.26.96 相对应。DNS 就像是一个自动的电话号码簿,我们可以直接拨打 198.35.26.96 的名字 zh.wikipedia.org 来代替电话号码(IP 地址)。DNS 在我们直接调用网站的名字以后就会将像 zh.wikipedia.org 一样便于人类使用的名字转化成像 198.35.26.96 一样便于机器识别的 IP 地址。

    DNS 查询有两种方式:递归和迭代。DNS 客户端设置使用的 DNS 服务器一般都是递归服务器,它负责全权处理客户端的 DNS 查询请求,直到返回最终结果。而 DNS 服务器之间一般采用迭代查询方式。 以查询 zh.wikipedia.org 为例:

    • 客户端发送查询报文"query zh.wikipedia.org"至 DNS 服务器,DNS 服务器首先检查自身缓存,如果存在记录则直接返回结果。

    • 如果记录老化或不存在,则:

      1. DNS 服务器向根域名服务器发送查询报文"query zh.wikipedia.org",根域名服务器返回顶级域 .org 的权威域名服务器地址。
      2. DNS 服务器向 .org 域的权威域名服务器发送查询报文"query zh.wikipedia.org",得到二级域 .wikipedia.org 的权威域名服务器地址。
      3. DNS 服务器向 .wikipedia.org 域的权威域名服务器发送查询报文"query zh.wikipedia.org",得到主机 zh 的 A 记录,存入自身缓存并返回给客户端。

nslookup 命令

nslookup 命令用于查询 DNS 的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。 nslookup 的用法相对来说还是蛮简单的,主要是下面的几个用法。

  1. 直接查询,这个可能大家用到最多,查询一个域名的 A 记录。

     nslookup domain [dns-server]
    

    如果没指定 dns-server,用系统默认的 dns 服务器。下面是一个例子:

     [root@localhost ~]# nslookup baidu.com
     Server:     10.30.7.177
     Address:    10.30.7.177#53
    
     Non-authoritative answer:
     Name:   baidu.com
     Address: 123.125.114.144
     Name:   baidu.com
     Address: 111.13.101.208
     Name:   baidu.com
     Address: 180.149.132.47
     Name:   baidu.com
     Address: 220.181.57.217
    
  2. 查询其他记录,直接查询返回的是 A 记录,我们可以指定参数,查询其他记录,比如 AAAA、MX 等。

     nslookup -qt=type domain [dns-server]
    

    其中,type 可以是以下这些类型:

    • A 地址记录
    • AAAA 地址记录
    • AFSDB Andrew 文件系统数据库服务器记录
    • ATMA ATM 地址记录
    • CNAME 别名记录
    • HINFO 硬件配置记录,包括 CPU、操作系统信息
    • ISDN 域名对应的 ISDN 号码
    • MB 存放指定邮箱的服务器
    • MG 邮件组记录
    • MINFO 邮件组和邮箱的信息记录
    • MR 改名的邮箱记录
    • MX 邮件服务器记录
     [root@localhost ~]# nslookup -qt=mx baidu.com 8.8.8.8
     *** Invalid option: qt=mx
     Server:     8.8.8.8
     Address:    8.8.8.8#53
    
     Non-authoritative answer:
     Name:   baidu.com
     Address: 111.13.101.208
     Name:   baidu.com
     Address: 123.125.114.144
     Name:   baidu.com
     Address: 180.149.132.47
     Name:   baidu.com
     Address: 220.181.57.217
    

IP 地址

  1. 功能,IP 地址有两个主要的功能。它标识主机,更具体地说,标识其网络接口,并且提供主机在网络中的位置,就此提供创建到达该主机的路径的能力。每个 IP 数据包的标头包含了发送主机的 IP 地址和目的主机的 IP 地址。

  2. IPv4 位地址,IP 地址由 32 位二进制数组成,为便于使用,常以 XXX.XXX.XXX.XXX 形式表现,每组 XXX 代表小于或等于 255 的 10 进制数,该表示方法称为点分十进制。例如维基媒体的一个 IP 地址是 208.80.152.2。地址可分为 A、B、C、D、E 五大类,其中 E 类属于特殊保留地址。IP 地址是唯一的。当前 IPv4 技术可能使用的 IP 地址最多可有 4,294,967,296 个(即 232)。骤看可能觉得很难会用尽,但由于早期编码和分配上的问题,使很多区域的编码实际上被空出或不能使用。加上互联网的普及,使大部分家庭都至少有一部电脑,连同公司的电脑,以及连接网络的各种设备都消耗大量 IPv4 地址资源。

    在 A 类、B 类、C 类 IP 地址中,如果主机号是全 1,那么这个地址为直接广播地址,它是用来使路由器将一个分组以广播形式发送给特定网络上的所有主机。32 位全为 1 的 IP 地址“255.255.255.255”为受限广播地址("limited broadcast" destination address),用来将一个分组以广播方式发送给本网络中的所有主机,路由器则阻挡该分组通过,将其广播功能限制在本网内部。

ping 命令

ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性。它通过发送 ICMP ECHO_REQUEST 数据包到网络主机(send ICMP ECHO_REQUEST to network hosts),并显示响应情况,这样我们就可以根据它输出的信息来确定目标主机是否可访问(但这不是绝对的)。有些服务器为了防止通过 ping 探测到,通过防火墙设置了禁止 ping 或者在内核参数中禁止 ping,这样就不能通过 ping 确定该主机是否还处于开启状态。

  1. 命令格式:ping [参数][主机名或ip地址]。

  2. ping 命令用于:确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测试、评估和管理网络。如果主机正在运行并连在网上,它就对回送信号进行响应。每个回送信号请求包含一个网际协议(IP)和 ICMP 头,后面紧跟一个 tim 结构,以及来填写这个信息包的足够的字节。缺省情况是连续发送回送信号请求直到接收到中断信号(Ctrl-C)。

  3. 命令参数:

    • -s 字节数:指定发送的数据字节数,预设值是 56,加上 8 字节的 ICMP 头,一共是 64ICMP 数据字节。
    • -t 存活数值:设置存活数值 TTL 的大小。
    • -d 使用 Socket 的 SO_DEBUG 功能。
    • -f 极限检测。大量且快速地送网络封包给一台机器,看它的回应。
    • -n 只输出数值。
    • -q 不显示任何传送封包的信息,只显示最后的结果。
    • -r 忽略普通的 Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
    • -R 记录路由过程。
    • -v 详细显示指令的执行过程。
    • -c 数目:在发送指定数目的包后停止。
    • -i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
  4. 使用实例
    实例 1:ping 的通的情况
    命令:ping 192.168.120.205
    输出:

     [root@localhost ~]# ping 192.168.120.205
     PING 192.168.120.205 (192.168.120.205) 56(84) bytes of data.
     64 bytes from 192.168.120.205: icmp_seq=1 ttl=64 time=0.720 ms
     64 bytes from 192.168.120.205: icmp_seq=2 ttl=64 time=0.181 ms
     64 bytes from 192.168.120.205: icmp_seq=3 ttl=64 time=0.191 ms
     64 bytes from 192.168.120.205: icmp_seq=4 ttl=64 time=0.188 ms
     64 bytes from 192.168.120.205: icmp_seq=5 ttl=64 time=0.189 ms
    
     --- 192.168.120.205 ping statistics ---
     5 packets transmitted, 5 received, 0% packet loss, time 4000ms
     rtt min/avg/max/mdev = 0.181/0.293/0.720/0.214 ms
    

    实例 2:ping 不通的情况
    命令:ping 192.168.120.205
    输出:

     [root@localhost ~]# ping 192.168.120.202
     PING 192.168.120.202 (192.168.120.202) 56(84) bytes of data.
     From 192.168.120.204 icmp_seq=1 Destination Host Unreachable
     From 192.168.120.204 icmp_seq=2 Destination Host Unreachable
     From 192.168.120.204 icmp_seq=3 Destination Host Unreachable
     From 192.168.120.204 icmp_seq=4 Destination Host Unreachable
     From 192.168.120.204 icmp_seq=5 Destination Host Unreachable
     From 192.168.120.204 icmp_seq=6 Destination Host Unreachable
    
     --- 192.168.120.202 ping statistics ---
     8 packets transmitted, 0 received, +6 errors, 100% packet loss, time 7005ms
     , pipe 4
    

    实例 3:ping 指定次数
    命令:ping -c 10 192.168.120.206
    输出:

     [root@localhost ~]# ping -c 10 192.168.120.206
     PING 192.168.120.206 (192.168.120.206) 56(84) bytes of data.
     64 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=1.25 ms
     64 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.260 ms
     64 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.242 ms
     64 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.271 ms
     64 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=0.274 ms
     64 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=0.295 ms
     64 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.269 ms
     64 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.270 ms
     64 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.253 ms
     64 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.289 ms
    
     --- 192.168.120.206 ping statistics ---
     10 packets transmitted, 10 received, 0% packet loss, time 9000ms
     rtt min/avg/max/mdev = 0.242/0.367/1.251/0.295 ms
    

域名

网域名称(英语:Domain Name,简称:Domain),简称域名、网域,是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名可以说是一个 IP 地址的代称,目的是为了便于记忆后者。
域名的核心是域名系统(英语:Domain Name System,缩写:DNS),域名系统中的任何名称都是域名。在域名系统的层次结构中,各种域名都隶属于域名系统根域的下级。域名的第一级是顶级域,它包括通用顶级域,例如.com、.net 和.org;以及国家和地区顶级域,例如.us、.cn 和.tk。顶级域名下一层是二级域名,一级一级地往下。

  1. 域名语法 域名由一或多个部分组成,这些部分通常连接在一起,并由点分隔,例如 zh.wikipedia.org。最右边的一个标签是顶级域名,例如 zh.wikipedia.org 的顶级域名是 org。一个域名的层次结构,从右侧到左侧隔一个点依次下降一层。每个标签可以包含 1 到 63 个八字节。域名的结尾有时候还有一点,这是保留给根节点的,书写时通常省略,在查询时由软件内部补上。

  2. 顶级域名,顶级域名(英语:Top-level domains,缩写:TLD)是域名中最高的一级,每个域名都以顶级域名结尾。域名刚被设计出来时,顶级域名主要分成两类:国家及地区双字代码顶级域(国家和地区顶级域)(英语:Country Code Top-level domains,缩写:ccTLD)和通用顶级域(英语:general Top-level domains,缩写:gTLD)。前者基于 ISO-3166 规定的国家/地区双字缩写代码;后者代表了一组名称和多个组织,包括.gov(政府,现被用于美国政府的网站),.edu(教育机构,现被用于美国各类学校的网站),.com(商业,现在成为全球注册量最大、最通用的域名),.mil(军事,现被用于美国国防部及其附属机构的网站),.org(非营利组织),.net(网络,当时被定位为网络基础服务提供商)和.int(国际组织)等。

  3. 子域名,子域名将顶级域名进一步细分。域名层次结构中,顶级域名下面是二级域名,它位于顶级域名的左侧。例如,在 zh.wikipedia.org 中,wikipedia 是二级域名。w3.org 中,w3 也是二级域名,与前例中的 wikipedia 属于一个层面。

    二级域名下面是三级域名,它位于二级域名的左侧。例如,在 zh.wikipedia.org 中,zh 是三级域名;zh-classical.wikipedia.org(文言文维基大典的域名)中,zh-classical 也是三级域名,与前例中的 zh 属于一个层面。从右侧到左侧,隔一个点依次下降一层。

    通常情况下,人们基于公司、产品或服务的名称来创建二级域名或更低级别的域名,以方便其他人识别和记忆。完整域名的所有字符加起来不得超过 253 个 ASCII 字符的总长度。因此,当每一级都使用单个字符时,限制为 127 个级别:127 个字符加上 126 个点的总长度为 253。但实际上,某些域名可能具有其他限制;也没有只有一个字符的域名后缀。

参考

本文中,关于 URL 介绍的内容参考 MDN。
关于 nslookup 的内容,参考blog.csdn.net/violet_echo…
关于 ping 命令的作用,参考www.cnblogs.com/peida/archi…
关于域名,DNS 和 IP 地址的内容参考维基百科。