0. 概览
本书以用户在浏览器进行一次进行 HTTP 拜访作为线索,讲述网络的运作机制。在用户在浏览器输出网址开始,到浏览器接显示出页面为止整的个过程中,全书依照控制权转移的程序,顺次介绍了网络的两个次要的组成部分:信息 传输机制(网络协议和路由器、交换机等)+ 应用软件(浏览器、Web 服务器),在整个网络申请之中,是如何分工和合作的。
1. 第一章
第一章中,次要介绍浏览器从接管到用户输出的 URL 开始,到开始发送 HTTP 申请音讯这一过程。
- 解析 URL
- 生成 HTTP 报文
- 确定 Web 服务器 IP 地址
- 委托 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 地址的基本知识
- IP 地址的格局:是一串 32 bit 的数字,8 bit(1 byte)一组分为 4 组,每组之间用 ” . ” 隔开。
- IP 的外部结构:地址中蕴含『网络号』+『主机号』,然而,他们二者在 32 bit 中所占的位数,并不固定,而是在组件网络时由用户自定义的。因而,除了 IP 地址之外,还须要一个附加信息(子网掩码),来标识 IP 地址的外部结构。
- 子网掩码,与 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 服务器之间,是如何合作的呢?
- 域名的层级关系
在介绍 DNS 服务器之间的合作形式之前,先要介绍一下 Domain 的层级关系。域名是由‘.’宰割的一个字符串。它的层级,也同样由‘.’来进行划分,越靠右侧的地位,层级越高。如‘https://dubbo.apache.org/’域名中,层级最高的是‘org’,其次是‘apache’,再次是‘dubbo’。 -
定位 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 服务器端,各有一个『插孔』,两个『插孔』由一根『管道』相连接,管道是双向的,单方都能够向管道读写数据。
- 服务端建设起 Socket『插孔』,期待被连贯
- 浏览器创立 Socket,浏览器调用协定栈程序,创立一个 Socket,并随机调配端口,因为浏览器程序同时可能会与多个 Web 服务器进行通信,因而,协定栈会返回一个描述符,用来标识这个新创建的 Socket。
- 浏览器发动连贯,将两个 Socket 用一根管子连接起来(须要端口号),此时,浏览器须要告知协定栈三个参数,Socket 的描述符、Web 服务器的 IP 地址、Web 服务器的端口号。建设连贯的同时,浏览器会将本人 Socket 所应用的 IP 地址、端口号信息告知 Web 服务器,以便 Web 服务器向本人的 Socket 发送响应报文。
- 收发音讯,两边的程序,别离向本人的 Socket 写入数据,并监听直到获取由 Web 服务器向本人的 Socket 所发送的相应报文。
- Web 服务器发送完响应报文,间接敞开 Socket,或者期待浏览器敞开 Socket 后再敞开本人的 Socket。
这个大节中,从宏观上形容了 浏览器 与 Web 服务器单方进行通信的机制,其中的具体细节,将在下一章中具体进行形容。