0. 概览
本书以用户在浏览器进行一次进行 HTTP 访问作为线索,讲述网络的运作机制。在用户在浏览器输入网址开始,到浏览器接显示出页面为止整的个过程中,全书按照控制权转移的顺序,依次介绍了网络的两个主要的组成部分:信息 传输机制(网络协议和路由器、交换机等) + 应用软件(浏览器、Web服务器),在整个网络请求之中,是如何分工和协作的。
1. 第一章
第一章中,主要介绍浏览器从接收到用户输入的 URL 开始,到开始发送 HTTP 请求消息这一过程。
- 解析 URL
- 生成 HTTP 报文
- 确定 Web 服务器 IP 地址
- 委托 OS 发送报文
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 请求才会用到
- 响应行
响应报文的第一行,由 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’的部分代表『主机号』
文章图片
为啥既要有 Domain ,又要用 IP 地址呢 ?Domain 是为了方便人记忆,而简短的 IP 地址,则能够减轻路由器路由的负担。1.3.3 全球 DNS 大接力 【《网络是怎样连接的》读书笔记--第一章】由于全球的域名数量,不止是成百上千,将所有的 Domain-IP地址 映射关系全部维护在同一台 DNS 服务器,是不可能做到的。因此,需要很多的 DNS 服务器分布式的存储 Domain-IP地址 的映射信息,那么,这些遍布全球的 DNS 服务器之间,是如何协作的呢?
DNS 的 IP 地址从哪来呢 ?它是作为 TCP/IP 的是个设置项目,在 OS 中提前设置好的,不需要去查询。
- 域名的层级关系
在介绍 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 个)
从 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。
推荐阅读
- 计算机网络笔记|计算机网络之HTTP协议详解
- 计算机网络|【计算机网络】HTTP 协议详解
- 面试|《面试八股文》之网络19卷
- JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
- 计算机相关知识|HTTP HTTPS
- http|Cookie、Session和Token的区别与联系
- 趣学Java|干掉Session(这个跨域认证解决方案真的优雅)
- 考研408|计算机网络——HTTP
- 计算机网络|【图解】HTTP/1.1到HTTP/2.0的演变