网络是怎么样连接的笔记摘抄

 

第一章浏览器生成消息

浏览器的第一步工作就是对 URL 进行解析,如下图:网络是怎么样连接的笔记摘抄

这是URL 的各种格式来判断应该使用其中哪种功能来访问相应的数据

网络是怎么样连接的笔记摘抄

解析完 URL 之后浏览器会使用 HTTP 协议来访问 Web 服务器,其中http协议如下图:

网络是怎么样连接的笔记摘抄

 

HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤

1.客户端会向服务器发送消息请求 消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相 当于“对什么”的部分称为 URI(Uniform Resource Identifier,统一资源标识符),URI 的内容是一个存放网页 数据的文件名或者是一个 CGI 程序(CGI 程序:对 Web 服务器程序调用其他程序的规则所做的定义就是 CGI, 而按照 CGI 规范来工作的程序就称为 CGI 程序)的文件名,例如“/dir1/file1.html” “/dir1/program1.cgi”等。不过,URI 不仅限于此,也可以直接使用“http:” 开头的 URLD 来作为 URI。换句话说就是,这里可以写各种访问目标,而 这些访问目标统称为 URI。

相当于接下来“进行怎样的操作”的部分称为方法(也叫 HTTP 谓词,或者 HTTP 动词),方法表示需要让 Web 服务器完成怎样的工作,其中典型的例子包括读取 URI 表示的数据、 将客户端输入的数据发送给 URI 表示的程序等

网络是怎么样连接的笔记摘抄

 

收到请求消息之后,Web 服务器会对其中的内容进行解析,通过 URI 和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己 的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码, 它用来表示操作的执行结果是成功还是发生了错误。状态码后面就是头字段和网页数据。响应消息会被发送回客 户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕 上。到这里,HTTP 的整个工作就完成了。但实际上,HTTP 消息在 格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息

网络是怎么样连接的笔记摘抄

(GET 方法能够发送的数据只有几百个字节,如果表单中的数据超过这一长 度,则必须使用 POST 方法来发送。)

返回消息时如果由于每条请求消息中只能写 1 个 URI,所以每次只能获取 1 个文件, 如果需要获取多个文件,必须对每个文件单独发送 1 条请求。比如 1 个 网页中包含 3 张图片,那么获取网页加上获取图片,一共需要向 Web 服务 器发送 4 条请求。判断所需的文件,然后获取这些文件并显示在屏幕上,这一系列工作 的整体指挥也是浏览器的任务之一,而 Web 服务器却毫不知情。Web 服务 器完全不关心这 4 条请求获取的文件到底是 1 个网页上的还是不同网页上 的,它的任务就是对每一条单独的请求返回 1 条响应而已。

1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须 对每个文件单独发送 1 条请求。

网络是怎么样连接的笔记摘抄

网络是怎么样连接的笔记摘抄

 

网络是怎么样连接的笔记摘抄

生成 HTTP 消息之后,接下来我们需要委托操作系统将消息发送给 Web 服务器。尽管浏览器能够解析网址并生成 HTTP 消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现(发送消息的功能对于所有的应用程序来说都是通用的,因此让操作系统来 实现这一功能,其他应用程序委托操作系统来进行操作,这是一个比较合理的做法)在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP 地址。在讲解这一操作之前,让我们先来简 单了解一下 IP 地址。

互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的,所以我 们先来了解 TCP/IP 的基本思路。网络是怎么样连接的笔记摘抄

 

这里的子网可以理解 为用集线器连接起来的几台计算机。(当计算机数量较少时,可以用一台集线器连接起来;当计算机数量较多时, 一台集线器可能无法连接这么多计算机,可以增加集线器数量并将集线器 相互连接起来,这时,凡是通过集线器连接起来的所有设备都属于同一个 子网。)

在网络中,所有的设备都会被分配一个地址。这个地址就相当于现实 中某条路上的“×× 号 ×× 室”。其中“号”对应的号码是分配给整个子 网的,而“室”对应的号码是分配给子网中的计算机的,这就是网络中的 地址。“号”对应的号码称为网络号,“室”对应的号码称为主机号,这个 地址的整体称为 IP 地址 E。将子网通过路由器连接起来,就形成了一个网络

网络是怎么样连接的笔记摘抄

实际的 IP 地址是一串 32 比特的数字,按照 8 比特(1 字节)为一组分成 4 组,分别用十进制表示 然后再用圆点隔开。这就是我们平常经常见到的 IP 地址格式,但仅凭这一 串数字我们无法区分哪部分是网络号,哪部分是主机号。在 IP 地址的规则 中,网络号和主机号连起来总共是 32 比特,但这两部分的具体结构是不固 定的。在组建网络时,用户可以自行决定它们之间的分配关系,因此,我 们还需要另外的附加信息来表示 IP 地址的内部结构。这一附加信息称为子网掩码。是一 串与 IP 地址长度相同的 32 比特数字,其左边一半都是 1,右边一半都是0。其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机 号。将子网掩码按照和 IP 地址一样的方式以每 8 比特为单位用圆点分组后 写在 IP 地址的右侧,这就是图 1.9(b)的方法。这种写法太长,我们也可 以把 1 的部分的比特数用十进制表示并写在 IP 地址的右侧,如图 1.9(c) 所示。这两种方式只是写法上的区别,含义是完全一样的。网络是怎么样连接的笔记摘抄

 

TCP/IP 网络是通过 IP 地址来确定通信对象的但如果 Web 服务器使用了虚拟主机功能,有可能无法通过 IP 地址来访问。使用 IP 地址只需要处理 4 字节的数字,而 域名则需要处理几十个到 255 个字节的字符,这增加了路由器的负担,传送 数据也会花费更长的时间

要查询IP地址可通过 DNS 操作称为域名解析,因此 负责执行解析(resolution)这一操作的就叫解析器(resolver)了。

解析器就是Socket 库中的其中一种程序组件。Socket 库其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能 。

DNS:Domain Name System,域名服务系统。将服务器名称和 IP 地址进行 关联是 DNS 最常见的用法,但 DNS 的功能并不仅限于此,它还可以将邮 件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。

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

网络是怎么样连接的笔记摘抄

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

网络应用程序(在我们的场景中就是指浏览器)调用解析器时, 程序的控制流程就会转移到解析器的内部。一般来说,应用程序编写的操作内容是从上往下按顺序执行的,当到达 需要调用解析器的部分时,对应的那一行程序就会被执行,应用程序本身的工 作就会暂停(图 1.12 ①)。然后,Socket 库中的解析器开始运行(图 1.12 ②),完 成应用程序委托的操作。像这样,由于调用了其他程序,原本运行的程序进 入暂停状态,而被调用的程序开始运行,这就是“控制流程转移”。

网络是怎么样连接的笔记摘抄

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

其中,来自客户端的查询消息包含以下 3 种信息。

(a)域名 服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称

(b) Class 在最早设计 DNS 方案时,DNS 在互联网以外的其他网络中的应用也被考虑到了,而 Class 就是用来识别网络的信息。不过,如今除了 互联网并没有其他的网络了,因此 Class 的值永远是代表互联网的 IN

(c)记录类型 表示域名对应何种类型的记录。例如,当类型为 A 时,表示域名 对应的是 IP 地址;当类型为 MX 时,表示域名对应的是邮件服务 器。对于不同的记录类型,服务器向客户端返回的信息也会不同

DNS 服务器上事先保存有前面这 3 种信息对应的记录数据,如图 1.14 所示。DNS 服务器就是根据这些记录查找符合查询请求的内容并对客户端 作出响应的。

网络是怎么样连接的笔记摘抄

例如,如果要查询 www.lab.glasscom.com 这个域名对应的 IP 地址,客 户端会向 DNS 服务器发送包含以下信息的查询消息。 (a)域名 = www.lab.glasscom.com

(b) Class = IN

(c)记录类型 = A

只要是 作为 Address(地址)记录在 DNS 服务器上注册的,都可以作为 Web 服务器的域名

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

委托协议栈发送消息

委托协议 栈来发送数字信息。收发数字信息这一操作不仅限于浏览器,对于各种使 用网络的应用程序来说都是共通的。因此,这一操作的过程也不仅适用于 Web,而是适用于任何网络应用程序

网络是怎么样连接的笔记摘抄

收发 数据的两台计算机之间连接了一条数据通道,数据沿着这条通道流动,最终到达目的地。我们可以把数据通道想象成一条管道,将数据从一端送入管道,数据就会到达管道的另一端然后被取出。数据可以从任何一端被送 入管道,数据的流动是双向的。

客户端也会先创建一个套 接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。 当双方的套接字连接起来之后,通信准备就完成了,只要将数据送入套接字就可以收发数据了。

协议栈就是根据套接字中记录的控制信息来工作的。在协议栈内部有一块用于存放控制信息的内存空间的实体就是套接字的实体。

在创建套接字时,协议栈会分配一个内存空间并初始化套接字。

然后需要将套接字的描述符告知应用程序,描述符用来区分多个套接字

收发数据操作结束时的情形。

当数据全部发送完毕之 后,连接的管道将会被断开。管道在连接时是由客户端发起的,但在断开 时可以由客户端或服务器任意一方发起 其中一方断开后,另一方也会随之 断开,当管道断开后,套接字也会被删除。

收发数据的操作分为若干个阶段,可以大致总结为以下 4 个。

(1)创建套接字(创建套接字阶段)

(2)将管道连接到服务器端的套接字上(连接阶段)

(3)收发数据(通信阶段)

(4)断开管道并删除套接字(断开阶段)