网络是怎样连接的 第一章小记

《网络是怎样连接的第一章读书笔记》

一. 浏览器生成请求 – 探索浏览器内部

概览

浏览器发出一个请求会经历下面四步:

  • 生成http请求消息
  • 向DNS服务器查询web服务器的IP(如果使用的是域名)
  • 全世界的DNS服务器接力使得ip查询顺利进行
  • 委托协议栈发送消息

生成http请求消息

  1. URL 统一资源定位符 由协议+地址+路径组成,开头部分决定了协议(“http:”“ftp:”“file:”“mailto:”)
  2. 浏览器解析url是将它拆分解析的,如http请求的url,会拆分成http://, 域名/ip, 路径。 文件名为index.html/default.html时可以被省略。
  3. HTTP的基本思路:HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤,客户端发送的请求包含“对什么”(URI)进行什么样的操作(Method)
    F1.1
    收到HTTP请求后,服务器会根据Method和URI决定“对什么进行什么操作”,然后将结果放在响应消息中返回给客户端,浏览器对返回的消息做出展示,一次HTTP请求就完成了。
  4. 生成HTTP请求:
    http消息在格式上有很严格的规定, 浏览器会按照规范生成请求。
    请求消息的第一行称为请求行,这行开头的Method决定了”作何种操作”
    请求消息一般分为三部分Request(请求行), HEADERS(消息头), BODY(消息体)
    响应消息也分为三部分,分别是STATUS(状态行), HEADERS(消息头), BODY(消息体)
    F1.2

向DNS服务器查询WEB服务器的IP

  1. 局域网和广域网都是基于TCP/IP的思路设计的,简单来说呢就是通过路由器的链接,将小的子网连接成一个大的网络。IP就是分配给计算机的地址。请求通过集线器(Hub)-路由器(Router)-Hub-Router…的方式传输到目的地址。
  2. IP地址的网络号和主机号是由子网掩码决定的,子网掩码为0的部分是主机号, 1对应的位置为网络号。IP 地址的主机号全0表示整个子网,全1表示向子网上所有设备发送包,即“广播”。
  3. 域名的作用是方便人,但是路由器处理IP效率更高,所以有了折中的方案 —— DNS
  4. 通过DNS 查询IP 地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)。DNS解析器包含在系统的socket库中。
    调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS 服务器会返回响应消息。响应消息中包含查询到的IP 地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中,这样就完成了一次域名解析。
    5.浏览器调用解析器时,解析器会委托系统内部的协议栈向DNS服务器发送请求,收到响应消息,解析器读取消息后完成解析,在这个过程中,DNS服务的IP地址也必须知道。

全世界DNS服务器的接力

DNS服务器的基本工作

来自客户端的查询含有三个信息

  • 域名
  • Class DNS设计之初为其他网络预留的字段,现在固定IN
  • 记录类型
记录类型 作用
A记录 A(Address) 用来指定主机名(或域名)对应的IP地址记录。
NS记录 NS(Name Server) 域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
MX记录 MX(Mail Exchanger) 邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。
CNAME记录 CNAME(Canonical Name ) 别名记录,允许您将多个名字映射到同一台计算机。
TXT记录 TXT 一般指某个主机名或域名的说明

DNS 服务器的基本工作就是根据需要查询的域名和记录类型查找相关的记录,并向客户端返回响应消息。

域名的层次结构

将全球的所有服务器信息保存在同一台DNS服务器上是不可能的,所以需要将信息分部保存在不同的服务器上。

  1. DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的,以点分隔不同层次,每一个层次称为一个域。
  2. DNS 服务器中,而每个域都是作为一个整体来处理的。一个DNS服务器能存放多个域,而一个域不能分开存放在不同服务器上。
  3. 互联网中的域通过创建下级的域来分配给不同的国家、公司和组织使用。

寻找DNS服务器

  1. 最上级的域称为根域 用点表示,一般域名中可以省略
  2. 上级域名的服务器保存下级域名的服务器信息,逐级查询
  3. 另外将根域的服务器信息存在所有的DNS服务器中,这样所有的DNS服务器就能找到根域,在逐级往下查找。

F1.3

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

  1. 如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。
  2. 并且,当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。
  3. 为了防止之前查询过的信息发生改变导致解析错误,缓存都有一段时间的有效期。

委托协议栈发送消息

数据收发操作概览

要发送给Web 服务器的HTTP 消息是一种数字信息(digital data),因此也可以说是委托协议栈来发送数字信息。
使用Socket 库来收发数据的操作过程如图。简单来说,收发数据的两台计算机之间连接了一条数据通道,数据沿着这条通道流动,最终到达目的地。
F1.4

图中所示的通道需要通信双方事先建立, 建立管道的关键在于管道两端的数据出入口,称为套接字。
收发数据的操作分为若干个阶段:

  • 创建套接字阶段 —— 服务端先创造套接字,进入等待状态,客户端连接之前创建,为连接做准备
  • 连接阶段 —— 客户端将管道连接到服务端的套接字上
  • 通信阶段 —— 收发数据
  • 断开阶段 —— 由服务端或客户端发起,断开管道,删除套接字

这些操作都是由网络应用委托协议栈进行的。

创建套接字阶段

调用socket库创建套接字, 得到一个描述符(连接的唯一标识)

连接阶段,将管道联通

调用Socket库中的connect组件进行连接, 需要传入3个参数

  • 描述符 : 通过描述符使用特定的套接字进行连接
  • 服务器IP : 必要
  • 端口号: 同时指定IP和端口号时,就可以明确识别出服务端的套接字。
    * 如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制.

总而言之,就是当调用connect 时,协议栈就会执行连接操作。当连接成功后,协议栈会将对方的IP 地址和端口号等信息保存在套接字中,这样我们就可以开始收发数据了。

通信阶段: 数据收发

管道联通后,事情就变得简单了:将数据放入套接字,数据就会被发送到另一边的套接字。

断开阶段: 收发数据结束

Web 使用的HTTP 协议规定,当Web 服务器发送完响应消息之后,应该主动执行断开操作,因此Web 服务器会首先调用close 来断开连接。断开操作传达到客户端之后,客户端的套接字也会进入断开阶段。
HTTP 1.1中也存在一次连接中收发多个请求和响应的方法,这种情况,当所有数据请求完后,由客户端断开连接。