读书笔记
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读书笔记相关的知识,希望对你有一定的参考价值。
《网络是怎样连接的》第 1 章介绍了从浏览器生成 HTTP 请求消息、到委托操作系统的协议栈发送消息的全过程,是一次整体的概览,对之后的几章内容奠定了基础。第 2、第 3 章分别着重于协议栈内部的实现机理和网络硬件设备。
本章的流程:使用 URL(或服务器名) 向 DNS 查询服务器的 IP 地址(第 1 节、第 3 节) --> 浏览器生成 HTTP 消息(第 2 节,请求消息) --> 委托 OS 向服务器发送 HTTP 消息(第 4 节) --> 委托 OS 从服务器接收 HTTP 消息(第 2 节,响应消息)
文章目录
1 统一资源定位符—— URL
-
URL:Uniform Resource Locator,统一资源定位符。
-
URL 开头的文字, 即“http:”“ftp:”“file:”“mailto:” 这部分文字都表示浏览器应当使用的访问方法。比如当访问 Web 服务器时应该使用 HTTP 协议, 而访问 FTP 服务器时则应该使用 FTP 协议。因此,我们可以把这部分理解为访问时使用的协议类型。
-
URL 的元素:
http://Web服务器名 (/目录名/…/文件名) 数据源(文件)的路径名可省略
- 省略文件名:在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名。因此,像这样省略文件名时,服务器就会访问 /dir/index.html 或者 /dir/default.htm。
http://www.lab.glasscom.com/
2 消息的格式—— HTTP 协议
2.1 URI 和方法
-
“对什么”(Uniform Resource Identifier,统一资源标识符):URI 的内容是一个存放网页数据的文件名或者是一个 CGI 程序的文件名,例如“/dir1/file1.html”“/dir1/program1.cgi” 等。不过,URI 不仅限于此,也可以直接使用“http:”开头的 URL 来作为 URI。
-
对 Web 服务器程序调用其他程序的规则所做的定义就是 CGI,而按照 CGI 规范来工作的程序就称为 CGI 程序。
-
“进行操作”(方法):表示需要让Web 服务器完成怎样的工作。以下为常用方法:
- GET 方法:当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。
- POST 方法:在表单(网页中的文本框、复选框等能够输入数据的部分)中填写数据并将其发送给 Web 服务器时就会使用这个方法。使用 POST 方法时, URI 会指向 Web 服务器中运行的一个应用程序的文件名。
2.2 请求消息
-
请求消息的第一行称为请求行。这里的重点是最开头的方法,方法可以告诉 Web 服务器它应该进行怎样的操作。
-
写好方法之后,加一个空格,然后写 URI。URI 部分的格式如下:
/< 目录名 >/…/< 文件名 >
-
第一行的末尾需要写上 HTTP 的版本号,这是为了表示该消息是基于哪个版本的 HTTP 规格编写的。
-
第二行开始为消息头。消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。消息头中的内容随着浏览器类型、版本号、设置等的不同而不同,大多数情况下消息头的长度为几行到十几行不等。
-
写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需要发送的数据。这一部分称为消息体,也就是消息的主体。
2.3 响应消息
-
在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。状态码是一个数字,它主要用来向程序告知执行的结果(状态码的第一位数字表示状态类型,第二、三位数字表示具体的情况);相对地,响应短语则是一段文字,用来向人们告知执行的结果。
-
由于每条请求消息中只能写 1 个 URI, 所以每次只能获取 1 个文件,如果需要获取多个文件,必须对每个文件单独发送 1 条请求。 如下所示:
3 查询服务器的 IP 地址—— DNS 服务器
3.1 IP 地址
-
用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网(凡是通过集线器连接起来的所有设备都属于同一个子网)。将子网通过路由器连接起来,就形成了一个网络(一些家用路由器中已经内置了集线器功能)。
-
“号” 对应的号码称为网络号,“室” 对应的号码称为主机号,这个地址的整体称为 IP 地址。
-
在 IP 地址的规则中, 网络号和主机号连起来总共是 32 比特, 但这两部分的具体结构是不固定的,因此还需要另外的附加信息来表示 IP 地址的内部结构。这一附加信息称为子网掩码,其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。我们也可以把 1 的部分的比特数用十进制表示并写在 IP 地址的右侧。
3.2 解析器和 DNS 服务器的交互
-
DNS: Domain Name System,域名服务系统。将服务器名称和 IP 地址进行关联是 DNS 最常见的用法,但 DNS 的功能并不仅限于此,它还可以将邮件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。
-
相当于 DNS 客户端的部分称为 DNS 解析器,或者简称解析器。通过 DNS 查询 IP 地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver) 了。
-
Socket 库也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能,而解析器就是这个库中的其中一种程序组件。
-
应用程序调用解析器后发生了什么:
-
向 DNS 服务器发送消息时,我们当然也需要知道 DNS 服务器的 IP 地址。只不过这个 IP 地址是作为 TCP/IP 的一个设置项目事先设置好的,不需要再去查询了。
3.3 DNS 服务器存储的内容
-
域名:服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称。
-
Class: Class 的值永远是代表互联网的 IN。
-
记录类型:表示域名对应何种类型的记录。例如,当类型为 A 时,表示域名对应的是 IP 地址;当类型为 MX 时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同。
3.4 通过 DNS 服务器查询 IP 地址
查询过程如下图:
注意:
-
客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。分配给根域 DNS 服务器的 IP 地址在全世界仅有 13 个,而且这些地址几乎不发生变化。
-
现实中上级域和下级域有可能共享同一台 DNS 服务器。在这种情况下,访问上级 DNS 服务器时就可以向下跳过一级 DNS 服务器, 直接返回再下一级 DNS 服务器的相关信息。
-
DNS 服务器有一个缓存功能,可以记住之前查询过的域名。并且,当要查询的域名不存在时,“不存在” 这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。
-
DNS 服务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除。而且,在对查询进行响应时,DNS 服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的 DNS 服务器。
4 向服务器发送 HTTP 消息——协议栈
知道了 IP 地址之后,就可以委托操作系统内部的协议栈向这个目标 IP 地址,也就是我们要访问的 Web 服务器发送消息了。
客户端使用 Socket 库来收发数据的操作过程下图所示:
- 创建套接字(创建套接字阶段)
- 将管道连接到服务器端的套接字上(连接阶段)
- 收发数据(通信阶段)
- 断开管道并删除套接字(断开阶段)
4.1 创建套接字阶段
-
在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。服务器程序一般会在启动后就创建好套接字并等待客户端连接管道。客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。
-
客户端创建套接字的操作需调用 Socket 库中的 socket 程序组件。只不过,socket 的内部操作并不像解析器那样简单。
-
同一台计算机上可能同时存在多个套接字,在这样的情况下,我们就需要一种方法来识别出某个特定的套接字,这种方法就是描述符。
-
描述符是和委托创建套接字的应用程序进行交互时使用的,并不是用来告诉网络连接的另一方的,因此另一方并不知道这个描述符。同样地,客户端也无法知道服务器上的描述符。
4.2 连接阶段
应用程序通过调用 Socket 库中的名为 connect 的程序组件来完成这一操作,需要三个参数:
-
第 1 个参数,即描述符,就是在创建套接字的时候由协议栈返回的那个描述符。
-
第 2 个参数,即服务器 IP 地址,就是通过 DNS 服务器查询得到的我们要访问的服务器的 IP 地址。
-
第 3 个参数,即端口号。如果说描述符是用来在一台计算机(或应用程序)内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制。比如 Web 是 80 号端口, 电子邮件是 25 号端口。
4.3 通信阶段
-
只要将数据送入套接字,数据就会被发送到对方的套接字中。当调用 write 时,需要指定描述符和发送数据,然后协议栈就会将数据发送到服务器。
-
当消息返回后,需要执行的是接收消息的操作。接收消息的操作是通过 Socket 库中的 read 程序组件委托协议栈来完成的,它将接收到的响应消息存放到接收缓冲区中。
4.4 断开阶段
-
Web 使用的 HTTP 协议规定,当 Web 服务器发送完响应消息之后,应该主动执行断开操作, 因此 Web 服务器会首先调用 close 来断开连接。断开操作传达到客户端之后,客户端的套接字也会进入断开阶段。
-
接下来,当浏览器调用 read 执行接收数据操作时,read 会告知浏览器收发数据操作已结束,连接已经断开。浏览器得知后,也会调用 close 进入断开阶段。
-
重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在一次连接中收发多个请求和响应的方法。因此,在 HTTP 版本 1.1 中,当所有数据都请求完成后,浏览器会主动触发断开连接的操作。
以上是关于读书笔记的主要内容,如果未能解决你的问题,请参考以下文章
读书笔记|《程序员的自我修养》- 04 可执行文件的装载与进程