《网络是怎样连接的》之 web浏览器的探索

1.生成HTTP请求消息

首先,这张图特别重要,这把网络整个的连接过程表示出来了,整个过程讲述的是在浏览器输入网址(url)之后,web浏览器解析网址信息,生成http请求消息,然后先把web服务器的IP地址找到,然后才能将http请求消息发送给web服务器,然后web服务器响应,并返回相应的操作,这就是这章的大体介绍。
在这里插入图片描述

1.1探索之旅从输入网址开始

   首先探索之旅从输入网址开始,网址准确的来说叫做url(也叫统一资源定位符)
在这里插入图片描述
   这里以输入淘宝的网址为例子,www前面有https://这个表示超文本传输协议 访问web服务器的时候就用http:
在这里插入图片描述

还有访问ftp服务器的时候前面就是ftp(表示文件的上传和下载)
在这里插入图片描述

还有读取客户端计算机本地文件时候就可以用file,这个也比较常见。
在这里插入图片描述

1.2浏览器先解析url

     首先第一步已经将URL输入浏览器,浏览器不能直接将这段URL发送给web服务器,需要先用web浏览器将其解析最终生成web服务器能读懂的消息(后面的生成HTTP的消息)。先解析URL的结构和含义
在这里插入图片描述
在这里插入图片描述

1.3 HTTP的基本思路

在这里插入图片描述

   HTTP协议定义的客户端(web浏览器)和web服务器之间的访问的消息内容和步骤,首先客户端向web服务器发送请求消息,消息内容也就是 “对什么”–URI,这里的URI也就是存放网页文件或者程序的文件名,比如1.2图中的c的/dir/file1.html,也就是定位资源的位置。“进行什么样的操作”–操作方法,操作方法也就是需要web服务器完成什么样的工作,主要就是get和post方法,get方法:当我们访问web服务器获取网页数据的时候使用的方法。 post方法也就是提交表单数据到web服务器的时候,比方说就是淘宝买东西提交信息的时候,还有就是使用post方法的时候,URI会指向web服务器中一个应用程序的文件名,在请求消息中,post方法不光只将方法和URI发送给web服务器,还要将提交的数据一起交给web服务器。

1.4 生成HTTP请求消息

   现在咱们回到1.2,web浏览器解析URL之后,现在就会正式生成需要发送给web服务器的请求消息。具体请求消息的内容及其格式如下图所示
在这里插入图片描述

   需要注意的就是get方法的时候,请求消息的消息体中没有任何信息。但是如果是post方法的话,就需要将表单中的信息全部填写在消息体中。

1.5 发送请求消息后会收到响应

   当web服务器收到请求消息的时候,就会响应该消息,响应消息的第一行会有状态码,状态码可以知道执行的结果
在这里插入图片描述
状态码的类型,这里最常见的就是404错误,也就是客户端方向的问题
在这里插入图片描述
   还有需要注意的点就是,每条请求消息中只能写一个URI,这里所显示出来的网页信息可能嵌套着图片,这张图片又得单独发送一个请求消息。


2.向DNS服务器查询web服务器的IP地址

2.1 IP地址的基本常识

    生成HTTP消息之后,需要委托操作系统将消息发送给web服务器,因为web浏览器不具有将信息发送到网络的功能。 在进行这个操作之前,因为委托操作系统发送消息的时候,必须提供通信对象的IP地址,所以需要查询到web服务器的IP地址,才能将消息发送到web服务器。
   互联网和公司内部的局域网都是通过TCP/IP的思路进行设计的,下面我们来看这种思路设计的网络图
在这里插入图片描述
   这种设计模式,也就是将若干个子网通过路由器相连接,从而形成一个比较大的网络,每个子网中包括集线器和若干台计算机相连接,网络中所有设备都会分配一个IP地址,这种地址将相当于宿舍楼,比方我在5楼21号房间,也就是说子网就相当于五楼,房间号就是分配给计算机的,房间地址的整体就是所谓的IP地址,一个设备只有一个IP地址。
   IP地址就是一串32比特位的数字,分为四组,IP地址的组成包括网络号和主机号,无固定规律,可以自行分配。
在这里插入图片描述

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

   计算机可以向DNS服务器发送查询消息,也就是说计算机中必然存在DNS客户端,而计算机中相当于DNS客户端的就是DNS解析器,DNS解析器存在于操作系统中的socket库中,socket库是调用网络功能程序组件的集合。其中包含的组件可以给其他应用程序调用操作系统的网络功能。
   如下图所示,gethostbyname就是DNS解析器的程序名,后面括号里面就是需要解析的web服务器名。具体的解析过程看下面2.4的内容
在这里插入图片描述

2.3 解析器的内部原理

在这里插入图片描述
   操作系统中的协议栈–操作系统内部的网络控制软件,“协议驱动”“TCP/IP驱动”
    操作系统内部的协议栈向DNS服务器发送消息也需要知道DNS服务器的IP地址,DNS服务器的IP地址作为TCP/IP项目优先在计算机中设置好的。
在这里插入图片描述


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

3.1 DNS服务器的基本工作

   前面咱们说了DNS服务器的作用就是接收客户端的查询消息,然后根据消息返回响应。
   客户端的响应消息包括以下三种信息

  • 域名
  • class(用来识别网络中的信息,class值永远代表的是互联网的IN )
  • 记录类型(当类型为A时,对应的就是IP地址,当类型为MX时域名表现的就是邮件服务器,不同类型的表示的信息不一样)

在这里插入图片描述
DNS服务器会从域名与IP地址的对应表中查找相关数据,而且DNS服务器会根据域名的层次分为很多个,以方便查找,具体3.3会讲如何查找获取IP地址。

3.2 域名的层次结构

   互联网中只有一台DNS服务器是不可能的,整个互联网有特别多的服务器,想要将这些服务器对应的IP保存就会需要很多的DNS服务器来帮忙。
   DNS服务器中的所有信息都是根据域名的层次结构来划分的,层次结构能让我们更好的保存并查询IP,很好的提高了查询的效率。
   DNS中的域名都是用点号来隔断的,比方说www.csdn.com,点号分隔出不同的层级,在域名中越靠右边级别越高,拿学校比方,com就是学校,然后csdn就是某一学院,www就是csdn的www,层级相当于专业。就是按照这种层次结构将域名信息放入DNS服务器中。每一个层级也就域
   一个域的信息只能存入一个DNS服务器,但是一个DNS服务器中可以存放多个域。这里为了方便理解,假设一台服务器只能存放一个域。那么就是每个域存入一个DNS服务器中,com存入一个DNS服务器,csdn存入一个DNS服务器,www存入一个DNS服务器

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

   互联网中有上万台DNS服务器,不可能一台一台的去找,DNS服务器之间肯定有对应连接的关系。
   具体方法也就是负责管理下级域的IP地址存入上级域中,也就是就csdn.com这个域DNS服务器的IP地址注册到com域的DNS服务器中,这样就可以通过上级DNS服务器查询DNS服务器的IP,也可以向下级DNS服务器发送查询消息。
   com/cn这种域并不是顶级域,也就是说还有比com这种级别还高的域,也就是根域,其实www.csdn.com的全称是www.csdn.com.这儿还有一个点,这个点就代表是根域,根域的DNS服务器里面保存这com/cn这种域的DNS服务器的IP。
这就是客户端查询IP的全过程
在这里插入图片描述

补充:分配给根域的DNS服务器的IP全世界就13个,IP是13个,但是对应的DNS服务器还是挺多的。实际上根域DNS服务器的相关信息已经包含在DNS服务器程序的配置文件中。只要安装了DNS服务器程序,这些都会自动配置。

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

   DNS服务器有一个缓存功能,不是每次都需要从根域开始查找,DNS服务器有缓存功能,如果之前查过,需要再次查找信息就可以从缓存中找到对应的信息,提高了效率但是呢,缓存会有一个有效期,时间到了,DNS服务器就会i自动将数据删除。而且在对查询响应的时候,DNS服务器会告诉客户端返回的是来自缓存还是该域名的DNS服务器。

注:通过DNS服务器查询IP的操作也适合所有的应用程序


4.委托操作系统的协议栈发送消息

4.1 数据收发

   现在知道了IP地址,web浏览器就可以向web服务器发送消息了,现在内容就是数据的接收and发送。要发送给web服务器的是HTTP消息(是一种数字信息),可以委托操作系统的协议栈来发送信息。 这个过程需要调用socket库中的多个组件,跟查询IP不一样,查询IP只需要调用一个程序组件就ok,发送消息的过程复杂得多,所以需要多个组件来进行操作。
   过程就是向操作系统的协议栈发出委托,然后按照指定顺序调用socket库中的程序组件。
   那么操作系统的协议栈如何与web服务器进行连接从而传递信息呢?
   简单来说,也就是两个设备连接了一个数据管道,数据沿着管道流动,数据的流动是双向的。
收发数据的具体过程

  • 1.创建套接字
  • 2.将管道连接到服务器的套接字上
  • 3.收发数据
  • 4.断开管道并且删除套接字
    在这里插入图片描述

浏览器是不会做这些工作的,上面这些工作还是委托的操作系统的协议栈来完成的。具体的操作是调用socket库中的程序组件来完成的。

4.2 创建套接字阶段

   客户端创建套接字只需要调用socket里面的程序组件就可以,调用socket后,控制流程会转向socket库内部创建套接字,完成之后交给应用程序,套接字创建完成之后,协议栈会返回一个描述符,用来识别不同的套接字。
在这里插入图片描述

4.3 连接管道

   连接阶段就是将客户端的套接字和web服务器的套接字连接上,这里调用的是socket库中connect程序组件,调用这个组件的时候,需要注意三个参数就是描述符,服务器IP,端口号。 协议栈会将对象的IP的端口保存在套接字中。
   描述符是用来让一台计算机内部识别套接字的机制,端口号就是让通信的另一方来识别套接字的的机制。参数中有IP地址是因为收发操作的时候双方都必须知道对方的IP。
IP和端口号:客户端和服务器用来识别对方的机制
注:web的是80端口;

4.4 通信阶段

   将管道连接之后,然后就是进行数据的收发的工作,因为应用程序无法控制套接字,因此还是要通过socket库委托操作系统的协议栈来完成这个操作,这个操作使用的是write组件。调用write的时候需要指定描述符和发送数据(http消息),然后协议栈就将其发送至web服务器。
   接下来就是服务器接收数据的过程,服务器收到信息之后就会像客户端返回响应消息,客户端(浏览器)接收响应消息需要调用socket中的read组件委托协议栈完成,socket调用read先指定一块接收响应消息的接收缓冲区(应用程序内的内存空间)

4.5 断开阶段

   当客户端(浏览器)接收完web服务器的响应消息之后就需要断开连接释放资源。
   这个过程需要调用socket库中的close组件,然后连接管道的套接字就会断开,套接字本身也就被删除了。
   断开的详细过程:web的HTTP协议规定,当web服务器发送完响应消息之后,会主动断开连接,因此web服务器会先调用close,然后当浏览器read完响应消息之后会告诉浏览器连接已经都都断开,浏览器知道后也调用close。
   注意:因为HTTP消息每次只能响应单个文档或者图片,这样的话一般网页都会有嵌套多个图片或者文档,每次连接都断开的效率太低了,因此,在HTTP1.1版本中,当所有数据都接收完之后,浏览器再自动断开连接。

  • 32
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 46
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值