HTTP是什么?HTTP又不是什么?


楔子

HTTP 我们都知道它是超文本传输协议,也就是 Hyper Text Transfer Protocol 这几个单词的首字母,但面试官肯定不会只问你 HTTP 是什么,他肯定会再追问你一些其它问题:

  • 你是怎么理解 HTTP 字面上的 "超文本" 和 "传输协议" 的?
  • 能否谈一下你对 HTTP 的认识?越多越好
  • HTTP 有什么特点?有什么优点和缺点?
  • HTTP 下层都有哪些协议?是如何工作的?
  • ......

要解决上面的那些问题,我们首先需要明白 HTTP 是什么?

HTTP 是什么?

先看一下 HTTP 的名字:"超文本传输协议",它可以拆成三个部分,分别是:超文本、传输、协议。我们从后往前来逐个解析,理解了这三个词,我们也就明白了什么是 HTTP。

首先,HTTP 是一个协议,那么协议又是什么呢?简单来讲,协议就是参与者都必须遵守的一组约定,其实协议并不仅限于计算机世界,现实生活中也随处可见。

例如,你在刚毕业时可能会签一个三方协议,找房子时会签一个租房协议,公司入职时还可能会签一个保密协议,工作中使用的各种软件也都带着各自的许可协议。它们和 HTTP 本质上是相同的。

然后是第二部分,传输。计算机和网络世界里有数不清的各种角色:CPU、内存、总线、磁盘、操作系统、浏览器、网关、服务器……。这些角色之间相互通信也必然会有各式各样、五花八门的协议,用处也各不相同,例如广播协议、寻址协议、路由协议、隧道协议、选举协议等等。

而 HTTP 是一个传输协议,所谓的传输(Transfer)很好理解,说白了就是将东西从一点搬到另一点。但是注意,这其中隐含了两个重要信息。

第一点,HTTP 传输是双向的,也就是说有两个最基本的参与者 A 和 B,A 可以发送数据给 B,B 也可以返回数据给 A。通常我们把先发起传输动作的 A 叫做请求方,接收到请求然后进行响应的 B 叫做响应方。比如我们登陆 bilibili 观看动漫,浏览器就是请求方,bilibili 网站就是响应方。双方约定使用 HTTP 协议来通信,于是浏览器把数据发送给网站,网站再把数据返回给浏览器、然后浏览器将其展示在屏幕上,这样我们就能看到有趣的番剧了。

第二点,数据虽然是在 A 和 B 之间传输,但并没有限制只有 A 和 B 这两个角色,中间允许有中转或者接力。也就是说 A 到 B 的传输过程中可以存在任意多个中间人,这些中间人也遵循 HTTP 协议,只要不打扰到基本的数据传输,就可以添加任意的额外功能,例如:安全认证、数据压缩、编码转换等等,从而优化整个传输过程。像我们平时挂的 威批恩 就可以理解为中间人。

最后是第三部分,也就是我们的超文本,不用想也知道它啃腚是客户端和服务端之间传输的数据,但是这个超文本具体代表的含义是什么呢?

所谓文本,就表示 HTTP 传输的不是 TCP/UDP 这些底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。在互联网早期,文本只是简单的字符文字,但发展到现在,文本的涵义已经被大大地扩展了,图片、音频、视频、甚至是压缩包,在 HTTP 眼里都可以算做是文本。

所谓超文本,就是 "超越了普通文本的文本",它是文字、图片、音频和视频等的混合体,最关键的是含有超链接,能够从一个超文本跳跃到另一个超文本,形成复杂的非线性、网状的结构关系。

对于超文本,我们最熟悉的就应该是 HTML 了,它本身只是纯文字文件,但内部用很多标签定义了对图片、音频、视频等的链接,再经过浏览器的解释,呈现在我们面前的就是一个含有多种视听信息的页面。

总结:HTTP 指的是超文本传输协议,它代表了客户端和服务端之间传输文字、图片、音频、视频等超文本数据的约定和规范,以及相关的各种控制和错误处理方式。

不要认为超文本只能传输文本,它也可以传输音频、图片等数据。

HTTP 不是什么?

现在我们知道了 HTTP 是什么?那么再来看看 HTTP 不是什么,也就是说 HTTP 不能干什么。

因为 HTTP 是一个协议,是一种计算机通信的规范,所以它不存在单独的实体。它不是浏览器、手机 APP 那样的应用程序,也不是 Windows、Linux 那样的操作系统,更不是 Apache、Nginx、Tomcat 那样的 web 服务器。但 HTTP 又与应用程序、操作系统、Web 服务器密切相关,在它们之间的通信过程中存在,而且是一种动态的存在,是发生在网络连接、传输超文本数据时的一个动态过程。

HTTP 不是互联网

互联网(Internet)是遍布于全球的许多网络互相连接而形成的一个巨大的国际网络,在它上面存放着各式各样的资源,也对应着各式各样的协议,例如超文本资源使用 HTTP,普通文件使用 FTP,电子邮件使用 SMTP 和 POP3 等。

但毫无疑问,HTTP 是构建互联网的一块重要拼图,而且是占比最大的那一块。

HTTP 不是编程语言

编程语言是人与计算机沟通交流所使用的语言,而 HTTP 是计算机与计算机沟通交流的语言,我们无法使用 HTTP 来编程,但可以反过来,用编程语言去实现 HTTP,告诉计算机如何用 HTTP 来与外界通信。

很多流行的编程语言都支持编写 HTTP 相关的服务或应用,例如使用 Python 编写 Web 服务,使用 JavaScript 在前端实现动态页面更新。

HTTP 不是 HTML

这个可能要特别强调一下,千万不要把 HTTP 与 HTML 混为一谈,虽然这两者经常是同时出现。HTML 是超文本的载体,是一种标记语言,使用各种标签描述文字、图片、超链接等资源,并且可以嵌入 CSS、JavaScript 等技术实现复杂的动态效果。单论次数,在互联网上 HTTP 传输最多的可能就是 HTML,但要是论数据量,HTML 可能要往后排了,图片、音频、视频这些类型的资源显然更大。

HTTP 不是一个孤立的协议

HTTP 不是一个能 "独善其身" 的协议,它也是构建在某些协议之上的。在互联网世界里,HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信(HTTPS)。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协议相互交织,构成了一个协议网,而 HTTP 则处于中心地位。

我们也可以把 HTTP 看成是 "与 HTTP 协议相关的所有应用层技术的总和。"

然后再来一张思维导图,基本上涵盖了与 HTTP 相关的的内容,后续慢慢介绍。

图的左半部分是与 HTTP 相关的各种协议,右半部分是与 HTTP 相关的各种应用技术。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM