type
status
date
category
icon
password
tags
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 主旨内容
观点1
第一章—-浏览器生成消息,探索浏览器内部,从解析浏览器中输入的网址开始,探索了生成 HTTP 请求消息、委托操作系统发送消息等步骤
recall
thinking
全书概述
1.1 生成http请求消息
1.1.1 从输入网址开始
1.1.2 浏览器先要解析url—解析完URL之后,我们就知道应该要访问的目标在哪里了
1.1.3 省略文件名的情况
- 浏览器的第一步工作就是对 URL 进行解析。
1.1.4 http的基本思路
http整体工作过程
服务器收到浏览器通过系统发送的请求消息之后,Web服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。当我们访问We b服务器时,遇到找不到的文件就会显示出404 Not Found的错误信息,其实这就是状态码。状态码后面就是头字段和网页数据。响应消息会被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上。
1.1.5 生成http请求消息—-对URL进行解析之后,浏览器确定了We b服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息了
- 浏览器会按照规定的格式来生成请求消息
GET方法的情况下,仅凭方法和URI,We b服务器就能够判断需要进行怎样的操作,因此消息体中不需要填写任何数据
当使用POST方法时,需要将表单中填写的信息写在消息体中
1.1.6 发送请求后会收到响应—当我们将上述请求消息发送出去之后,We b服务器会返回响应消息
- 状态码是一个数字,它主要用来向程序告知执行的结果(表1.3);相对地,响应短语则是一段文字,用来向人们告知执行的结果
返回响应消息之后,浏览器会将数据提取出来并显示在屏幕上,我们就能够看到网页的样子了。如果网页的内容只有文字,那么到这里就全部处理完毕了,但如果网页中还包括图片等资源,则还有下文。
- 会在屏幕上留出用来显示图片的空间,然后再次访问We b服务器,按照标签中指定的文件名向We b服务器请求获取相应的图片并显示在预留的空间中
- 这个步骤和获取网页文件时一样,只要在URI部分写上图片的文件名并生成和发送请求消息就可以了。
- 由于每条请求消息中只能写1个URI,所以每次只能获取1个文件,如果需要获取多个文件,必须对每个文件单独发送1条请求。
- 比如1个网页中包含3张图片,那么获取网页加上获取图片,一共需要向We b服务器发送4条请求
1.2 向dns服务器查询web服务器的ip地址
1.2.1 ip地址的基本认识—-尽管浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现
在进行这一操作时,我们还有一个工作需要完成,那就是查询网址中服务器域名对应的IP地址,在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址
- TCP/IP的结构如图1.8所示,就是由一些小的子网,通过路由器连接起来组成一个大的网络。这里的子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网。将子网通过路由器连接起来,就形成了一个网络
- 在网络中,所有的设备都会被分配一个地址。这个地址就相当于现实中某条路上的“××号××室”。其中“号”对应的号码是分配给整个子网的,而“室”对应的号码是分配给子网中的计算机的,这就是网络中的地址。“号”对应的号码称为网络号,“室”对应的号码称为主机号,这个地址的整体称为IP地址
- 发送者发出的消息首先经过子网中的集线器,转发到距离发送者最近的路由器上(图1.8①)。接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器(图1.8②)。前面的过程不断重复,最终消息就被传送到了目的地
- 主机号部分全部为0代表整个子网而不是子网中的某台设备(图1.9(d))。此外,主机号部分全部为1代表向子网上所有设备发送包,即广播(图1.9(e))
1.2.2 域名和ip地址并用的理由—-让人来使用名称,让路由器来使用IP地址
- 路由器处理ip地址,减少路由器负担
- 为了填补两者之间的障碍,需要有一个机制能够通过名称来查询IP地址,或者通过IP地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是DNS
1.2.3 socket库提供查询ip地址的功能—解析器包含在socket库中Socket 库是用于调用网络功能的程序组件集合
查询IP地址的方法非常简单,只要询问最近的DNS服务器“www.lab.glasscom.com的IP地址是什么”就可以了,DNS服务器会回答说“该服务器的IP地址为xxx.xxx.xxx.xxx”。那么浏览器是如何向DNS服务器发出查询的呢?
- 对于DNS服务器,我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。
- 通过DNS查询IP地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了
- 解析器包含在操作系统的Socket库中,那么,库到底是什么东西呢?库就是一堆通用程序组件的集合,Socket 库是用于调用网络功能的程序组件集合
- 而解析器就是这个库中的其中一种程序组件
1.2.4 通过解析器向dns服务器发出查询—根据域名查询 IP 地址时,浏览器会使用 Socket 库中的解析器
在编写浏览器等应用程序的时候,只要像图1.11这样写上解析器的程序名称“gethostbyname”以及We b服务器的域名“www.lab.glasscom.com”就可以了,这样就完成了对解析器的调用
- 调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息。响应消息中包含查询到的IP地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中
1.2.5 解析器的内部原理
当控制流程转移到解析器后,解析器会生成要发送给DNS服务器的查询消息。这个过程与浏览器生成要发送给We b服务器的HTTP请求消息的过程类似,解析器会根据DNS的规格,生成一条表示“请告诉我www.lab.glasscom.com的IP地址”B的数据,并将它发送给DNS服务器(图1.12③)。发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈来执行
- 另外,向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址。只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询了
1.3 全世界dns服务器的大接力
1.3.1 dns服务器的基本工作—-DNS 服务器会从域名与 IP 地址的对照表中查找相应的记录,并返回 IP 地址
其中,来自客户端的查询消息包含以下3种信息
- 域名
- Class—识别网络
- 如今除了互联网并没有其他的网络了,因此Class的值永远是代表互联网的IN
- 记录类型
- 表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器
其他记录类型
- 据IP地址反查域名的PTR类型,查询域名相关别名的CNAME类型,查询DNS服务器IP地址的NS类型等
1.3.2 域名的层次结构—-通过域下面创建子域来管理
- DNS服务器中的所有信息都是按照域名以分层次的结构来保存的,句点分隔
- 在域名中,越靠右的位置表示其层级越高,比如www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部lab科的www”这样,其中,相当于一个层级的部分称为域。因此,com域的下一层是glasscom域,再下一层是lab域,再下面才是www这个名字
- 在域的下面创建下级域,然后再将它们分别分配给各个事业集团。比如,假设公司的域为example.co.jp,我们可以在这个域的下面创建两个子域,即sub1.example.co.jp和sub2.example.co.jp
1.3.3 寻找相应的dns服务器并获取ip地址—-如何找到我们要访问的web服务器的信息归哪一台dns服务器管
- 互联网中有数万台dns服务器,首先,将负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中
- 由于上级DNS服务器保管着所有下级DNS服务器的信息,所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的DNS服务器
- 也就是说,负责管理lab.glasscom.com这个域的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。这样,我们就可以通过上级DNS服务器查询出下级DNS服务器的IP地址,也就可以向下级DNS服务器发送查询请求了
- 根域
- 像www.lab.glasscom.com.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域,不过,一般都不写最后那个句点
- 那如何将根域的DNS服务器信息保存在互联网中所有的DNS服务器中
- 根域DNS服务器的相关信息已经包含在DNS服务器程序的配置文件中了,因此只要安装了DNS服务器程序,这些信息也就被自动配置好了
- 如图1.16所示,客户端首先会访问最近的一台DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址),假设我们要查询www.lab.glasscom.com这台We b服务器的相关信息(图1.16①)。由于最近的DNS服务器中没有存放www.lab.glasscom.com这一域名对应的信息,所以我们需要从顶层开始向下查找。最近的DNS服务器中保存了根域DNS服务器的信息,因此它会将来自客户端的查询消息转发给根域DNS服务器(图1.16②)。根域服务器中也没有www.lab.glasscom.com这个域名,但根据域名结构可以判断这个域名属于com域,因此根域DNS服务器会返回它所管理的com域中的DNS服务器的IP地址,意思是“虽然我不知道你要查的那个域名的地址但你可以去com域问问看”。接下来,最近的DNS服务器又会向com域的DNS服务器发送查询消息(图1.16③)。com域中也没有www.lab.glasscom.com这个域名的信息,和刚才一样,com域服务器会返回它下面的glasscom.com域的DNS服务器的IP地址。以此类推,只要重复前面的步骤,就可以顺藤摸瓜找到目标DNS服务器(图1.16⑤),只要向目标DNS服务器发送查询消息,就能够得到我们需要的答案,也就是www.lab.glasscom.com的IP地址了
我们将图1.12和图1.16连起来看看。图1.16中的①和⑥分别相当于图1.12中的⑤和⑥,将这部分重合起来,就可以将这两张图连起来了。不过,在图1.12和图1.16中,客户端和DNS服务器的上下位置关系是颠倒着的,因此需要将其中一张图倒过来看。这样,我们就可以看清楚浏览器调用gethostbyname查询We b服务器地址的全貌,这也就是向DNS服务器查询IP地址的实际过程
1.3.4 通过缓存加快dns服务器的响应—-缓存,可以记住之前查询过的域名
- 在真实的互联网中,一台DNS服务器可以管理多个域的信息,因此并不是像图1.16这样每个域都有一台自己的DNS服务器
- DNS服务器有一个缓存功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。
- 注意,那就是信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的。因此,DNS服务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除,而且,在对查询进行响应时,DNS服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS服务器
1.4 委托协议栈发送消息
1.4.1 数据收发操作概览—知道了 IP 地址之后,就可以委托操作系统内部的协议栈向这个目标 IP 地址发送消息
- 通过 DNS 服务器查询 IP 地址的操作也同样适用于所有网络应用程序。
- 向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用 Socket 库中的程序组件
并不是说现实中真的有这么一条管道,只是为了帮助大家理解数据收发操作的全貌
- 在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。我们需要先创建套接字,然后再将套接字连接起来形成管道。
- 首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道,服务器程序一般会在启动后就创建好套接字并等待客户端连接管道
- 当服务器进入等待状态时,客户端就可以连接管道了
- 收发数据的操作分为若干个阶段
- (1)创建套接字(创建套接字阶段)
- (2)将管道连接到服务器端的套接字上(连接阶段)
- (3)收发数据(通信阶段)
- (4)断开管道并删除套接字(断开阶段)
- 这些委托的操作都是通过调用Socket库中的程序组件来执行的, 应用程序的委托内容最终会被原原本本地传递给协议栈
1.4.2 创建套接字阶段—-调用Socket库中的socket程序组件,应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的
- 只要调用Socket库中的socket程序组件就可以了(图1.18①)。和调用解析器一样,调用socket之后,控制流程会转移到socket内部并执行创建套接字的操作,完成之后控制流程又会被移交回应用程序
- 套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中。描述符是用来识别不同的套接字的,同一台计算机上可能同时存在多个套接字,在这样的情况下,我们就需要一种方法来识别出某个特定的套接字,这种方法就是描述符
- 应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的
1.4.3 连接阶段—-委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来
- 应用程序通过调用Socket库中的名为connect的程序组件来完成这一操作。这里的要点是当调用connect时,需要指定描述符、服务器IP地址和端口号这3个参数(图1.18②)
- 当同时指定IP地址和端口号时,就可以明确识别出某台具体的计算机上的某个具体的套接字
- 既然确定连接对象的套接字需要使用端口号,那么服务器也得知道客户端的套接字号码才行吧,这个问题是怎么解决的呢?首先,客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号。接下来,当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器
- IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制
1.4.4 通信阶段
- 首先,应用程序需要在内存中准备好要发送的数据。根据用户输入的网址生成的HTTP请求消息就是我们要发送的数据。接下来,当调用write时,需要指定描述符和发送数据(图1.18③),然后协议栈就会将数据发送到服务器
- 调用read时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。于是,当服务器返回响应消息时,read就会负责将接收到的响应消息存放到接收缓冲区中。由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。
1.4.5 断开阶段
- 接下来,我们需要调用Socket库的close程序组件进入断开阶段(图1.18④)。最终,连接在套接字之间的管道会被断开,套接字本身也会被删除
- 断开的过程如下。We b使用的HTTP协议规定,当We b服务器发送完响应消息之后,应该主动执行断开操作( 根据应用种类不同,客户端和服务器哪一方先执行close都有可能。有些应用中是客户端先执行close,而另外一些应用中则是服务器先执行close。),因此We b服务器会首先调用close来断开连接。断开操作传达到客户端之后,客户端的套接字也会进入断开阶段。接下来,当浏览器调用read执行接收数据操作时,read会告知浏览器收发数据操作已结束,连接已经断开。浏览器得知后,也会调用close进入断开阶段
- HTTP协议将HTML文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送请求消息、接收响应消息、断开的过程。因此,如果一个网页中包含很多张图片,就必须重复进行很多次连接、收发数据、断开的操作。对于同一台服务器来说,重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在一次连接中收发多个请求和响应的方法。在HTTP版本1.1中就可以使用这种方法,在这种情况下,当所有数据都请求完成后,浏览器会主动触发断开连接的操作
review
( ✔️/❌ )http://www.nikkeibp.co.jp/ 中的 www 代表 World Wide Web 协议(对通信操作规则所作的定义)。
- ×。http://www.nikkeibp.co.jp/ 中的 www 只是 Web 服务器上的一种命名。而且,WorldWideWeb 也不是一个协议的名字,而是Web 的提出者最早开发的浏览器兼 HTML 编辑器的名字
( ✔️/❌ )浏览器等网络应用程序实际上并不具备网络控制功能。
✅。应用程序并不是自己去控制网络,而是委托操作系统来控制网络
什么是网址,即什么是url?
- 就是以http://开头的那一串东西,网址还可以以其他一些文字开头,例如“ftp:”“file:”“mailto:”C等
- 之所以有各种各样的URL,是因为尽管我们通常是使用浏览器来访问We b服务器的,但实际上浏览器并不只有这一个功能,它也可以用来在FTPD服务器上下载和上传文件,同时也具备电子邮件客户端的功能
- 浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据,而各种不同的URL就是用来干这个的,比如访问We b服务器时用“http:”,而访问FTP服务器时用“ftp:”
- http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。比如当访问Web服务器时应该使用HTTP协议,而访问FTP服务器时则应该使用FTP协议。因此,我们可以把这部分理解为访问时使用的协议类型
浏览器是如何解析url的?为什么要解析呢
- 不解析浏览器就不知道要传输什么内容,浏览器要做的第一步工作就是对URL进行解析,从而生成发送给Web服务器的请求消息。
- 根据HTTP的规格,URL包含图1.2(a)中的这几种元素。当对URL进行解析时,首先需要按照图1.2(a)的格式将其中的各个元素拆分出来,例如图1.2(b)中的URL会拆分成图1.2(c)的样子。然后,通过拆分出来的这些元素,我们就能够明白URL代表的含义。例如,我们来看拆分结果图1.2(c),其中包含Web服务器名称www.lab.glasscom.com,以及文件的路径名/dir1/file1.html,因此我们就能够明白,图1.2(b)中的URL表示要访问www.lab.glasscom.com这个Web服务器上路径名为/dir/file1.html的文件,也就是位于/dir/目录下的file1.html这个文件(图1.3)
省略文件名那服务器怎么知道要访问哪个文件呢?
- (a)http://www.lab.glasscom.com/dir/
我们可以这样理解,以“/”结尾代表/dir/后面本来应该有的文件名被省略了。根据URL的规则,文件名可以像前面这样省略
我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是index.html或者default.htm之类的文件名。因此,像前面这样省略文件名时,服务器就会访问/dir/index.html或者/dir/default.htm
- (b)http://www.lab.glasscom.com/
这个URL也是以“/”结尾的,也就是说它表示访问一个名叫“/”的目录A。而且,由于省略了文件名,所以结果就是访问/index.html或者/default.htm这样的文件了。
- (c)http://www.lab.glasscom.com
这种写法也是允许的。当没有路径名时,就代表访问根目录下事先设置的默认文件A,也就是/index.html或者/default.htm这些文件,这样就不会发生混乱了
- (d)http://www.lab.glasscom.com/whatisthis
一般来说,这种情况会按照下面的惯例进行处理:如果We b服务器上存在名为whatisthis的文件,则将whatisthis作为文件名来处理;如果存在名为whatisthis的目录,则将whatisthis作为目录名来处理
practice
第一章小测
向 DNS服务器发送请求消息的程序叫什么?
解析器(参见【1.2.3】
SUMMARY: mindmap
keyword + topic —> what will arise?
I teach you…
keyword
topic
第二章—-用电信号传输tcp/ip数据,探索协议栈和网卡
🤗 总结归纳
总结文章的内容
📎 参考文章
- 一些引用
- 引用文章
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:Byron
- 链接:https://byron-x.top//article/1d171b21-7b3b-4125-95e6-91dc40f2de6c
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。