《网络是怎样连接的》第一章读书笔记(待更新...)

第一章

在这里插入图片描述

一. 生成HTTP请求消息

1.1 输入URL

1.1.1 URL是什么

WWW 上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。

1.1.2 URL格式

根据访问目标不同,URL的写法也会不同,常见的URL格式:
在这里插入图片描述

1.2 浏览器解析URL

1.2.1 一个完整的网络地址

protocol://hostname[:port]/path/ [:parameters][?query]#fragment

如:http://www.aspxfans.com:80/news/index.html?boardID=5&ID=24618&page=1#name

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符。
  2. 域名部分:该URL的域名部分为“www.test.com”。一个URL中,也可以使用IP地址作为域名使用。
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80。
  4. 虚拟目录(路径) 部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”。
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
  6. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
  7. 部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分。

1.2.2 浏览器解析URL

确定目标服务器域名和文件路径
在这里插入图片描述

1.2.3 URL省略文件名的情况

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

以“/”结尾的url,表示文件名被省略了,服务器访问事先设置好的默认文件名,大都是index.html或default.htm之类的情况。

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

“/”表示“根目录”,于是此种写法为访问根目录下的默认文件名

http://www.lab.glasscom.com

同上,此种写法为访问根目录下的默认文件名

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

如果Web服务器上存在名为whatisthis的文件,则将whatisthis作为文件名来处理;
如果Web服务器上存在名为whatisthis的目录,则将whatisthis作为目录来处理。
注意: 我们无法创建两个名字相同的文件和目录,因此不可能既有一个名为whatisthis的文件,同时又有一个同名目录。

1.3 HTTP协议

解析完 URL 之后, 我们就知道应该要访问的目标在哪里了。 接下来,浏览器会使用 HTTP 协议来访问 Web 服务器。

1.3.1 HTTP协议是什么

超文本传输协议,是客户端与服务端之间通信的一种规则。

一个大致的请求过程
  1. 首先, 客户端会向服务器发送请求消息(包括URI、方法)。 请求消息中包含的内容是“对什么” 和“进行怎样的操作” 两个部分。 其中相当于“对什么” 的部分称为 URI(统一资源标识符),一般来说, URI 的内容是一个存放网页数据的文件名或者是一个 CGI 程序的文件名,也可以是URL。换句话说就是, 这里可以写各种访问目标, 而这些访问目标统称为 URI。相当于接下来“进行怎样的操作” 的部分称为方法。 方法表示需要让Web 服务器完成怎样的工作, 其中典型的例子包括读取 URI 表示的数据、将客户端输入的数据发送给 URI 表示的程序等。

URI:统一资源标识符,表示Web上每一种可用的资源,如HTML文档,图像,视频片段,程序等都是由一个URI进行标识的。

HTTP的主要方法
在这里插入图片描述
2. 收到请求消息之后, Web 服务器会对其中的内容进行解析, 通过 URI和方法来判断“对什么”“进行怎样的操作”, 并根据这些要求来完成自 己的工作, 然后将结果存放在响应消息中。
3. 响应消息会被发送回客户端, 客户端收到之后, 浏览器会从消息中读出所需的数据并显示在屏幕上。 到这里, HTTP 的整个工作就完成了。

1.4 生成HTTP请求消息

对 URL 进行解析之后, 浏览器确定了 Web 服务器和文件名, 接下来就是根据这些信息来生成 HTTP 请求消息了。

1.4.1 请求消息

请求消息的格式:行、头、空行、体
请求行:请求方法、URI、协议版本
请求头:很多请求信息,是键值对。。。待补充
空行
请求体:POST请求有,GET请求无
请求消息示例
wait?酱紫写uri 怎么知道是哪个服务器?
嗯嗯 服务器的域名在url里!
在这里插入图片描述

常见请求头
。。。。。。。。。。。。

1.4.2 响应消息

当我们将上述请求消息发送出去之后, Web 服务器会返回响应消息。其实发送需要经过很多步,如:向DNS服务器查询Web服务器的IP等,在后文再展开,我们先看看响应消息的结构吧。

响应消息的格式:行、头、空行、体
响应行:协议版本、状态码(向程序告知执行的结果)、状态描述字符串(向人们告知执行的结果)
响应头:很多请求信息,是键值对。。。待补充
空行
响应体:POST请求有,GET请求无

状态码概要
在这里插入图片描述响应消息示例
在这里插入图片描述

  • 返回响应消息之后, 浏览器会将数据提取出来并显示在屏幕上, 我们就能够看到网页的样子了。 如果网页的内容只有文字, 那么到这里就全部处理完毕了, 但如果网页中还包括图片等资源, 则还有下文。
  • 当网页中包含图片时, 会在网页中的相应位置嵌入表示图片文件的标签的控制信息。** 浏览器会在显示文字时搜索相应的标签**,当遇到图片相关的标签时, 会在屏幕上留出用来显示图片的空间, 然后再次访问 Web 服务器, 按照标签中指定的文件名向 Web 服务器请求获取相应的图片并显示在预留的空间中。
  • 这个步骤和获取网页文件时一样, 只要在 URI 部分写上图片的文件名并生成和发送请求消息就可以了。由于每条请求消息中只能写 1 个 URI, 所以每次只能获取 1 个文件,如果需要获取多个文件, 必须对每个文件单独发送 1 条请求。
  • 比如 1 个网页中包含 3 张图片, 那么获取网页加上获取图片, 一共需要向 Web 服务器发送 4 条请求。判断所需的文件, 然后获取这些文件并显示在屏幕上, 这一系列工作的整体指挥也是浏览器的任务之一, 而 Web 服务器却毫不知情。
  • Web 服务器完全不关心这 4 条请求获取的文件到底是 1 个网页上的还是不同网页上的, 它的任务就是对每一条单独的请求返回 1 条响应而已。

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

生成 HTTP 消息之后, 接下来我们需要委托操作系统将消息发送给Web 服务器。
委托操作系统发送消息时, 必须要提供的不是通信对象的域名, 而是它的 IP 地址。 因此,需要先进行DNS解析,即向DNS服务器获取请求的服务器域名对应的IP地址

1.1 TCP/IP

1.1.1 TCP/IP网络结构

由一些小的子网,通过路由器连接起来组成一个大的TCP/IP网络。 这里的子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网
tcp/ip结构

  • 在网络中, 所有的设备都会被分配一个地址。 这个地址就相当于现实中某条路上的“× × 号 × × 室”。
  • 其中“号” 对应的号码是分配给整个子网的, 而“室” 对应的号码是分配给子网中的计算机的, 这就是网络中的地址。
  • “号” 对应的号码称为网络号,“室” 对应的号码称为主机号,这个地址的整体称为 IP 地址。

数据是以包的形式传送的

1.1.2 实际IP地址

实际的 IP 地址(网络号+主机号)是一串32 bit的数字, 按照 8 bit(1 byte) 为一组分成 4 组, 分别十进制表示然后再用圆点隔开。

1比特是一个二进制位
8比特 == 1字节

IP地址分类
。。。。

网络和和主机号这两部分的具体结构是不固定的,有5类。
在组建网络时, 用户可以自行决定它们之间的分配关系,因此, 我们还需要另外的附加信息来表示 IP 地址的内部结构,这一附加信息称为子网掩码。

子网掩码是一串与 IP 地址长度相同的 32 比特数字, 其左边一半都是 1, 边一半都是0;其中, 子网掩码为 1 的部分表示网络号, 子网掩码为 0 的部分表示主机号。

IP地址的表示方法
在这里插入图片描述?怎么柑橘不是很懂

1.2.3 为什么url不直接使用IP而需要域名?

实际上, 如果用 IP 地址来代替服务器名称也是能够正常工作的。
然而, 就像你很难记住电话号码一样, 要记住一串由数字组成的 IP 地址也非常困难。 因此, 相比 IP 地址来说, 网址中还是使用服务器名称比较好 。

1.2.4 为什么必须需要IP地址来确定通信对象?

因为IP地址的长度为32bit,即4字节;域名则需要处理几十个到 255 个字节的不固定长度的字符, 这增加了路由器的负担, 传送数据也会花费更长的时间。

1.2.3和1.2.4就是DNS机制存在的原因,互补缺陷

1.2 DNS解析

1.2.1 如何向 DNS 服务器发出查询

  1. 浏览器(应用程序)调用解析器
  2. 解析器会生成要发送给 DNS 服务器的查询消息
  3. 解析器把查询消息委托给操作系统内部的协议栈
  4. 协议栈会执行发送消息的操作, 然后通过网卡将消息发送给 DNS 服务器
  5. 当 DNS 服务器收到查询消息后, 它会根据消息中的查询内容进行查询,如果要访问的 Web 服务器已经在 DNS 服务器上注册,那么这条记录就能够被找到, 然后其 IP 地址会被写入响应消息并返回给网卡,1.2.2详述DNS服务器的工作
  6. 再经过协议栈被传递给解析器,解析器会将取出的 IP 地址写入应用程序指定的内存地址中。
  7. 应用程序已经能够从内存中取出 IP 地址

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

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

网卡:负责以太网或无线网络通信的硬件

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

1.2.2 DNS服务器的基本工作

DNS 服务器上事先保存3 种信息对应的记录数据,接收到消息后根据这些记录查找符合查询请求的内容并对客户端作出响应。
来自客户端的查询消息包含以下 3 种信息:

  1. 域名
    要查询的服务器、 邮件服务器(邮件地址中 @ 后面的部分) 的名称
  2. Class
    如今除了互联网并没有其他的网络了, Class 的值永远是代表互联网的IN
  3. 记录类型
    表示域名对应何种类型的记录。 例如, 当类型为 A 时, 表示域名对应的是 IP 地址; 当类型为 MX 时, 表示域名对应的是邮件服务器…

DNS服务器基本工作流程:
在这里插入图片描述

1.2.3 寻域名对应的DNS服务器获取IP地址

互联网中存在着不计其数的服务器,将这些服务器的信息全部保存在一台 DNS 服务器中是不可能的, 因此将信息分布式保存在多台 DNS 服务器中,这些 DNS 服务器相互接力配合, 从而查找出要查询的信息。

如何接力配合:
DNS 中的域名都是用句点来分隔的, 比如 www.lab.glasscom.com, 这里的句点代表了不同层次之间的界限, 在域名中, 越靠右的位置表示其层级越高。

www.lab.glasscom.com 这个域名如果按照公司里的组织结构来说, 大概就是“com 事业集团 glasscom 部 lab 科的 www”这样。 其中, 相当于一个层级的部分称为域。
因此,com 域的下一层是glasscom 域,再下一层是 lab 域, 再下面才是 www 这个名字。

域名的树状结构
最顶层的域名是根域名(root),然后是顶级域名(top-level domain,简写 TLD),再是一级域名、二级域名、三级域名。

(1)根域名
所有域名的起点都是根域名,它写作一个点.,放在域名的结尾。因为这部分对于所有域名都是相同的,所以就省略不写了,比如example.com等同于example.com.(结尾多一个点)。
你可以试试,任何一个域名结尾加一个点,浏览器都可以正常解读。

(2)顶级域名
根域名的下一级是顶级域名。它分成两种:通用顶级域名(gTLD,比如 .com 和 .net)和国别顶级域名(ccTLD,比如 .cn 和 .us)。
顶级域名由国际域名管理机构 ICANN 控制,它委托商业公司管理 gTLD,委托各国管理自己的国别域名。

(3)一级域名
一级域名就是你在某个顶级域名下面,自己注册的域名。比如,ruanyifeng.com就是我在顶级域名.com下面注册的。

(4)二级域名
二级域名是一级域名的子域名,是域名拥有者自行设置的,不用得到许可。比如,es6 就是 ruanyifeng.com 的二级域名。

这种具有层次结构的域名信息会注册到 DNS 服务器中, 而每个域都是作为一个整体来处理的。 一台 DNS 服务器中也可以存放多个域的信息。

参考链接

1.3 向目标ip地址发送http请求

上述操作完成,已经得到了目标服务器的ip地址,于是,要准备开始向这个目标ip地址发送http请求了。

1.3.1 过程简述 ---- 4个阶段

这个http请求的发送,有点类似DNS解析。
向操作系统内部的协议栈发出委托时, 需要按照指定的顺序来调用 Socket 库中的程序组件。

数据通过类似管道的结构来流动
首先, 服务器一方先创建套接字, 然后等待客户端向该套接字连接管道。
当服务器进入等待状态时,客户端就可以连接管道了。具体来说, 客户端也会先创建一个套接字, 然后从该套接字延伸出管道, 最后管道连接到服务器端的套接字上。
当双方的套接字连接起来之后, 通信准备就完成了。 接下来, 就像我们刚刚讲过的一样, 只要将数据送入套接字就可以收发数据了。
当数据全部发送完毕之后,连接的管道将会被断开。 管道在连接时是由客户端发起的,但在断开时可以由客户端或服务器任意一方发起。 其中一方断开后,另一方也会随之断开,当管道断开后, 套接字也会被删除。

1.3.2 创建套字阶段

客户端创建套接字的操作非常简单, 只要调用 Socket 库中的 socket 程序组件就可以了。
套接字创建完成后, 协议栈会返回一个描述符, 应用程序会将收到的描述符存放在内存中。

同一台计算机上可能同时存在多个套接字, 在这样的情况下, 我们就需要一种方法来识别出某个特定的套接字, 这种方法就是描述符。

1.3.3 连接阶段: 把管道接上去

接下来, 我们需要委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来。 应用程序通过调用 Socket 库中的名为 connect 的程序组件来完成这一操作。 这里的要点是当调用 connect 时, 需要指定描述符、服务器 IP 地址和端口号这 3 个参数。

1.3.4 通信阶段: 传递消息

首先, 应用程序需要在内存中准备好要发送的数据。 根据用户输入的网址生成的 HTTP 请求消息就是我们要发送的数据。 接下来, 当调用 write时, 需要指定描述符和发送数据, 然后协议栈就会将数据发送到服务器。
由于套接字中已经保存了已连接的通信对象的相关信息, 所以只要通过描述符指定套接字, 就可以识别出通信对象, 并向其发送数据。接着, 发送数据会通过网络到达我们要访问的服务器。
接下来, 服务器执行接收操作, 解析收到的数据内容并执行相应的操作, 向客户端返回响应消息。

1.3.5 断开阶段: 收发数据结束

当浏览器收到数据之后, 收发数据的过程就结束了。 接下来, 我们需要调用 Socket 库的 close 程序组件进入断开阶段。 最终, 连接在套接字之间的管道会被断开, 套接字本身也会被删除。

猜你喜欢

转载自blog.csdn.net/kwroi/article/details/127902185