网络笔记--浏览器生成消息

        最近在复习网络这一块,这一节主要介绍浏览器相关知识,了解文章之前,看看这些问题是否能回答,如下:1 浏览器如何解析网址;2 浏览器如何进行 DNS 服务器查询域名对应的 IP 地址等等

  1.1 生成HTTP请求消息
  1.1.1 输入网址

      URL: Uniform Resource Locator, 统一资源定位符。浏览器是一个具备多种客户端功能的综合性客户端软件, 因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据, 而各种不同的 URL 就是用来干这个的, 比如访问 Web 服务器时用“http:”,而访问 FTP 服务器时用“ftp:”。

     FTP: File Transfer Protocol,文件传送协议。这是一种在上传、下载文件时使用的协议。使用 FTP 协议来传送文件的程序也被叫作 FTP

   端口号:一个用来识别要连接的服务器程序的编号。 不同的服务器程序会使用不同的编号, 例如 Web 是 80, 邮件是 25 等

   协议: 通信操作的规则定义称为协议(protocol) 

   1.1.2 浏览器先要解析 URL

     浏览器要做的第一步工作就是对 URL 进行解析, 从而生成发送给 Web服务器的请求消息。栗子: http://www.lab.glasscom.com/dir1/file1.html 按格式将其中的各个元素拆分出来,其中包含 Web 服务器名称www.lab.glasscom.com, 以及文件的路径名 /dir1/file1.html,

  A: http://www.lab.glasscom.com/   B: http://www.lab.glasscom.comA与B的区别是什么?

A这个 URL 也是以“/”结尾的, 也就是说它表示访问一个名叫“/”的目录。 而且, 由于省略了文件名, 所以结果就是访问 /index.html 或者/default.htm 这样的文件了。B 结尾没有“/”,当没有路径名时, 就代表访问根目录下事先设置的默认文件 , 也就是/index.html 或者 /default.htm 这些文件,

        解析完 URL 之后, 我们就知道应该要访问的目标在哪里,接下来,浏览器会使用 HTTP 协议来访问 Web 服务器,对 URL 进行解析之后, 浏览器确定了 Web 服务器和文件名, 接下来就是根据这些信息按照规定的格式来生成 HTTP 请求消息了。

       消息体: 包含客户端向服务器发送的数据,例如用POST方法向Web服务器发送的网页表单数据

      如果对表单不了解,可以找个静态网页来练练手。

   HTTP主要的头字段:
   通用头:      适用于请求和响应消息的头字段
   Date         表示请求和响应生成的日期
   Pragma        表示数据是否允许缓存的通信选项
   Cache-Control  控制缓存的相关信息
   Connection     设置发送响应之后 TCP 连接是否继续保持的通信选项
  TransferEncoding   表示消息主体的编码格式
   Via            记录途中经过的代理和网关
  Authorization   身份认证数据
  From           请求发送者的邮件地址
 User-Agent       客户端软件的名称和版本号等相关信息
   Host           接收请求的服务器 IP 地址和端口号
  ContentLength   表示消息体的长度
  Content-Type    表示消息体的数据类型, 以 MIME 规格定义的数据类型来表示

        发送请求后会收到响应,在响应消息中, 第一行的内容为状态码和响应短语, 用来表
示请求的执行结果是成功还是出错。 状态码和响应短语表示的内容一致, 但它们的用途不同。 状态码是一个数字, 它主要用来向程序告知执行的结果

      状态码的第一位数字表示状态类型, 第二、 三位数字表示具体的情况。 下表列举了第一位数字的含义。

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

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

 1.2.1 IP 地址的基本知识

      生成 HTTP 消息之后, 接下来我们需要委托操作系统将消息发送给 Web服务器。 尽管浏览器能够解析网址并生成 HTTP 消息, 但它本身并不具备将消息发送到网络中的功能, 因此这一功能需要委托操作系统来实现那就是查询网址中服务器域名对应的 IP 地址。 在委托操作系统发送消息时, 必须要提供的不是通信对象的域名, 而是它的 IP 地址。因此, 在生成 HTTP 消息之后, 下一个步骤就是根据域名查询 IP 地址。

      互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的,是由一些小的子网, 通过路由器 连接起来组成一个大的网络。 这里的子网可以理解为用集线器 连接起来的几台计算机 , 我们将它看作一个单位, 称为子网。 将子网通过路由器连接起来, 就形成了一个网络

路由器: 一种对包进行转发的设备(一些家用路由器中已经内置了集线器功能, 因此大家可以理解为这种路由器内部同时包含路由器和集线器两种设备) 

集线器: 一种对包进行转发的设备, 分为中继式集线器和交换式集线器两种

       在网络中, 所有的设备都会被分配一个地址。 这个地址就相当于现实中某条路上的“×× 号 ×× 室”。 其中“号”对应的号码是分配给整个子网的,而“室”对应的号码是分配给子网中的计算机的, 这就是网络中的地址。 “号”对应的号码称为网络号, “室”对应的号码称为主机号, 这个地址的整体称为 IP 地址.通过 IP 地址我们可以判断出访问对象服务器的位置, 从而将消息发送到服务器。发送者发出的消息首先经过子网中的集线器 , 转发到距离发送者最近的路由器上 。 接下来, 路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器, 即消息再次经过子网内的集线器被转发到下一个路由器 。 前面的过程不断重复, 最终消息就被传送到了目的地。

 数据是以包的形式传送的。

       TCP/IP网络是由小的子网通过路由器连接起来组成的。子网可以理解为邮寄地址中的门牌号,其中的每一台计算机都会被分配一个房间号,类似某条路的"xx号xx室"。送快递的时候快递单上会有收件地址和姓名,同样地,通信数据在发送时也会标记访问目标的地址。路由器会根据地址判断这个包应该去往哪里,并将包转发到正确的方向。经过这一系列这样的转发操作,数据就能到达目的地。

IP的基本思路: IP 地址是一串3432 比特的数字, 按照 8 比特(1 字节) 为一组分成 4 组,分别用十进制表示然后再用圆点隔开。 这就是我们平常经常见到的 IP 地址格式,仅凭这一串数字我们无法区分哪部分是网络号, 哪部分是主机号。 在 IP地址的规则中, 网络号和主机号连起来总共是 32 比特, 在组建网络时, 用户可以自行决定它们之间的分配关系, 因此, 我们还需要另外的附加信息来表示 IP 地址的内部结构。

a IP地址主体的表示方法
 10.11.12.13

 b 采用与IP地址主体相同的格式表示子网掩码方法
  10.11.12.13/255.255.255.0 (IP地址主体/子网掩码)

主机号部分的比特全部为 0 或者全部为 1 时代表两种特殊的含义。 主机号部分全部为 0 代表整个子网而不是子网中的某台设备,主机号部分全部为 1 代表向子网上所有设备发送包, 即广播

  IP 地址的主机号
  全 0: 表示整个子网
  全 1: 表示向子网上所有设备发送包, 即“广播”

1.2.2 域名和 IP 地址并用的理由

TCP/IP 网络是通过 IP 地址来确定通信对象的, 因此不知道 IP 地址就无法将消息发送给对方, 在委托操作系统发送消息时, 必须要先查询好对方的 IP 地址。可能你会问“既然如此, 那么在网址中不写服务器的名字, 直接写 IP 地址不就好了吗? 然而, 就像你很难记住电话号码一样, 要记住一串由数字组成的 IP 地址也非常困难。 因此, 相比 IP 地址来说, 网址中还是使用服务器名称比较好

1.2.3 Socket 库提供查询 IP 地址的功能
  查询 IP 地址的方法非常简单, 只要询问最近的 DNS 服务器“www.lab.glasscom.com 的 IP 地址是什么”就可以了, DNS 服务器会回答说“该服务器的 IP 地址为 xxx.xxx.xxx.xxx”。 这一步非常简单, 很多读者也都很熟悉, 那么浏览器是如何向 DNS 服务器发出查询的呢?

      向 DNS 服务器发送查询消息, 并接收服务器返回的响应消息。换句话说, 对于 DNS 服务器, 我们的计算机上一定有相应的 DNS 客户端, 而相当于 DNS 客户端的部分称为 DNS解析器, 或者简称解析器。 通过 DNS 查询 IP 地址的操作称为域名解析, 因此负责执行解析(resolution) 这一操作的就叫解析器(resolver) 了。

       解析器实际上是一段程序, 它包含在操作系统的 Socket 库中, Socket 库 中包含的程序组件可以让其他的应用程序调用操作系统的网络功能, 而解析器就是这个库中的其中一种程序组件。Socket 库是在加州大学伯克利分校开发的 UNIX 系操作系统 BSD 中开发的 C 语言库, 互联网中所使用的大多数功能都是基于 Socket 库来开发的。 因此, BSD 之外的其他操作系统以及C 语言之外的其他编程语言也参照 Socket 库开发了相应的网络库。 可以说, Socket 库是网络开发中的一种标准库。 总的来说 Socket 库是用于调用网络功能的程序组件集合。

1.3 全世界 DNS 服务器的大接力

1.3.1 DNS 服务器的基本工作
        DNS 服务器的基本工作就是接收来自客户端的查询消息, 然后根据消息的内容返回响应。其中, 来自客户端的查询消息包含以下 3 种信息。

(a) 域名
    服务器、 邮件服务器(邮件地址中 @ 后面的部分) 的名称
(b) Class
      在最早设计 DNS 方案时, DNS 在互联网以外的其他网络中的应用也被考虑到了, 而 Class 就是 用来识别网络的信息。 不过, 如今除了互联网并没有其他的网络了, 因此 Class 的值永远是代表互联网的 IN
(c) 记录类型
      表示域名对应何种类型的记录。 例如, 当类型为 A 时, 表示域名对应的是 IP 地址; 当类型为 MX 时, 表示域名对应的是邮件服务器。对于不同的记录类型, 服务器向客户端返回的信息也会不同DNS 服务器上事先保存有前面这 3 种信息对应的记录数据, 如图 1.14所示。 DNS 服务器就是根据这些记录查找符合查询请求的内容并对客户端作出响应的。

 1.3.2 域名的层次结构
      DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的。层次结构这个词听起来可能有点不容易懂, 其实就类似于公司中的事业集团、 部门、 科室这样的结构。 层次结构能够帮助我们更好地管理大量的信息。

     DNS 中的域名都是用句点来分隔的, 比如 www.lab.glasscom.com, 这里的句点代表了不同层次之间的界限, 就相当于公司里面的组织结构不用部、 科之类的名称来划分, 只是用句点来分隔而已 。 在域名中, 越靠右的位置表示其层级越高, 比如 www.lab.glasscom.com 这个域名如果
按照公司里的组织结构来说, 大概就是“com 事业集团 glasscom 部 lab科的 www”这样。 其中, 相当于一个层级的部分称为域。 因此, com 域的下一层是 glasscom 域, 再下一层是 lab 域, 再下面才是 www 这个名字 

 1.3.3 寻找相应的 DNS 服务器并获取 IP 地址
       首先, DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的。DNS 中的域名都是用句点来分隔的, 比如 www.lab.glasscom.com, 这里的句点代表了不同层次之间的界限, 就相当于公司里面的组织结构不用部、 科之类的名称来划分, 只是用句点来分隔而已 。 在域名中, 越靠右的位置表示其层级越高, 比如 www.lab.glasscom.com 这个域名如果按照公司里的组织结构来说, 大概就是“com 事业集团 glasscom 部 lab科的 www”这样。 其中, 相当于一个层级的部分称为域。 因此, com 域的下一层是 glasscom 域, 再下一层是 lab 域, 再下面才是 www 这个名字。

     如何找到 DNS 服务器中存放的信息。 这里的关键在于如何找到我们要访问的 Web 服务器的信息归哪一台 DNS 服务器管。

客户端首先会访问最近的一台 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址) , 假设我们要查询www.lab.glasscom.com 这台 Web 服务器的相关信息。 由于最近的 DNS 服务器中没有存放 www.lab.glasscom.com 这一域名对应的信息, 所以我们需要从顶层开始向下查找。 最近的 DNS 服务器中保存了根域 DNS 服务器的信息, 因此它会将来自客户端的查询消息转发给根域 DNS 服务器。 根域服务器中也没有www.lab.glasscom.com 这个域名, 但根据域名结构可以判断这个域名属于 com 域, 因此根域 DNS 服务器会返回它所管理的 com 域中的 DNS服务器的 IP 地址, 意思是“虽然我不知道你要查的那个域名的地址, 但你可以去 com 域问问看”。 接下来, 最近的 DNS 服务器又会向 com 域的 DNS 服务器发送查询消息。 com 域中也没有
www.lab.glasscom.com 这个域名的信息, 和刚才一样, com 域服务器会返回它下面的 glasscom.com 域的 DNS 服务器的 IP 地址。 以此类推, 只要重复前面的步骤, 就可以顺藤摸瓜找到目标 DNS 服务器 , 只要向目标 DNS 服务器发送查询消息, 就能够得到我们需要的答案,也就是 www.lab.glasscom.com 的 IP 地址了。收到客户端的查询消息之后, DNS 服务器会按照前面的方法来查询 IP地址, 并返回给客户端 。 这样, 客户端就知道了 Web 服务器的 IP 地址, 也就能够对其进行访问了 如下图:

1.4 委托协议栈发送消息
   1.4.1 数据收发操作概览

  
   知道了 IP 地址之后, 就可以委托操作系统内部的协议栈向这个目标 IP地址, 也就是我们要访问的 Web 服务器发送消息了。 要发送给 Web 服务器的 HTTP 消息是一种数字信息(digital data) , 也可以说是委托协议栈来发送数字信息。 收发数字信息这一操作不仅限于浏览器, 对于各种使用网络的应用程序来说都是共通的。因此,通过 DNS 服务器查询 IP 地址的操作也同样适用于所有网络应用程序。 和向 DNS 服务器查询 IP 地址的操作一样, 这里也需要使用 Socket 库中的程序组件。向操作系统内部的协议栈发出委托时, 需要按照指定的顺序来调用 Socket 库中的程序组件。图3

  收发数据的操作分为若干个阶段, 可以大致总结为以下 4 个。
(1) 创建套接字(创建套接字阶段)
(2) 将管道连接到服务器端的套接字上(连接阶段)
(3) 收发数据(通信阶段)
(4) 断开管道并删除套接字(断开阶段)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值