HTTP 权威指南 详解 ( 一、概述 )
最近在解读 《http权威指南》 这本书。之前对于http 的理解仅限于 知道我需要向服务端发送一个 get or post 请求,然后等待服务器 返回给我数据,我再进行下一步的操作,可能作为一名 前端er 会经常这么干吧,但是 我们每天都要用到的 http 请求 到底是一个怎么样的黑盒子呢? 今天刚好有时间,咱们就一起来 探索这部分的未解之谜。
tips
同样,我们在阅读一本书的时候,特别是 技术类的书的时候,我们希望能够带着问题来阅读,那样就会不断的在思考,而不是一味的 接收书中给你灌输的知识,从而更好的理解吧
Questions
- http 是什么?
- http 用来干嘛?
- http 长什么样子?
- http 的底层是通过什么来实现的?
带着上面的三个问题,我们来继续往下走:
http (Hypertext Transfer Protocal) 翻译过来就是 超文本传输协议。对,它就是一个 在 万维网(www) 进行通信的时候,所使用的 一个【协议】。
同时,作为前端开发来讲,我们平时见到的 最多的就是 web浏览器 和 web服务器之间的双工通信。(什么是双工,作为一名 通信专业毕业的学生来说。我TM自己都快忘了,什么是双工通信。 其实 双工通信呢还有个弟弟是 单工通信,是两种完全不一样的通信方式,我们可以了解成为 单向通信 和 双向通信。) 当然 http 在别的领域也存在使用,这里我们暂时不讨论。
一、http 是什么?
这里就来解释下,http 是什么?
http 是一个协议,这个协议就是为了 万维网 间通信使用的 一个 协议,说白了就是 人为制定的 一个 协议。
我们常见的就是 web 浏览器 和 web 服务器 之间的 通信,使用的就是 http 这么一个 协议。
再通俗一点的解释就是 一个 中国人 和 一个 老外 见面聊天,但是由于 语言不同,就需要一个翻译 来 进行双向翻译, 那么这个 http 就充当了 翻译 这么一个角色。 当 客户端 和 服务端 之间 在进行 数据通信的时候,这个协议就起到了 很好的作用。
二、http 用来干嘛?
上面解释了 http 是什么, 接下来,我们来看看 http 具体是用来干嘛的?
我们每天 上班的时候打开的 baidu.com zhihu.com 等等这些。 在最开始 我们输入域名的那一刻起,到最后我们看到整个页面的时候,这里面的每一个细节都离不开 http 。(有这么神奇么?)
对,就是这么神奇。 比如拿 百度的例子来说明。 我们输入 baidu.com 之后,往往会由极短的 loading 的时间, 那么在这个短短的 时间里面, 具体发生了哪些事情呢?
首先,baidu.com 的首页是 一个 html 文件,那么 我们在 浏览器 输入 baidu.com 然后按下 enter 的一瞬间,浏览器会先 查找 本地host 文件,有没有对应 域名的 ip 如没有,会去 联网 做dns 解析,找到对应的 ip 地址,然后访问 对应 ip 的 服务器,并 发送 http 【请求】, 这个请求 一般均为 请求 index.html 文件。(当然也可以是别的 命名,看服务器如何配置。)
然后, 服务器 接收到这个请求之后呢? 就会 在自己的 服务器中进行 文件的 查找,找啊找,哎? 找到了 index.html 文件, 就将 html 文件中的内容读取出来,并通过 http 【响应】 将 index.html 文件中的内容返回给 客户端。
客户端(这里一般指的是 web浏览器)接收到 服务器 返回的 http 响应到内容。从而进行页面的渲染等等一系列的动作。最后我们就能在页面上看到一个完整的页面了。
这里大概就简单了解释了下, http 的具体的工作方式。
三、http 长什么样子?
那么介绍完上面的 内容,那么 http 协议在 具体的 应用中长什么样子呐?
首先,我们以 《http 权威指南》 书中的 图为例子
那么具体解释下来就是 http 包含了 两部分, 一个是 http 的请求报文,另外就是 http 的响应报文。
1. 请求报文: 请求起始行,请求首部,请求主体( 若请求不带参数,则为空 )
2. 响应报文: 响应起始行, 响应首部,响应主体
请求起始行
主要是 介绍了 请求方法、请求资源、http的版本
响应起始行
主要是 返回了 http 版本,以及响应的状态码
请求首部
Connection: 保持帮连接
Connection-type: 连接 类型
user-agent 请求客户端信息(浏览器版本,系统版本等等)
host: 域名
accept:接收文件类型 文档,图片等
accept-language: (接收文档语言类型)
cookie: 请求的时候会自动 带上该页面的 cookie
响应首部
Date: 格林威治时间
server: 服务端信息(服务器版本等等)
last-modifie: 最后一次链接时间
content-length: 响应内容长度
content-type: 响应内容的 文件类型
请求主体:
如果该请求包含了请求字段: 那么请求主体均为 parameters
响应主体:
根据请求的 文档类型进行对应的返回, 比如 text/html 则返回 html 的 文档
我们常见的可能是 返回的一个 数据对象。等等
TIPS
我们再拿百度首页为例:
这是一个 http 请求以及响应,这里的 general 可以理解成为 http 请求 和 响应 的请始行 的一个 公共部分
1、general
http 请求 和 响应 的请始行 的一个 公共部分
http 响应头部, 包含了各种 属性
http 请求头部,同样也包含了各种属性(其中具体具备什么功能这里不细说,后面会介绍到)
4、query string parameters
get 方法 在 http 请求时候带的参数, 这里也就是 【请求主体】
5、 response
这里就是 http 响应 的 主体。
总结
以上内容就是 http 请求响应,具体的样子了。
四、http 能够现实的原理?
前面的 三小节,让我们大概知道了 http 具体是一个什么样子
那 为什么 这个协议就能够完成 数据通信呢? 其深层次的 原理是什么?
Tips
这个时候,我们就得回到我们大学时候上 的 计算机课程 基础篇章了。(大学不努力,老大做PM)
还是上一张图,来说明问题。
计算机网络通信 原理, 经典图。
http 处于 这五层中 应用层,也就是说 http这一层其实是不涉及到 数据通信功能的。它只是在 为通信之前做了一系列的 准备工作而已。(具体是什么,我们在后面的具体章节再具体介绍。)
那么 接下来就简单了, http 不需要关心 网络通信的具体细节,这些细节都交给了 可靠的 TCP/IP 也就是
传输层 和 网络层 。
写在最后, intelnet 自身就是 基于 TCP/IP,TCP/IP 是全世界计算机和网络设备常用的层次化分组交互网络协议集合。只要建立了 TCP/IP 连接,客户端 和 服务器之间的 报文交换就不会丢失,不会被破坏。也不会在接收时出现错误的顺序等问题,总之 TCP/IP 就是很靠谱。http 把数据通信 交给 它,剩下的就 交给网速了吧,当然服务器不能太差,服务器中存在的一些 读写操作也不能不优化,之前的一家公司,生产环境 一个 api 能响应 5,6 秒钟,后端 coder 也无动于衷也是心累。