URL是什么?
URL:Uniform Resource Locator(统一资源定位器)
顾名思义,URL就是一种定位器,用来定位网上各种网页和资源的。互联网上的每个文件都有唯一的URL,它包含的信息就是指出文件的位置以及浏览器看到它后该如何处理它,对其进行什么操作。
为什么要知道URL?
“HTML之父” Tim Berners-Lee 发明了WWW,(WWW = URL + HTTP + HTML),为了更好的了解WWW,更好的学好前端,学习URL和HTTP是很有必要的。
URL由哪些部分组成?
URL = 协议 + 域名/IP(端口) + 路径 + 查询参数 + 锚点,虽然一个标准的URL地址看起来很复杂,但其实在日常使用中,我们只需要输入域名就行了。
协议
我们在网上“冲浪”时,访问不同的网站和网站里的不同资源和服务,都是需要用到对应的协议的。比如访问网站时我们经常用到的HTTP、HTTPS协议:网页里不仅包含文字,还包含图片、音频和视频,所以是”超文本“,访问网页时用到的协议自然就是超文本传输协议咯,也就是HTTP(Hyper Text Transfer Protocol)。还有我们在网上下载东西时,用到是一般是FTP协议(File Transfer Protocol),有了这些协议,我们才能完成在网上的各种操作。
域名/IP
我们平时生活里遇到不懂的问题了,很多人会上网去”百度一下“,而我们输入的网址 baidu.com 就是一个域名。现在上”百度“搜一个问题,很方便也很简单,打开浏览器输入网址,进入后输入问题就行了,但其实这里面实际过程并不简单:
我们输入网址(域名)后,浏览器先去查这个域名对应的IP地址是什么,查到后再按这个地址去找对应的服务器,然后访问服务器来使用搜索服务。就好比我们想去”全聚德“吃烤鸭,我们想去的话光知道这家店叫”全聚德“不行,还得知道这家店地址在北京哪个区什么路多少号,这样才能找到这家店,进去买烤鸭。域名和IP地址,和全聚德烤鸭店和其所在地址,道理是一样的。
那么IP到底是什么呢?
IP:Internet Protocol(互联网协议),顾名思义也是一种协议,这个协议有啥用?简单的来说,IP主要约定了两件事:
1.如何定位一台设备(电脑、手机、摄像头啥的)
2.如何封装数据报文,来和其他设备进行交流
也就是说,我们要上网,要和其他设备交流,就必须有一个IP地址才行。换句话说,只要我们在互联网上”冲浪“,就一定有一个独特的IP地址,没IP我们就上不了网了。上面说到URL是用来定位设备和资源的,而URL是通过什么来定位的呢?就是通过IP来定位的。很多时候,我们在电视上看到很多罪犯去上网,或者有的人在网上做啥坏事后被抓住了,大部分也是因为警方通过IP地址查到他在哪儿了,就是这么个原因(所以网络非法外之地,不要做以为做坏事抓不到你哦)
IP地址是一串数字,比如百度服务器的IP地址就是 39.156.69.79,但是这种数字正常人谁能记得住呢?真要是上网时,上每个网站都得记住IP地址才行,那估计能给人记吐了...

所以人们设计出了域名这个玩意,用来和IP地址互相映射,让人们更方便的访问互联网,而不用去记住能被机器直接读取的IP地址。 那么域名是字符串,而IP是数字,它们是怎么完成互相映射和转换的呢?这其中用到了域名系统(DNS)。
DNS
DNS(Domain Name System),是一种分布式网络目录服务,用于域名和IP地址的互相转换。我们输入域名后,浏览器并不知道域名对应的IP地址是什么,它得去问电信或联通的DNS服务器,DNS服务器告诉浏览器这个域名对应啥IP地址后,浏览器才能找到这个服务器。假如有天DNS服务器出问题了,不能告诉浏览器一个域名对应的IP地址是什么了,我们怎么去手动找呢?
这时我们可以用在终端里用ping命令查看域名信息:


假如哪天我们的电信商家的DNS服务器真出问题了,我们又需要上网,那么有没有什么其他办法呢?这时我们可以使用其他的免费的DNS服务,比如我们可以把网络适配的IPv4里的DNS设置成这样:

不过这种使用这种免费的DNS服务时,可能会被嵌入广告,而且非专业人员还是不要随意修改DNS设置,容易出问题。

域名分类
-
顶级域名:上面提到的 baidu.com 中的 com 就是顶级域名,常见的顶级域名还有cn,org,net:
com = company,公司;
cn = China,国内;
org = organization,组织;
net,从事和互联网服务有关的机构或者组织;
-
二级域名:比如 baidu.com,就是二级域名,因为com是顶级域名,在前面再加一个 baidu 就是二级域名了呗。但是很多人会把这样的域名叫做一级域名,私认为可能是因为 com 太常见了所以直接忽略了。
-
三级域名:www.baidu.com,就是三级域名,baidu.com 是二级域名,前面加一个www,就是三级域名了,但是很多人会把这样的域名俗称为二级域名。
这里有人或许会疑惑,觉得 www 在这里应该不是表示三级域名,因为很多网站输入时都要加 www ,认为 www 是万维网的意思,每次输入网站都要加。其实加 www 本身就的画蛇添足,多此一举,即使不加 www,我们也能直接进入对应的网站,之所以以前很多网站会宣传在前面加 www,一方面是因为习惯,另外一方面是对李爵士发明的WWW的一种响应和致敬。
所以 baidu.com 和 www.baidu.com 并不是同一个域名!而它们的关系其实是父子关系,后者是前者的子域名。另外不能想当然的认为只要二级域名一样,前面加了 www 的网站肯定是同一家公司的,很多时候可能并非同一家公司运营的网站。

关于域名和IP的补充
-
负载均衡:一个域名对应多个IP
可能有的人用 ping 或 nslookup 获取到的百度IP地址和文中的不一样,是因为百度一个域名对应了多个地方的服务器的IP地址。很多公司会在不同的地方部署多个服务器,防止只有一台服务器,当访问人数过多的时候服务扛不住而狗带。比如一个公司在华中、华北、华南、华东各部署一台服务器,把四个服务器的IP地址都和同一个域名对应,那么你访问这个域名时,会让离你最近的服务器来接待你,这叫负载均衡,是一个常见的服务器优化策略。
-
共享主机:一个IP对应多个域名
一台服务器也是可以提供给多个人或机构一起使用的,有时可能好几个比较小型的网站,放在同一个服务器上,也就是输入不同的域名,但是最终指向的都是同一个IP地址。这样可以节省服务器成本,也是一种运营的策略,叫共享主机。
端口:
假如一家培训机构设有书法班和英语班,你想学书法那肯定得去书法班上课,想学英语那肯定得去英语班上课。这所培训机构里不同的班级提供不同的服务,把服务器比作培训机构的话,班级就是端口:不同的端口提供不同的服务,常见的http协议默认端口号是80,https协议默认端口号是443。
一台机器有65535个端口,可以提供不同的服务。那么我们怎么知道什么服务应该对应什么端口呢?
这里推荐在维基百科搜TCP/UDP端口列表:

其中0到1023端口都是规定好留给系统使用的,普通用户最好不要用。当然如果你是机器管理员,强行用也是可以的,但是不推荐。如果一个端口已经被占用了,那么想用的话只能去用别的端口了。
在实际使用中,我们往往是看不到端口的,因为很多服务的端口都是默认设定好的,我们不用刻意去看。比如我们访问百度时,实际使用的端口在地址栏上往往是看不到的:

不过我们可以这样验证一下,因为前面的协议写的是 HTTPS,可知用的是 443 端口:

当我们这样输入并按下回车后,会得到同样的结果,然后端口号会被浏览器自动的隐去。
路径
我们知道一个网站的域名了,进入后可以看到同一个网站的不同的页面,是通过什么实现的呢?其实是通过不同的路径来查看到不同的页面的。
比如我们在 MDN 上查看 HTML 和 CSS 文档时,路径就是不同的:


查询参数
同样是百度这个网站,我们输入不同的搜索词时,就会出现不同的页面内容,这是怎么实现的呢?其实是通过不同的查询参数来实现的:


这里 s 就是代表 search,搜索的意思,而 wd 代表 word,搜索词的意思,也就是查询参数。因为查询参数不同,所以同一个网站可以呈现不同的内容。
锚点
一个页面可能有很长的页面,很多的内容,那么怎么才能快速的找到一个特定内容的位置呢?很多网站都有这样一个功能,就是当你看到页面最底部时,点一个按钮可以直接回到最顶部。或者在查一个词条时,点一个关键词可以直接跳到该词所在的位置,然后查看详细内容。这些功能,就是通过锚点来完成的。


这里是同一个网站,同一个路径,但是 # 后的内容不同,就跳到了页面的不同位置,这就是锚点的作用。
补充:这里的锚点看起来是中文,但是实际上并不是中文,因为浏览器本身是不支持中文的,当我们把链接复制到TXT文本里,显示是这样的:

而且锚点是页面本身的一些行为,是不经过网络功能的,也就是说我们使用锚点时,锚点是并不经过服务器的。即使把锚点上传给服务器,服务器也不会对锚点有什么响应行为。
小结:
URL = 协议 + 域名/IP + 端口 + 路径 + 查询参数 + 锚点