2023-03-15
计算机网络
00
请注意,本文编写于 679 天前,最后修改于 679 天前,其中某些信息可能已经过时。

目录

网络的连接过程

此书主要是讲解了一条浏览器发送的请求到接受的过程经历的事情

浏览器生成消息

解析URL

​ 首先当用户输入了类似 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请求消息

​ http消息的格式如下:

shell
// 请求消息
<方法><空格><URI><空格><HTTP版本>
// 下面直到空行称为消息头
<字段名>:<字段值>
...
...
<空行>
<消息体>

// 响应消息
<HTTP版本><空格><状态码><空格><响应短语>
<字段名>:<字段值>
...
...
<空行>
<消息体>

HTTP状态码概要

状态码含义
1xx告知请求的处理进度和情况
2xx成功
3xx表示需要进一步操作
4xx客户端错误
5xx服务器错误

返回响应消息后,浏览器就会将数据提取出来并且显示在屏幕上,这就是我们看到的网页的样子,如果网页中还包括图片的话,浏览器还需要再次发送请求,获得对应的图片再次渲染到预留的空间中.

DNS服务器解析Web服务器的IP地址

我们都知道,在网络中传递其实靠的都是ip地址去进行查询,在网络中,所有的设备都会被分配一个地址,相当于xx号xx室,其中的号对应是子网,而室对应某个子网中的某台计算机,称为网络号和主机号.,只有知道了IP地址才能找到对应的主机,判断出访问的服务器的位置

在发送的过程中,发送者送出的消息首先会经过子网中的集线器,转发到距离发送者最近的路由器上,经过多次重复最终将消息传到目的地

(TODO 怎么判断距离发送者最近的路由器)

认识IP

实际的IP地址就是一段32比特的数字,即4个字节,8比特为一组划分

114.132.232.37这就是一段ip地址

114.132.232.37/255.255.255.0114.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的一个设置项目事先设置好的

DNS介绍

一般来自客户端的查询消息包括三个信息:

  • 域名

  • 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 许可协议。转载请注明出处!