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

0. 概览 本书以用户在浏览器进行一次进行 HTTP 访问作为线索,讲述网络的运作机制。在用户在浏览器输入网址开始,到浏览器接显示出页面为止整的个过程中,全书按照控制权转移的顺序,依次介绍了网络的两个主要的组成部分:信息 传输机制(网络协议和路由器、交换机等) + 应用软件(浏览器、Web服务器),在整个网络请求之中,是如何分工和协作的。
1. 第一章 第一章中,主要介绍浏览器从接收到用户输入的 URL 开始,到开始发送 HTTP 请求消息这一过程。

  1. 解析 URL
  2. 生成 HTTP 报文
  3. 确定 Web 服务器 IP 地址
  4. 委托 OS 发送报文
1.1 解析 URL
URL 是什么 URL(Uniform Resource Locator)统一资源定位符,用于描述某一资源的位置,输入 URL 也就类似于,打电话时要先输入对方的电话号码,URL 标识了这次请求的协议类型和目的地。
URL 的几种类型 URL 开头到第一个 ":" 之前的部分,标识了 URL 的协议类型,如http、ftp、file 等。对于不同的网络协议,URL 的写法也有各自的规则,本书将重点介绍的是 HTTP 网络协议。
《网络是怎样连接的》读书笔记--第一章
文章图片

1.2 生成 HTTP 报文
经过解析 URL,我们已经知道了我们要访问的目标。接下来的一步,就是生成发送给访问目标的请求报文,请求报文的格式是有严格规定的。那么,我们再来看看 HTTP 报文的格式。
1.2.1 HTTP 请求报文的格式
  • 请求行
    请求报文的首行,由 Method + URI + HTTP-Version 共同组成,它们之间使用空格隔开。
    关于 method,method 用于标识请求的动作类型,如 添加、删除、读取,它的值并不在 URL 中体现,而是由浏览器根据实际情况来判定。
  • 消息头
    消息头与请求行之间没有空行,它由若干键值对组成,每个键值对占一行。消息头的最后,有一个空行,标识消息头结束,并以此来隔开消息头与消息体。
    字段名 : 字段值
    ··· ··· : ··· ···
  • 消息体
    消息体用于承载此次请求想要提交的信息,往往在 PUT、POST 请求才会用到
1.2.2 HTTP 响应报文的格式
  • 响应行
    响应报文的第一行,由 HTTP-Version + 状态码 + 状态短语 共同组成。响应报文的格式中,除了这第一行响应行的格式区别与请求行,其余部分的格式,都与请求报文一致。
  • 消息头
    格式同请求报文
  • 消息体
    格式同请求报文
《网络是怎样连接的》读书笔记--第一章
文章图片

1.3 获取 Web 服务器的 IP 地址
生成了请求报文之后,那么接下来就应该委托 协议栈向 Web 服务器发送报文了。但是,在发送报文之前,还存在一个问题,就是通过解析 URL,只拿到了目标资源的 Domain,而委托协议栈发报文,必须要提供的不是 Web 服务器的 Domain,而是 Web 服务器的 IP 地址。那么,什么是 IP,又怎样才能将 Domain 转化为 IP 呢?
1.3.1 IP 地址的基本知识
  1. IP 地址的格式:是一串 32 bit 的数字,8 bit(1 byte) 一组分为 4 组,每组之间用 " . " 隔开。
  2. IP 的内部构造:地址中包含『网络号』+『主机号』,但是,他们二者在 32 bit 中所占的位数,并不固定,而是在组件网络时由用户自定义的。因此,除了 IP 地址之外,还需要一个附加信息(子网掩码),来标识 IP 地址的内部构造。
  3. 子网掩码,与 IP 地址的长度相同,也是一串 32 bit 的数字。其中,左边一半都是 ‘1’,右边一半都是 ‘0’. 其中‘1’的部分代表网络号,‘0’的部分代表『主机号』
    《网络是怎样连接的》读书笔记--第一章
    文章图片
1.3.2 从 Domain 到 IP 地址:DNS 了解完什么是 IP 地址,接下来,再来说说怎样根据 Domain 来获取 IP 地址。此时,轮到 DNS (Domain Name System)闪亮登场了,DNS 是一种维护 Domain 和 IP 地址之间映射关系的网络服务器。因为在 Socket 库中,封装了查询 IP 地址的功能。所以,在创建 Socket 时,只要传入 Domain 就可以了,Socket 内部会执行对 DNS 的询问。
为啥既要有 Domain ,又要用 IP 地址呢 ?Domain 是为了方便人记忆,而简短的 IP 地址,则能够减轻路由器路由的负担。
DNS 的 IP 地址从哪来呢 ?它是作为 TCP/IP 的是个设置项目,在 OS 中提前设置好的,不需要去查询。
1.3.3 全球 DNS 大接力 【《网络是怎样连接的》读书笔记--第一章】由于全球的域名数量,不止是成百上千,将所有的 Domain-IP地址 映射关系全部维护在同一台 DNS 服务器,是不可能做到的。因此,需要很多的 DNS 服务器分布式的存储 Domain-IP地址 的映射信息,那么,这些遍布全球的 DNS 服务器之间,是如何协作的呢?
  1. 域名的层级关系
    在介绍 DNS 服务器之间的协作方式之前,先要介绍一下 Domain 的层级关系。域名是由 ‘ . ’ 分割的一个字符串。它的层级,也同样由 ‘ . ’ 来进行划分,越靠右侧的位置,层级越高。如 ‘https://dubbo.apache.org/’ 域名中,层级最高的是 ‘org’,其次是 ‘apache’,再次是 ‘dubbo’。
  2. 定位 DNS 服务器并取得 IP 地址
    既然 Domain 是分层级的,那么 DNS 服务器当然也会按照层级来进行存储。
    • 首先,全球共有 12 个根域名服务器,它们会存储一级域名的 DNS 服务 IP 地址;
    • 其次,维护一级域名的 DNS 服务器之中,又会存储它维护了自己域内的二级域名的映射关系的 DNS 服务器的 IP 地址;
    • 同理,三级 DNS 服务器,又维护了四级 DNS 服务器的 IP 地址,如此层层向下递进,直到拿到 跟完整 Domian 相匹配的 IP 地址,然后返回给发起请求的 DNS 客户端。
    • 另外,每台 DNS 服务器,都要维护 Root DNS 服务器的 IP 地址,如此一来,只要找到任何一台 DNS 服务器,就可以获取任意的一个域名对应的 IP 地址了。(Root DNS 服务器全球共有 12 个)
1.4 委托协议栈发送消息
从 DNS 那里取得了 Web 服务器的 IP 地址之后,满足了协议栈数据的要求,所以,下一步,浏览器将会委托协议栈向 Web 服务器发送报文了。
首先,协议栈将浏览器与 Web 服务器之间相互发送消息的动作,抽象成为了『管道与插孔』的模型。通讯时,在浏览器端、Web 服务器端,各有一个『插孔』,两个『插孔』由一根『管道』相连接,管道是双向的,双方都可以向管道读写数据。
  1. 服务端建立起 Socket『插孔』,等待被连接
  2. 浏览器创建 Socket,浏览器调用协议栈程序,创建一个 Socket ,并随机分配端口,由于浏览器程序同时可能会与多个 Web 服务器进行通信,因此,协议栈会返回一个描述符,用来标识这个新创建的 Socket。
  3. 浏览器发起连接,将两个 Socket 用一根管子连接起来(需要端口号),此时,浏览器需要告知协议栈三个参数,Socket 的描述符、Web 服务器的 IP 地址、Web 服务器的端口号。建立连接的同时,浏览器会将自己Socket 所使用的 IP 地址、端口号信息告知 Web 服务器,以便 Web 服务器向自己的 Socket 发送响应报文。
  4. 收发消息,两边的程序,分别向自己的 Socket 写入数据,并监听直到获取由 Web 服务器向自己的 Socket 所发送的相应报文。
  5. Web 服务器发送完响应报文,直接关闭 Socket ,或者等待浏览器关闭 Socket 后再关闭自己的 Socket。
这个小节中,从宏观上描述了 浏览器 与 Web 服务器双方进行通讯的机制,其中的具体细节,将在下一章中详细进行描述。

    推荐阅读