《网络是怎样连接的》第一章:浏览器生成消息
概述:这本书以 “从在浏览器输入网址,到屏幕显示出网页,当中到底发生了什么?”为疑问,探究其中的过程。本章讲的是浏览器怎么把请求消息委托给网络控制软件发送出去。
引言:在“第一章第一节:浏览器生成消息”中,我们知道:若想要从目标Web服务器获取网页数据,就得委托操作系统往该服务器发送请求消息,告诉这个服务器“我想要从你这里获取到某个文件的数据”,Web服务器如果接收到这个请求,就会返回响应消息给客户端的浏览器。但是生成HTTP请求消息后,我们却面临着一个问题:操作系统并不知道那个目标Web服务器是哪个IP地址。不知道服务器是哪个IP地址,就不知道向哪里发送请求消息。这就好比我们签收快递,不知道收货地址,快递员怎么可能送货上门呢?所以浏览器必须先查出Web服务器的IP地址,才能委托操作系统发送请求消息。
以百度网址为例,百度首页的网址为https://www.baidu.com/,如果我们在浏览器输入这串网址并回车,就会跳转到百度的首页。但是通过引言我们知道:只有知道百度的Web服务器的IP地址,浏览器才能委托操作系统向百度的服务器发送请求消息。可是我们输入的网址中,只有百度的服务器域名www.baidu.com,并没有IP地址啊,那么浏览器是怎么找到百度的服务器的?那是因为浏览器在生成HTTP请求消息后,在委托操作系统发送消息时,必须提供的不是通信对象的域名,而是它的IP地址,所以我们需要根据百度的域名查询百度的IP地址。
第一章第二节.向DNS服务器查询Web服务器的IP地址
1.IP地址的基础知识
1.1.子网是什么?网络是什么?
“子网”可以理解成用集线器连接起来的几台计算机,可以把这些设备的集合视为一个整体单位。再把若干个子网通过路由器连接起来,就形成了一个网络。而TCP/IP的结构如下图所示,就是由一些小的子网,通过路由器连接起来组成的一个大的网络。
tips:路由器和集线器都是对网络数据包进行转发的物理设备。可以理解为计算机之间进行连接的物理媒介。
1.2.什么是IP地址?
在这个大的网络中,为了方便辨认,所有的设备都会被分配一个数字虚拟地址。这个地址就相当于某条路上的xx号xx室,“号”是分配给整个子网的,“室”是分配给子网里的计算机的,这就是网络中的地址。“号”对应的好吗称“网络号”,“室”对应的号码称“主机号”,地址的整体称为IP地址,知道呢确定的IP地址,浏览器才能准确寻找到想访问的服务器。(如同人只有知道准确的地址才能到达目的地)
tips:
- IP地址是不能被一台以上的设备共用的,只能一个地址配一个设备。
- IP地址的表示:是一串32bit的数字(IPV4)(百度的IP地址是201.108.22.5)
2.域名和IP地址共用的理由
2.1.域名和IP地址,用哪个访问服务器更好?
之前我们学过,输入www.baidu.com就能进入百度的首页,输入百度的IP地址也能进入百度的首页。那么两者相比,明显是域名www.baidu.com更容易让人记住(www和com都是固定好的,baidu是百度的拼音),因为IP地址是一长串冗长的数字,且光从这串数字中看不出它和我们想访问的服务器有什么明显关联,比较难记,就算记住了也很容易忘记。并且我们日常生活中要访问的网站很多,难道我们每一个网站的IP地址都要记住?这明显行不通。
例如:给你一串数字202.108.22.103,你可能看不出这是什么,但是给你看www.baidu.com,你很快会反应过来这是百度的网址。
2.2.什么是DNS服务器,什么是DNS机制?
当我们输入www.baidu.com时,系统会查找本机中是否有记录与www.baidu.com相关联的IP地址,如果找到,电脑会去访问这个IP地址,而不是www.baidu.com这个域名。
域名 | IP地址 |
---|---|
百度(www.baidu.com) | 202.108.22.5 |
哔哩哔哩(www.bilibili.com) | 120.131.2.207 |
知乎(www.zhihu.com) | 106.117.249.48 |
腾讯(www.tencent.com) | 123.151.137.18 |
假设本机只存储了上表这些域名和IP地址。如果我们想访问淘宝的网站,一般情况下只需在浏览器输入www.taobao.com并回车就好了,电脑会搜索本机是否记录有和www.taobao.com相关联的IP地址。但是上表没有记录淘宝的服务器域名,那岂不是无法访问到淘宝的服务器?这时,我们可以寻求DNS服务器的帮助。
DNS服务器:DNS全称为Domain Name System ,中文名叫“域名服务系统”,而DNS服务器是一种专门用于记录这个世界绝大多数域名和IP地址之间关联的服务器。
当你需要访问某个网站的时候,先让你的电脑去这个DNS服务器上查一下目标网站的域名所对应的IP地址是什么,查到之后再由DNS服务器把这个IP地址传给电脑,于是你的电脑就可以通过这个IP地址去访问你要访问的网站了。
而浏览器向DNS服务器查询IP地址的过程叫“域名解析”。有了DNS服务器,我们大部分情况下想访问某个网站,就只需要记住网站服务器的域名,而不是冗长的IP地址。(至于电脑怎么知道具体要访问哪一台DNS服务器,这里先不讲)。
3.Socket库提供查询IP地址的功能
上文讲到,我们再浏览器输入网站的服务器域名,浏览器在本身找不到与该域名相关联的IP地址下,需要向DNS服务器询问与该域名相关联的IP地址。本小节我们探索一下浏览器是怎么向DNS服务器发出查询的。
我们知道,如果客户端要访问Web服务器,则需要给服务器发送请求消息,服务器收到后返回响应消息。那么我们要向DNS服务器查询IP地址(向DNS服务器发送请求消息),那本机就一定需要有相应的DNS客户端。而相当于DNS客户端的部分称为DNS解析器或解析器,专门负责执行域名解析。
解析器并非是物理设备,而是一段程序,包含在操作系统的Socket库中。
3.1.什么是库?什么是Socket库?
- 库就是一些程序的集合,其他的应用程序都需要调用库中的某个程序去参与工作。
- Socket库也是一种库,其中的程序都是用C语言编写的。其他的应用程序可以调用Socket库中的程序去使用操作系统的网络功能。而解析器就是Socket库中的其中一个程序。
4.通过解析器向DNS服务器发出查询
下图是解析器的工作流程(只是个大概的流程,具体的流程和图中有所出入)
5.解析器的内部原理(解析器是怎么工作的?)
浏览器调用Socket库中的解析器——解析器开始运行,生成要发送给DNS服务器的查询消息(生成查询消息的过程和生成HTTP请求消息的过程类似)——把查询消息交给操作系统的协议栈发送出去——DNS服务器收到查询消息,根据消息对内部进行查询——如果找到IP地址,DNS服务器会把它写入响应消息返回给查询消息的发送方——发送查询消息的客户端收到响应,响应消息经过操作系统的协议栈传给解析器——解析器从响应消息中读出IP地址,并写入浏览器指定的内存地址——然后浏览器从内存中读出IP地址
课后思考:用学到的知识(第一小节和第二小节)尽量把“从输入网址到显示网页”的流程给过一遍。