《网络是怎样连接的》笔记整理

最近再很多方面都会遇到一些像代理,网关,IPV4这类的和网络有关的名词,但是都不知道是什么意思,于是就有了这一篇博客,主要用来记录学习《网络是怎样连接的》一书的一些知识点,非常适合网络入门的小白们看,可以了解其中的一些基本知识,至少不会像我之前一样茫然
(后续会继续更新其中的内容,以及添加标红和增加一些扩展知识和超链接)

1.1 生成 HTTP 请求消息

1.1.1 探索之旅从输入网址开始

首先我们要知道我们在浏览器中输入的网址,准确来说叫URL,除了常见的HTTP(Hypertext Transfer Protocol)之外,下面还举例了其他协议的URL:

  1. HTTPS(Hypertext Transfer Protocol Secure):用于安全地传输数据的HTTP协议版本。
  2. FTP(File Transfer Protocol):用于文件传输的协议,常用于上传和下载文件。
  3. SMTP(Simple Mail Transfer Protocol):用于发送电子邮件的协议。
  4. POP(Post Office Protocol):用于接收电子邮件的协议。
  5. IMAP(Internet Message Access Protocol):也用于接收电子邮件的协议,与POP不同的是,IMAP允许用户在服务器上保留电子邮件的副本。
  6. Telnet(Terminal Network):一种远程登录协议,可用于在计算机间远程控制和传输数据。
  7. SSH(Secure Shell):一种安全的远程登录协议,可用于在计算机间远程控制和传输数据。

值得一提的是,浏览器并不只有访问Web服务器这一个功能,它不仅可以用在FTP服务器上下载和上传文件,同时也具备电子邮件客户端的功能,可以说浏览器是一个具备多种客户端功能的综合性客户端软件,而他需要一些东西来判断应该使用其中那种功能来访问相应的数据,而这些不同的的URL和协议允许用户通过不同的方式和方式访问互联网上的资源。
URL的结构

1.1.2 浏览器先要解析URL

浏览器要做的第一步是对URL进行解析,从而生成发送给Web服务器的请求消息,以下面访问Web服务器的情况为例,他会先将其中的各个元素拆分出来,通过拆分出来的元素就可以明白URL代表的含义
Web浏览器解析URL的过程
因此我们就能够明白,图 中的 URL 表示要访问 www.lab.glasscom.com 这个 Web 服务器上路径名为 /dir/file1.html 的文件,也就是位于 /dir/ 目录 D 下的 file1.html 这个文件
在这里插入图片描述

1.1.3 省略文件名的情况

有时候我们会见到一些不太一样的URL,接下来是一些常见的例子

  1. http://www.lab.glasscom.com/dir/

以“/”结尾代表 /dir/ 后面本来应该有的文件名被
省略

其实,我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根
据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名

  1. http://www.lab.glasscom.com/

与上一条是类似的,也是省略了后面的文件名,会默认访问服务器设置好的文件

  1. http://www.lab.glasscom.com

这次连结尾的“/”都省略了。即使像这样连目录名都省略的写法也是允许的。为了防止发生混乱,当没有路径名时,就代表访问根目录下事先设置的默认文件 A,也就是 /index.html 或者 /default.htm 这些文件

  1. http://www.lab.glasscom.com/whatisthis

这个会比较特殊一点:我们不应该总是将 whatisthis 作为文件名来处理。一般来说,这种情况会按照下面的惯例进行处理:如果Web 服务器上存在名为 whatisthis 的文件,则将 whatisthis 作为文件名来处理;如果存在名为 whatisthis 的目录,则将 whatisthis 作为目录名来处理

无法创建两个名字相同的文件和目录,所以不用担心会产生歧义

1.1.4 HTTP的基本思路

首先要用一个简单的例子来说明HTTP协议是怎么回事:
HTTP的基本思路就是浏览器(客户端)向Web服务器发送请求,Web服务器将请求的资源作为HTTP响应发送回浏览器。这个过程可以类比于用户在商店里购物的过程:

  1. 用户进入商店:类比为浏览器连接到Web服务器
  2. 用户挑选商品并提供订单:类比为浏览器发送HTTP请求,请求包括要访问的资源和其他信息
  3. 商店收到订单并处理:类比为Web服务器处理HTTP请求
  4. 商店把商品打包并交给用户:类比为Web服务器将请求的资源作为HTTP响应发送回浏览器,响应包括响应状态码、响应头、响应正文等

这个请求的消息中包含两部分内容”对什么“和”进行怎样的操作“,其中”对什么“称之为URL,而”进行怎样的操作“我们称之为方法,下面的表列出了主要的方法,大家可以通过它理解通过方法可以执行怎样的操作
HTTP的主要方法
后续的操作就很简单了,Web服务器在收到HTTP请求消息后,会解析其中的内容,包括URI和方法,以判断请求要访问什么,执行怎样的操作。服务器将执行结果存放在响应消息中,响应消息包括状态码、头字段和网页数据,表示操作的成功或错误。客户端接收响应消息后,浏览器从中读取所需的数据并在屏幕上显示。

遇到找不到的文件就会显示 404 Not Found啦

以上的方法常用的是GET 和 POST 方法,有了这两个方法,我们就能从 Web 服务器中获取网页数据,以及将网页输入框中的信息发送给 Web 服务器,其实HTTP协议还蕴藏着很多的可能性,在这边不再赘述

1.1.5 生成HTTP请求消息

对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。实际上,HTTP 消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息

方法有很多种,那我们该选用哪一种呢,其实这取决与浏览器的工作状态,浏览器的工作不止存在于你在顶部的地址栏中输入网址后,也存在于你点击了网页中的超级链接等等,而具体使用哪种方法也是根据场景来确定的

具体格式如下图所示:
HTTP消息的格式
这里还可以补充一些表单中对方法的区分,但笔者觉之有些复杂,未来再补充上来

1.1.6 发送请求后会收到响应

当我们将上述请求消息发送出去之后,Web 服务器会返回响应消息,响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行上。在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。
简单来说:状态码是给程序看的,而响应短语是给人看的。

  • 状态码是用来表示请求执行结果的数字代码,例如200表示成功,404表示未找到资源,500表示服务器内部错误等。这些状态码可以让程序自动识别执行结果,从而做出相应的处理
  • 相对地,响应短语是一段文字,它描述了请求执行的结果,例如"OK"表示成功,"Not Found"表示未找到资源,"Internal Server Error"表示服务器内部错误等。响应短语的目的是向人们提供易于理解的信息,以帮助他们理解请求的执行结果

HTTP 状态码概要

每条请i去消息只能写1 个 URI,所以每次只能获取 1 个文件,如果需要获取多个文件,必须对每个文件单独发送 1 条请求。比如 1 个网页中包含 3 张图片,那么获取网页加上获取图片,一共需要向 Web 服务器发送 4 条请求

Web服务器不会关心这 4 条请求获取的文件到底是 1 个网页上的还是不同网页上的,它的任务就是对每一条单独的请求返回 1 条响应而已

1.1.7 完整过程图示

接下来将展示浏览器与 Web 服务器之间交互消息的一个实例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 向 DNS 服务器查询 Web 服务器的 IP 地址

1.2.1 IP地址的基本知识

浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的 IP 地址,所以我们先来介绍一下什么是IP地址

TCP/IP是互联网和公司内部局域网所采用的网络结构。这个网络由多个小的子网通过路由器连接起来,形成一个大的网络。每个设备都有一个唯一的IP地址,类似于现实中的地址。通过IP地址,我们可以判断出访问对象服务器的位置,并将消息发送到服务器。消息传送的过程是通过路由器将消息从一个子网转发到另一个子网,直到消息最终到达目的地。(也可以简单理解为你需要填写具体的门牌号,快递才能正确的送到你的手上)
在这里插入图片描述

网络号用于标识一台主机所在的网络,而主机号则用于标识该网络中的一台具体主机

了解完TCP/IP 中 IP 地址的基本思路之后,让我们再来看一下实际的 IP 地址
如图 1.9 所示,实际的 IP 地址是一串32 比特的数字,按照 8 比特(1 字节)为一组分成 4 组,分别用十进制表示然后再用圆点隔开。这就是我们平常经常见到的 IP 地址格式,但仅凭这一串数字我们无法区分哪部分是网络号,哪部分是主机号。在 IP 地址的规则中,网络号和主机号连起来总共是 32 比特,但这两部分的具体结构是不固定的。在组建网络时,用户可以自行决定它们之间的分配关系,比如:

假设有一个网络管理员想要将一个网络划分为多个子网,并为每个子网分配一个唯一的网络号。他可以选择将 IP 地址的前几个比特用于网络号,然后使用剩余的比特作为主机号。例如,他可以将前 8 个比特分配给网络号,然后使用剩余的 24 个比特作为主机号。这意味着网络可以支持最多 2^8个子网,每个子网可以支持最多 2^24 个主机。

另一个网络管理员可能想要将 IP 地址的前三个字节用于网络号,然后使用最后一个字节作为主机号。这样做可以为大型网络提供更多的 IP 地址。例如,这种分配方案可以支持最多 2^24 个网络,每个网络可以支持最多 256 个主机。

这些只是两个例子,网络管理员可以根据网络的需求和规模决定网络号和主机号之间的分配关系。因此,我们还需要另外的附加信息来表示 IP 地址的内部结构
在这里插入图片描述
这一附加消息称为子网掩码,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示机号
对于IP地址 10.11.12.13/24,/24 表示网络地址的位数是 24 位,也就是前3个字节为网络号,后1个字节为主机号。将前3个字节转换为二进制,得到 00001010.00001011.00001100,然后在最后一个字节中,24位以前全部置为1,24位以后全部置为0,得到子网掩码为 11111111.11111111.11111111.00000000,转换为十进制为 255.255.255.0
这几种只是在写法上有区别,含义是完全一样的
在这里插入图片描述

IP地址的主机号

全 0:表示整个子网
全 1:表示向子网上所有设备发送包,即”广播“

1.2.2 域名和IP地址共用的理由

TCP/IP 网络是通过 IP 地址来确定通信对象的,因此不知道 IP 地址就无法将消息发送给对方,但是就像你很难记住电话号码一样,要记住一长串数字组成的IP地址也很困难,那为什么不干脆直接用名称来确定通信对象呢,在技术层面上来说是可以做到的,但是IP 地址的长度
为 32 比特,也就是 4 字节,相对地,域名最短也要几十个字节,最长甚至可以达到 255 字节。换句话说,使用 IP 地址只需要处理 4 字节的数字,而域名则需要处理几十个到 255 个字节的字符,这增加了路由器的负担,传送数据也会花费更长的时间,所以这不是一个合适的设计

于是这时候就产生了一种方案,让人来使用名称,让路由器来使用 IP 地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS

1.2.3 Socket 库提供查询IP地址的功能

查询IP地址的方法很简单,只要询问最近的 DNS 服务器某某网址的IP地址是什么,它再告诉你就可以了,那么浏览器是如何向 DNS 服务器发出查询的呢?
对于 DNS 服务器,我们的计算机上一定有相应的 DNS 客户端,而相当于 DNS 客户端的部分称为 DNS 解析器,或者简称解析器。通过 DNS 查询 IP 地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。
解析器实际上是一段程序,它包含在操作系统的 Socket 库中,库就是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件。
库有很多好处:

  1. 使用现成的组件搭建应用程序可以节省编程工作量
  2. 使用相同的组件可以实现程序的标准化

Socket 库是用于调用网络功能的程序组件集合

1.2.4 通过解析器向 DNS 服务器发出查询

解析器的用法非常简单。Socket 库中的程序都是标准组件,只要从应用程序中进行调用就可以了
在这里插入图片描述
调用解析器后,解析器会向 DNS 服务器发送查询消息,然后 DNS 服务器会返回响应消息。响应消息中包含查询到的 IP 地址,解析器会取出 IP地址,并将其写入浏览器指定的内存地址中。接下来,浏览器在向 Web 服务器发送消息时,只要从该内存地址取出 IP 地址,并将它与 HTTP 请求消息一起交给操作系统就可以了

根据域名查询 IP 地址时,浏览器会使用 Socket 库中的解析器

1.2.5 解析器的内部原理

网络应用程序(在我们的场景中就是指浏览器)调用解析器时,程序的控制流程就会转移到解析器的内部。

当控制流程转移到解析器后,解析器会生成要发送给 DNS 服务器的查询消息。这个过程与浏览器生成要发送给 Web 服务器的 HTTP 请求消息的过程类似,解析器会根据 DNS 的规格,生成一条表示“请告诉我 www.lab.glasscom.com 的 IP 地址”的数据,并将它发送给 DNS 服务器。发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈来执行。这是因为和浏览器一样,解析器本身也不具备使用网络收发数据的功能。解析器调用协议栈后,控制流程会再次转移,协议栈会执行发送消息的操作,然后通过网卡将消息发送给DNS 服务器

协议栈:操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP 驱动”等

在这里插入图片描述
顺带一提,向 DNS 服务器发送消息时,我们当然也需要知道 DNS 服务器的 IP 地址。只不过这个 IP 地址是作为 TCP/IP 的一个设置项目事先设置好的,不需要再去查询了
在这里插入图片描述

1.3 全世界 DNS 服务器的大接力

1.3.1 DNS 服务器的基本工作

DNS 服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应
来自客户端的查询消息包含以下 3 种信息

  1. 域名
    服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称
  2. Class
    在 DNS 的早期设计中,DNS 被设计为可以在不同的网络上运行,这些网络可能有不同的命名约定和协议。为了区分这些网络,DNS 引入了 Class 字段。Class 字段定义了一个资源记录的范围,即它所适用的网络类型或区域。原本的 DNS 协议中定义了三种 Class:IN(Internet)、CS(CSNET)和CH(CHAOS)。
    然而,随着互联网的普及,IN Class 成为了唯一广泛使用的 Class 类型。因此,现代 DNS 协议通常忽略 Class 字段,将其设置为默认的 IN 类型。因此,当我们在 DNS 查询中没有指定 Class 时,通常默认为 IN 类型。
  3. 记录类型
    表示域名对应何种类型的记录。例如,当类型为 A 时,表示域名对应的是 IP 地址;当类型为 MX 时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同

在这里插入图片描述

DNS 服务器会从域名与 IP 地址的对照表中查找相应的记录,并返回 IP 地址

1.3.2 域名的层次结构

因为互联网中的服务器数量太多,不可能全部保存在一台DNS服务器中,所以我们将信息分布保存在多台 DNS 服务器中,这些 DNS 服务器相互接力配合,从而查找出要查询的信息

DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的,域名使用句点来分隔的,在域名中,越靠右的位置表示其层级越高,每个域的信息都存放在相应层级的 DNS 服务器中。一个域是不可分割的,但可以在其下创建下级域来分配给不同的组织使用,实现域名的分层管理

比如 www.nikkeibp.co.jp 这个域名,最上层的 jp 代表分配给日本这个国家的域;下一层的 co 是日本国内进行分类的域,代表公司;再下层的 nikkeibp 就是分配给某个公司的域;最下层的 www 就是服务器的名称

1.3.3 寻找相应的DNS服务器并获取 IP 地址

这部分主要是介绍如何通过 DNS 找到目标服务器的 IP 地址。首先,我们需要知道负责管理目标域名的 DNS 服务器的 IP 地址。由于互联网中有数万台 DNS 服务器,不能一台一台地查找,因此可以采用逐级注册的方式。即,将下级域的 DNS 服务器的 IP 地址注册到上级 DNS 服务器中,上级 DNS 服务器的 IP 地址再注册到更上一级的 DNS 服务器中,以此类推。这样,就可以通过上级 DNS 服务器查询出下级 DNS 服务器的 IP 地址,并向其发送查询请求。

在互联网中,顶级域并非最顶层,还有一级域,称为根域。根域不像 com、jp 那样有自己的名字,因此在一般书写域名时经常被省略。但根域的 DNS 服务器中保管着 com、jp 等的 DNS 服务器的信息。因此,从根域开始,我们可以顺藤摸瓜找到任意一个域的 DNS 服务器。

为了让任何 DNS 服务器都可以找到并访问根域 DNS 服务器,根域的 DNS 服务器信息需要保存在互联网中所有的 DNS 服务器中。这样一来,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。分配给根域 DNS 服务器的 IP 地址在全世界仅有 13 个,而且这些地址几乎不发生变化,因此将这些地址保存在所有的 DNS 服务器中也不难。
在这里插入图片描述

1.3.4 通过缓存加快 DNS 服务器的响应

实际上,DNS 在真实互联网中的工作方式有以下特点:

  1. 一台 DNS 服务器可以管理多个域的信息,上级域和下级域有可能共享同一台 DNS 服务器
  2. DNS 服务器有一个缓存功能,可以记住之前查询过的域名和相关信息,缓存可以减少查询所需的时间
  3. 缓存中的信息都设置有一个有效期,超过有效期后,数据就会从缓存中删除
  4. DNS 服务器在对查询进行响应时会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的 DNS 服务器

缓存:指的是将使用过的数据存放在离使用该数据的地方较近的高速存储装置中,以便提高后续访问速度的技术。这一技术有很多应用,如 CPU和内存之间的缓存、磁盘和内存之间的缓存等,在网络中缓存也是一种用来提高访问速度的普遍性技术

1.4 委托协议栈发送消息

1.4.1 数据收发操作概览

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值