目录
[1.1 客户端、服务器](#1.1 客户端、服务器)
[1.1.1 服务器与服务](#1.1.1 服务器与服务)
[1.1.2 客户端](#1.1.2 客户端)
[1.2 URL](#1.2 URL)
[1.3 查询参数](#1.3 查询参数)
第一章、理解URL
1.1 客户端、服务器
1.1.1 服务器与服务
所谓服务器,其实就是一台24小时不关机的计算机,它也有自己的cpu、内存、网卡、硬盘以及操作系统(一般是各种发行版linux)。这些服务器和普通的电脑一样,也有目录、用户这些概念。
假如这是香港城市大学的一台服务器,这台服务器上提供了一个web服务,所谓服务,其实就是一个24小时运行在服务器上的程序。现在,如果有别的电脑来访问这个服务,他就可以看到香港城市大学的官网了。
1.1.2 客户端
现在,有一台客户机打开了自己的浏览器想要访问香港城市大学的官网。
但是在庞大的互联网世界中,提供服务的服务器不仅仅只有一台,我们的客户机怎么才能在茫茫机海中找到香港城市大学的服务器呢?
1.2 URL
答案就是URL(Uniform Resource Locator,统一资源定位符),我们经常在浏览器里输入的访问地址(比如NewsCentre | City University of Hong Kong),就是一个典型的URL。我们就是靠它定位需要访问的资源的。
URL是有固定格式的,下面我们通过一个具体的例子进行介绍。
下面这个地址是香港城市大学新闻页的URL
NewsCentre | City University of Hong Kong
将它复制到浏览器进行访问可以看到如下的页面
现在说一下URL的结构。
- 协议头:
冒号之前的部分,我们称为协议头。在这个URL中,我们可以说使用的是https协议。
https://www.cityu.edu.hk/media/news
- 主机名或域名:
://和第一个/之间的内容是主机名或域名(还可以直接写ip地址)。
https://www.cityu.edu.hk/media/news
严格来说,客户端通过ip地址才能在网络中找到响应的服务器。我们之前学过如何配hosts,当时就是相当于给ip地址起了别名,这样我们才能通过hadoop102、hadoop103等主机名去访问各类服务。但www.cityu.edu.hk对应的ip我们是怎么知道的呢?其实还有一个东西叫做DNS(域名解析系统),它其实是一些互联网厂商提供的一个把域名解析为ip地址的服务(它有一个域名和ip地址对应关系的表),而且DNS服务器的IP地址是事先写到路由器或上游网络设备的设置里的。
所以:
(1) 浏览器会根据DNS服务器的ip地址,找就近的DNS服务器去查询www.cityu.edu.hk的ip地址是多少。
(2) DNS响应浏览器,告诉我们www.cityu.edu.hk的ip地址是144.214.4.184。
最后,需要说明,域名是有专门的机构进行管理的,当你注册cityu.edu.hk这个域名时,别人就不能注册了。因此,可以确保域名的唯一性。
(3) 然后浏览器会在真正执行请求时,偷偷地把www.cityu.edu.hk换成ip地址。也就成了:
https://144.214.4.184/media/news
- 端口号
URL里其实还应该指定端口号。比如:
https://144.214.4.184:443/media/news
但是,在极个别的情况下可以省略。比如如果协议是http,那么在URL中省略端口号,就会默认访问80端口。如果协议是https,那么省略端口号时就会默认访问443端口。没有为什么,这是互联网刚兴起时,早期约定俗称的东西。其他情况下,端口号通常需要明确指定。
- 路径
从第一个单斜杠(包含)及其之后,其实就是路径了。它联合前面的协议头、域名共同指定了互联网中的唯一资源(可以是视频、网页、文件或者字符串)。
在此处,这个/media/news其实就对应香港城市大学的新闻页了。
https://144.214.4.184:443/media/news
现在我们的浏览器(客户端)已经可以根据IP地址找到服务器了。于是浏览器就向服务器通过网络发送了一条请求。
服务器上的程序根据URL中的路径寻找相应的文件或者执行某种程序,并将最终的结果返回给客户端。
最终,我们的页面上就能出现相应的内容了。
1.3 查询参数
不久,我们发现自己想看更多的新闻,我们想要看第二页。于是在页面最底部的页码条上点了一下2。
这个时候,我们发现浏览器地址栏里的URL,发生了变动。
注意问号之后的内容,它是一组由&分隔的键值对,键和值之间用=分隔。?后的异常创,我们通常称它为"查询参数"。
当前的查询参数具有如下含义:
页码 : 1
关键字 : <没给>
查询参数是对路径的进一步补充描述,它就像是在告诉服务器,我还是要看香港城市大学的新闻业,不过请给我page为1的页面。这个时候,香港城市大学的服务器又往后找了几条新闻,返回到了你的浏览器上。
那么问题在于,第一次请求的时候好像没给查询参数,香港城市大学为什么知道我要看的是哪一页呢?这其实取决于他们服务器的处理逻辑,现在让我们在下方的页码栏再次点击第一页。
此时,我们可以看到浏览器地址栏的变化。
这个时候,查询参数变成了page=0。也就是说,请求/media/news和请求/media/news?keyword=&page=0的结果是一样的。这可以理解为香港城市大学后台程序给page设置了默认值(0),所以用户不指定这个参数也可以顺利看到内容。但这并不是到哪个网站都通用的,当你指定URL时发送请求时,服务器要给你看什么完全取决于服务器。