《网络是怎么连接的》第一章

2023-11-30 19:27:22 浏览数 (1)

总体示意图

最基本的说,网络是由web服务器和浏览器(客户端) 以及一套安全准确稳定传输服务器和客户端信息的机制组成。浏览器发出请求,通过机制服务器接收到请求,然后处理请求,返回响应通过机制浏览器收到响应,一次网络连接完成。

第一章 浏览器生成请求信息

具体过程:
  1. 生成HTTP请求消息

从用户在浏览器中输入URL开始,浏览器解析URL。根据解析URL得到的含义生成请求消息,而生成怎么样的请求消息,则是根据HTTP协议等的原理来确定消息的样子。

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

请求消息生成后,浏览器会委托操作系统向web服务器发送请求,但浏览器需要告诉操作系统接收方的IP地址才行,所以在委托操作系统前浏览器需要先查出web服务器的IP地址。

  1. 全世界的DNS服务器大接力

要查询到发送到的web服务器的IP地址,需要全世界的DNS服务器相互接力才能完成IP地址的查询。

  1. 委托协议栈发送消息

查询到接收放的IP地址后,浏览器就委托操作系统发送消息。

1.1 生成HTTP请求消息
1.1.1 URL的定义

网络的请求的开始需要通过输入URL开始,所以URL的定义格式是有一定的规则限制的,URL的开头就表明了这次请求所需的服务功能,例如FTP服务上下载文件URL就以FTP开头,访问Web服务器时以HTTP开头等。详细如下图。 ![image.png](https://img-blog.csdnimg.cn/img_convert/b74d561a506ecda025d541e55e12b100.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=808&id=u4cf8e941&margin=[object Object]&name=image.png&originHeight=808&originWidth=705&originalType=binary&ratio=1&rotation=0&showTitle=false&size=183689&status=done&style=none&taskId=u981515d0-30b3-4840-9327-e353a38b073&title=&width=705) 这些开头表示了浏览器应当使用的访问方法,可以称之为协议类型。

1.1.2 浏览器先解析URL

浏览器先进行url的解析并根据不同的协议类型,例如最常见的HTTP协议,详细解析过程方式入图。 ![image.png](https://img-blog.csdnimg.cn/img_convert/f7b12a6a8b164b075cc56d290e65b291.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=628&id=u62ff7398&margin=[object Object]&name=image.png&originHeight=628&originWidth=843&originalType=binary&ratio=1&rotation=0&showTitle=false&size=179685&status=done&style=none&taskId=u552fdd2c-9d9f-4ae1-a0eb-2cb0e064889&title=&width=843) 正如上图所示,浏览器按照这样的规则解析URL。

1.1.3 省略文件名的情况

如 http://www. lab. glasscom. com/dir/ 形式的URL 按照规则,文件名可以省略,那我们怎么确定这个URL要访问的资源呢。一般而言,我们会在服务器上事先设置好文件名省略时要访问的默认文件名,当出现这样情况时,就默认该URL访问默认文件。 如 http://www. lab. glasscom. com/ 或 http://www. lab. glasscom. com 这样的URL,由于第一个只有一个 / 因此我们认为它是访问根目录,由于省略文件所以仍然返回根目录下默认文件。第二个连根目录有都省略了,那我们认为他是访问预先设置的根目录下的默认文件。 http://www. lab. glasscom. com/whatisthis 这样的URL,我们的处理是,如果存在whatisthis 的目录就将它按目录处理,如果是文件,就将它按文件处理。

1.1.4 HTTP 的基本思路

经过URL的解析,可以确定访问的目标和内容,接下来浏览器就可以通过HTTP协议请求web服务器了。我们还需要先了解一下HTTP协议。它定义了客户端和服务器之间交互的消息内容和步骤,基本思路就是首先,客户端会向服务器发送请求消息,请求消息包含的是 对什么 和 进行怎样的操作 两个部分。其中相当于 对什么 的部分称之为URI。一般而言,URI的内容是一个存放网页数据的文件名或是一个CGI程序文件名。总之,各种访问目标统称为URI。 而 进行怎么的操作 相当于方法。方法表示需要让web服务器完成怎么的工作,例如读取URI表示的数据,将客户端输入的数据发送给URI表示的程序等。也就是HTTP提供的GET,POST等方法。HTTP提供多达数种的方法,它们负责不同的功能操作。服务器在收到请求,根据请求进行操作,返回响应。

1.1.5 生成HTTP请求消息

我们确定web服务器和文件名后,就是生成HTTP请求消息了。而HTTP消息在格式上是有严格规定的,所以浏览器需要按照规定的格式生成请求消息。 首先,第一行是请求行。开头是方法,方法指明了web服务器应该进行的操作,方法很多种,我们根据使用的场景不同使用不同的方法。 ![image.png](https://img-blog.csdnimg.cn/img_convert/743c51850b9990399a07dbbb7135814c.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=749&id=u29461ce0&margin=[object Object]&name=image.png&originHeight=749&originWidth=778&originalType=binary&ratio=1&rotation=0&showTitle=false&size=269597&status=done&style=none&taskId=ubd1711bf-d504-4d81-a285-fa06b1ee70b&title=&width=778)

接着是URI,前面已经说过URI是包含在URL中的,因此只需要将解析出的URI放在首行即可,最后是HTTP版本。 首行之后就是,请求头信息,用来描述更详细的一些信息。如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。详细的请求头信息如下图。 ![image.png](https://img-blog.csdnimg.cn/img_convert/a3361e67b9506ac3e620583a08d3b99f.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=840&id=uf5ad01be&margin=[object Object]&name=image.png&originHeight=840&originWidth=496&originalType=binary&ratio=1&rotation=0&showTitle=false&size=500621&status=done&style=none&taskId=u845065b8-5485-4319-b544-1250e92d782&title=&width=496) ![image.png](https://img-blog.csdnimg.cn/img_convert/2126cac85b4f6f115863d5b4e70d1f61.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=842&id=u80d9ff31&margin=[object Object]&name=image.png&originHeight=842&originWidth=677&originalType=binary&ratio=1&rotation=0&showTitle=false&size=622046&status=done&style=none&taskId=uad94529c-03c9-4bf7-9790-f0eefef1727&title=&width=677)

请求头之后就是消息主体了。这里是需要发送到服务器的数据存放处。消息主体之后请求消息就结束了。

1.1.5 发送请求收到响应

请求发送出去之后,一般情况下都会收到服务器响应。响应消息格式和请求消息格式基本一致,首行是状态码和状态短语。状态码向程序告知程序执行的结果,状态短语则是向人们告知程序执行的结果。 ![image.png](https://img-blog.csdnimg.cn/img_convert/df706cbaee3340814970b6d6c10bf7b9.png#clientId=ud6bbc0e1-1786-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=359&id=u08b99d4e&margin=[object Object]&name=image.png&originHeight=359&originWidth=848&originalType=binary&ratio=1&rotation=0&showTitle=false&size=130917&status=done&style=none&taskId=ueb9b515c-012b-4f28-b1f0-48fc3de12a7&title=&width=848) 同时,HTTP请求一次只能完成一个动作,例如当请求一个网页同时网页内包含图片等资源时,则图片不会随着网页数据一起返回,每张图片都需要单独再次发出请求。

1.2 DNS服务器查询Web服务器IP地址
1.2.1 IP地址的基础知识

生成请求消息之后,接下去需要委托操作系统将消息发送给Web服务器。因为浏览器本身不具有发送消息的功能。它需要委托操作系统发送消息,在此之前,还需要确定web服务器的IP地址,我们直接输入的域名是不能作为接收方的标识的。 IP地址是一串32比特的数字,按照8比特为一组分成4组,分别用十进制表示并用圆点隔开。同时有子网掩码指示IP的主机地址和网络地址。

1.2.2 域名和IP并用的理由

对于我们而言,由于IP地址是一串无规则不连续的数字,不便于记忆,当然直接使用IP地址是完全可以的。但对于用户而言并不友好,那我们直接使用域名,不使用IP地址是否可以呢?理论上也可以,但这样的话对于交换机和路由器而言就增加相当多的负担,这会严重影响速度,所以并不很好。因此,让用户使用域名,路由器等使用IP地址是比较好的选择。

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

向DNS服务器发送查询消息,并接受服务器返回的响应消息,这就表示我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称之为DNS解析器,简称解析器。通过DNS查询IP地址的操作称为域名解析。解析器实际就是一段程序,它包含在系统的Socket库中。 Socket库是用于调用网络功能的程序组件集合。而解析器就是Socket库中的一个程序组件。

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

解析器的使用也很简单。Socket库中都是提供的标准组件,只需从应用程序中调用即可。使用如下图。 ![image.png](https://img-blog.csdnimg.cn/img_convert/947c9876d5e316af1a247ede9af10173.png#clientId=u408206f6-2d4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=495&id=u1dde56e0&margin=[object Object]&name=image.png&originHeight=495&originWidth=887&originalType=binary&ratio=1&rotation=0&showTitle=false&size=134344&status=done&style=none&taskId=u288d4978-5d9f-4cb6-b69d-bdad012d3c2&title=&width=887)

1.2.5 解析器内部原理

简而言之,就是应用程序调用第三方库的正常流程。其中的控制流程转移,就是当程序执行到调用函数这一步就当前的函数域就会失效,有效程序域就会跳转到被调用的函数域内。 计算机的内部结构就是这样一层一层的。也就是说,很多程序组成不同的层次,彼此之间分工协作。当接到上层委派的操作时,本层的程序并不会完成所有的工作,而是会完成一部分工作,再将剩下的部分委派到下层来完成。 当然,DNS服务器也是有一个IP地址的,只不过这个IP一般都是我们预先设置好的IP的地址。

1.3 全世界DNS服务器的大接力
1.3.1 DNS服务器的基本工作

前面我们了解了DNS服务器和解析器之间交互的流程,现在我们了解一下DNS服务器的工作,基本工作就是接收客户端的查询消息,根据查询返回相应的响应。其中 来自客户端的查询消息包含以下3种信息。 (a)域名服务器、邮件服务器(邮件地址中@后面的部分)的名称 (b) Class在最早设计DNS方案时,DNS在互联网以外的其他网络中的应用也被考虑到了,而Class就是用来识别网络的信息。不过,如今除了互联网并没有其他的网络了,因此Class的值永远是代表互联网的IN (c)记录类型表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同 详情如下图: ![image.png](https://img-blog.csdnimg.cn/img_convert/e2752fb78a2c601e4fde747e08096c30.png#clientId=u408206f6-2d4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=775&id=u39f3ad26&margin=[object Object]&name=image.png&originHeight=775&originWidth=815&originalType=binary&ratio=1&rotation=0&showTitle=false&size=315540&status=done&style=none&taskId=uc9cb4a6f-e596-4fdd-80e9-bf33bc29adf&title=&width=815)

1.3.2 域名的层次结构

域名,以.来分隔开来,每个都代表不同的域,且越靠右的域越高级,越往左的越详细。这样具有层次结构的域名会会被注册在DNS服务器中,而每个域都是作为一个整体来处理的,也就是一个域的信息都会被存放到一台DNS服务器中。我们可以假设一台DNS服务器只存放一个域的消息。这样便于管理且不容易混乱。

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

互联网中有上万台DNS服务器,我们肯定不能一台一台去找。可以使用下面的方法,首先,将负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推。也就是说,负责管理lab.glasscom.com这个域的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。这样,我们就可以通过上级DNS服务器查询出下级DNS服务器的IP地址,也就可以向下级DNS服务器发送查询请求了。

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

有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。并且,当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。同时为了保证准确性,DNS服务器会告诉客户端这是缓存中的还是查询中的结果,并且会设置缓存有效期,超过有效期就会删除缓存,重新赋值。

0 人点赞