浏览器生成消息

浏览器

浏览器是一个具备多种客户端功能的综合性客户端软件,不同url来判断应该使用那种功能访问数据,比如访问web服务器使用http:,而访问FTP服务器使用ftp:。

URL

我们输入的网址,比如http://...这一串,我们叫做URL(Uniform Resource Locator,统一资源定位符)

image

生成http请求信息

http消息的格式

image

第二行是消息头,尽管通过第一行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来 存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的 数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。

发送请求后会收到响应

状态码   含义
1xx 	告知请求的处理进度和情况
2xx 	成功
3xx 	表示需要进一步操作
4xx 	客户端错误
5xx 	服务器错误

DNS解析相关

IP地址基本知识

局域网是基于TCP/IP的思路设计的,由小的子网再通过路由器连成一个大的网络,子网又是由集线器连接起来的几台计算机(可将其看作一个单位)。发出的消息通过子网的集线器到达最近的路由器,路由器再根据消息目的地判断下一个路由器位置,将消息发到下一个路由器(这其中经过了集线器才被发到了下一个路由器),直至目的地。

image

所有的设备都会被分配一个地址。由网络号和主机号组成,整个地址称为IP地址。

实际的 IP 地址是一串 32 比特的数字,按照 8 比特(1 字节)为一组分成 4 组,分别用十进制表示然后再用圆点隔开。这就是我们平常经常见到的 IP 地址格式,但仅凭这一 串数字我们无法区分哪部分是网络号,哪部分是主机号。

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

子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。将子网掩码按照和 IP 地址一样的方式以每 8 比特为单位用圆点分组后 写在 IP 地址的右侧。计算机发送数据要判断是否在同一个网络段,就会通过子网掩码来判断,在同一个网络段可以直接发送数据。

image

域名与IP地址

用户查询使用域名,路由器查询使用IP,这样子人们方便记忆,计算机也可以高效率查找匹配,因为域名字节数会多于IP地址。

DNS客户端(DNS解析器)

要查询域名的ip地址需要向DNS服务器发送查询消息,换句话说,我们计算机上一定要有相应的DNS客户端。又称之为DNS解析器,简称解析器。他其实是一段程序,存在于操作系统的socket库中。

调用解析器后,解析器会向 DNS 服务器发送查询消息,然后 DNS 服 务器会返回响应消息。响应消息中包含查询到的 IP 地址,解析器会取出 IP 地址,并将其写入浏览器指定的内存地址中。浏览器在Web 服务器发送消息时,只要从该内存地址取出 IP 地址,并将它与 HTTP 请求消息一起交给操作系统就可以了。

解析器原理

当控制流程转移到解析器后,解析器会生成要发送给DNS服务器的查询消息。这个过程与浏览器生成要发送给Web服务器的HTTP请求的过程类似,解析器会根据DNS的规格生成一条请告诉我www.lab.glass com点的IP地址的数据。并将它发送给DNS服务器.发送消息这个操作并不是由解析器自身来执行,而是要委托给操纵系统内部的协议站来执行。

解析器调用协议战后控制流程会再次转移。协议站会执行发送消息的操作,然后通过网卡将消息发送给DNS服务器。当DNS服务器收到查询消息后,他会根据消息中的查询内容进行查询。如果要访问的web服务器已经在DNS服务器上注册,那么这条记录就能够被找到,然后将其IP地址写入响应消息并返回给客户端。

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

image

域名层次结构

互联网中服务器数量过多,一个DNS服务器肯定不够存储。所以需要多台DNS服务器相互配合,查询信息。

DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的。

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

一般来讲,一个域的信息是作为一个整体存储,不能将一个域岔开存放在多台DNS服务器中(也有一个DNS服务器存储多个域的情况,但不增设复杂情况)

子域名

比如,假设公司的域名为example.co.cn,我们可以在这个域的下面创建两个子域及sub1 .example.co.cn和sub2 .example.co.cn然后就可以将这两个下级域名分配给不同的事业集团来使用。

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

这里的关键在于如何找到我们要访问的 Web 服务器的信息归哪一台 DNS 服务器管。DNS服务器有一个规律,由于上级DNS服务器保管着所有下级DNS服务器的信息,所以我们可以从根域开始,一路往下,顺藤摸瓜找到任意一个域的DNS服务器

在互联网中,com,jp的上面还有一层根域,通常在后面用一个.表示。 www.lab.glasscom.com.

一般忽略最后的点。根域服务器保存着com jp等DNS服务器的信息,我们也可以从根域开始向下寻找任意的DNS服务器。我们将根域的 DNS 服务器信息保 存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了,然后再一路向下寻找别的DNS服务器。

分配给根域服务器的IP地址较少,所以一般DNS服务器初始化配置的时候就可以获得这些地址。

客户端会首先访问最近的一台DNS服务器,也就是客户端的TCPIP设置中填写的DNS服务器地址。如图所示

image

image

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

有时候并不需要从最上级的根域开始查找,因为 DNS 服务器有一 个缓存 A 功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已 经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开 始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。

查询域名不存在的情况,也会被记录到缓存中。

但如果,缓存中的信息实际上经过了更改以后,我们还是直接套用缓存的结果,那么会得到错误的IP地址。因此,缓存是有有效期的。而且,在对查询进行响应时,DNS 服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的 DNS 服务器。

委托协议栈发送消息

知道IP地址之后,就可以委托操作系统内部的协栈上向这个目标IP地址,也就是我们要访问的web服务器发送消息了。

收发数据的操作大致为以下几点

  1. 创建套接字(创建套接字阶段)
  2. 将管道连接到服务器端的套接字上(连接阶段)
  3. 收发数据(通信阶段)
  4. 断开管道并删除套接字(断开阶段)
posted @ 2023-10-08 22:31  yunChuans  阅读(6)  评论(0编辑  收藏  举报