此书主要是讲解了一条浏览器发送的请求到接受的过程经历的事情
首先当用户输入了类似 https://www.baidu.com
,按下回车,那这时候浏览器发生了什么?
我们都知道,按下后如果网络正常的情况下,出现的效果就是对应的网页页面,包括文字、图片等,都渲染到了浏览器页面上,
即我们能看到的整个页面都呈现了出来
在这个过程中,你与浏览器之间的主要交互就是你输入了https://www.baidu.com
这一串字母,对于人们来说,这个就是一个网址,或者可以称为URL
,这个网址对应的就是一个页面,按下回车后,其实就是告诉浏览器,我想要这个网址对应的内容,那么浏览器怎么知道这个网址对应的是哪个页面呢,这自然就有他一套解析的规则。
首先我们要知道,这个页面对应的是什么内容浏览器也不知道,他只能根据你的要求,去向Web服务器发送请求,而得到对应的内容,浏览器负责的就是替你转达要求(将你输入的网址,解析为例如给我index.html这一个文件储存的网页数据
),以及渲染对应的数据,发送消息则是由操作系统对应的部分来处理.
浏览器会先解析URL,URL可以分为协议类型://(user:password)@webServer/file(或dir)
,类似这样的形式
例如 https://www.abc.com/a.html 包含的信息就是,采取了HTTPS协议,Web服务器名称为www.abc.com,请求文件路径名为a.html
而有时候文件名是可以省略的,那就是会访问服务器上事先设置好的默认文件名
根据这个规则,浏览器完成了对URL的解析,接下来就需要进行下一步
http消息的格式如下:
shell// 请求消息 <方法><空格><URI><空格><HTTP版本> // 下面直到空行称为消息头 <字段名>:<字段值> ... ... <空行> <消息体> // 响应消息 <HTTP版本><空格><状态码><空格><响应短语> <字段名>:<字段值> ... ... <空行> <消息体>
HTTP状态码概要
状态码 | 含义 |
---|---|
1xx | 告知请求的处理进度和情况 |
2xx | 成功 |
3xx | 表示需要进一步操作 |
4xx | 客户端错误 |
5xx | 服务器错误 |
返回响应消息后,浏览器就会将数据提取出来并且显示在屏幕上,这就是我们看到的网页的样子,如果网页中还包括图片的话,浏览器还需要再次发送请求,获得对应的图片再次渲染到预留的空间中.
我们都知道,在网络中传递其实靠的都是ip地址去进行查询,在网络中,所有的设备都会被分配一个地址,相当于xx号xx室
,其中的号对应是子网,而室对应某个子网中的某台计算机,称为网络号和主机号
.,只有知道了IP地址才能找到对应的主机,判断出访问的服务器的位置
在发送的过程中,发送者送出的消息首先会经过子网中的集线器,转发到距离发送者最近的路由器上,经过多次重复最终将消息传到目的地
(TODO 怎么判断距离发送者最近的路由器)
实际的IP地址就是一段32比特的数字,即4个字节,8比特为一组划分
114.132.232.37
这就是一段ip地址
114.132.232.37/255.255.255.0
或114.132.232.37/24
,/
后面的称为子网掩码,24即前24位为1的子网掩码
ip中,前三段代表的是网络号,而最后一段代表的是主机号,当主机号为0时代表的是整个子网而不是单独某台计算机,当主机号为1时代表的是对整个子网进行广播
真实的网络号和主机号是将ip地址与子网掩码进行异或操作后得出的(有一个不为1则为0)
那这时候问题来了,浏览器怎么知道对应服务器的IP地址是多少?
前面解析URL的时候,浏览器得到一个WebServer-即www.baidu.com
,这个又称为域名,这时候我们就需要将它转化为我们要的ip地址.
或者有人会觉得为什么不用某个域名来代表某台主机,毕竟一个域名对应也是一个ip,何必需要加上转换这一步呢?
从运行效率上来考虑,这不是一个好主意,IP地址32比特,即4字节,换成名称的话,最短都需要几十个字节了,处理起来就麻烦了不少,增加了路由器的负担,花费更多的时间来进行数据传输,而且不定长度的名称,可能会使得处理起来更不方便
但是IP让人来记忆似乎也十分麻烦,那么最终人们采取的方案就是让人来使用名称,路由器使用IP地址,在提供对应的转换服务,这个机制称为DNS
查询DNS很简单,计算机上有对应的DNS客户端-称为DNS解析器,或者简称解析器
,通过DNS查询IP地址称为域名解析
解析器其实就是一段程序,这时可以采用Socket库的方法直接调用对应程序即可,这时解析器会生成要发送给DNS服务器的查询信息,生成一条消息,发送给DNS服务器,而发送消息这个过程与浏览器一样,不是由解析器本身来操作,而是委托给了操作系统内部的协议栈执行,协议栈执行发送消息操作,然后通过网卡将消息发送给DNS服务器
如果被访问的服务器在DNS上注册则能找到该记录,将其IP地址写回响应信息返回给客户端
那DNS服务器的地址在哪里知道?
向DNS服务器发送消息时,当然也需要知道对应服务器的IP地址,不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的
一般来自客户端的查询消息包括三个信息:
域名
Class
在最早涉及的时候,DNS考虑到在互联网以外的应用,设置来识别网络的信息,不过如今基本只有互联网了,所以一般是代表互联网的IN
记录类型
当类型为A时,表示对应的是IP地址,类型为MX时,对应的是邮件服务器,对于不同记录类型,服务器向客户端返回的信息也不同
DNS服务器接受到记录类型为A的消息后,会从域名与IP地址的对照表中查找相应的记录,并返回IP地址
由于互联网中服务器数量庞大,不可能全部存于一台DNS服务器当中,那又应该如何解决?
那肯定是需要多台服务器互相协作,这时还记得类似www.baidu.com
的域名中的.
符号,这个就是将域名进行分割的,每一部分称为域,层级从右边往左边递减,每个域在DNS服务器中都是作为一个整体来处理的,一个域的信息都是作为一个整体存放到DNS服务器中.
从上往下数的话,其实最顶层应该是根域,之后com,jp
等顶级域是在根域之下一级,根域保存着com等顶级域名的服务器的信息,所以可以从根域开始一路往下找到任意一个域的DNS服务器
且根域的DNS服务器信息保存在互联网中所有的DNS服务器当中,即每个服务器都可以找到并访问所有的DNS服务器了
本文作者:Malyue
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!