什么是HTTP
什么是 HTTP ?你肯定立马跳出:“HTTP 是超文本传输协议,就是 「H」yper「T」ext 「T」ransfer 「P」rotocol”。
这样回答还是过于简单,那到底什么是 “超文本”,什么是 “协议”?HTTP 下面还有哪些协议?HTTP 有什么缺点以及优点?
「超文本传输协议」 ,我们拆成三个部分,「超文本、传输、协议」。
我们还要知道 HTTP 不是互联网,也不是编程语言,是一种协议。HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协议相互交织,构成了一个协议网,而 HTTP 则处于中心地位。
互联网的世界是朴实无华且枯燥的,它好像是 “一张平坦且一望无际的巨大网络,每台电脑就是网络上的一个点,在这张网上跳动”。
但现实世界的网络却远比这个抽象的模型要复杂得多。实际的互联网是由许许多多个规模略小的网络连接而成的,这些“小网络”可能是只有几百台电脑的局域网,可能是有几万、几十万台电脑的广域网,可能是用电缆、光纤构成的固定网络,也可能是用基站、热点构成的移动网络……
互联网世界又好像是数不清的岛屿组成千岛之国。
协议
HTTP
是一个协议,不是开发语言,不是一个服务,也不是一种网络。只是一种协议、一种约定。那什么是协议呢?
现实生活中也随处可见。比如毕业时签 ”三方协议“,入职工作 ”合同协议“,还有 我们平时使用的软件 ”软件协议“。
其实一就是一种规范约定,约定双方需要遵守的东西,只有在这个规定下双方才能正确的执行对应动作和享有对应的权益。
如果「只有」你一个人,那你自然可以想干什么就干什么,想怎么玩就怎么玩,不会干涉其他人,其他人也不会干涉你,也就不需要所谓的“协议”。但是,一旦有了两个以上的参与者出现,为了保证最基本的顺畅交流,协议就自然而然地出现了。
协议意味着有多个参与者为了达成某个共同的目的而站在了一起,除了要无疑义地沟通交流之外,还必须明确地规定各方的“责、权、利”,约定该做什么不该做什么,先做什么后做什么,做错了怎么办,有没有补救措施等等。就像 JVM 虚拟机加载 class ,只有符合协议规定的东西 JVM 才能正确解析和加载。
划重点了老铁们:「HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。」
传输
HTTP 是一个“「传输协议」”,所谓的“传输”(Transfer)其实很好理解,就是把一堆东西从 A 点搬到 B 点,或者从 B 点搬到 A 点,即“A<===>B”。
HTTP 协议是一个“「双向协议」”。
也就是说,有两个最基本的参与者 A 和 B,从 A 开始到 B 结束,数据在 A 和 B 之间双向而不是单向流动。通常我们把先发起传输动作的 A 叫做「请求方」,把后接到传输的 B 叫做「应答方」或者「响应方」。
双方约定使用 HTTP 协议来通信,浏览器把一些数据发送给服务器,服务器再把数据返回给浏览器。
数据虽然是在 A 和 B 之间传输,但并没有限制只有 A 和 B 这两个角色,允许中间有“中转”或者“接力”。
这样,传输方式就从“A<===>B”,变成了“A<=>X<=>Y<=>Z<=>B”,A 到 B 的传输过程中可以存在任意多个“中间人”,而这些中间人也都遵从 HTTP 协议,只要不打扰基本的数据传输,就可以添加任意的额外功能,例如安全认证、数据压缩、编码转换等等,优化整个传输过程。
所以 「HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。」
超文本
所谓 “「文本」”(Text),就表示 HTTP 传输的不是 TCP/UDP 这些底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。
在互联网早期,“文本” 的确知识简单的文字,但是现在包含着 图片、视频、音频、压缩包。
从面含义理解:超文本,就是超越了普通文本,也就是 图片、视频、音频、压缩包等混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。
我们最熟悉的就应该是 HTML 了,它本身只是纯文字文件,但内部用很多标签定义了对图片、音频、视频等的链接,再经过浏览器的解释,呈现在我们面前的就是一个含有多种视听信息的页面。
OK,经过了对 HTTP 里这三个名词的详细解释,下次当你再面对面试官时,就可以给出比“超文本传输协议”这七个字更准确更有技术含量的答案:“「HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范」”。
如下图所示,HTTP 涉及的知识点。左边的部分是与 HTTP 有关系的各种协议,比较偏向于理论;而右边的部分是与 HTTP 有关系的各种应用技术,偏向于实际应用。
HTTP
浏览器
常见的浏览器有 Chrome、Firefox、Safari、IE、Edge、Opera 以及各种国产 “换壳” “极速” 浏览器。
「Web Browser」 顾名思义就是互联网资源浏览检索,本质就是 HTTP 协议中的 「请求方」 也可以说是客户端,通过 HTTP 协议获取互联网上的各种资源。
在 HTTP 协议里,浏览器的角色被称为 User Agent
用户代理,作为访问者的代理发起 HTTP 请求,不然我们总不能 使用 CURL 指令去发起请求。
WEB 服务器
浏览器是 HTTP 的请求方,那么协议的另一头就是 「应答方」,其实就是服务器。
它是 HTTP 协议里响应请求的主体,通常也把控着绝大多数的网络资源,在网络世界里处于强势地位。
其实还区分了 硬件和软件。
- 就是物理形式或“云”形式的机器,在大多数情况下它可能不是一台服务器,而是利用反向代理、负载均衡等技术组成的庞大集群。但从外界看来,它仍然表现为一台机器,但这个形象是“虚拟的”。
- 它就是提供
Web
服务的应用程序,通常会运行在硬件含义的服务器上。它利用强大的硬件能力响应海量的客户端 HTTP 请求,处理磁盘上的网页、图片等静态文件,或者把请求转发给后面的Tomcat
、Node.js
等业务应用,返回动态的信息。
CDN
浏览器发的请求通常不会直达服务器,不能一根肠子通到底,中间会经过 “各种关卡”,其中一个就是 CDN
。
CDN
: 全称是 Content Delivery Network
,就是 「内容分发网络」。它应用了 HTTP 协议里的缓存和代理技术,代替源站响应客户端的请求。让浏览器的请求不用“千里迢迢”地到达源站服务器,直接在“半路”就可以获取响应。如果 CDN 的调度算法很优秀,更可以找到离用户最近的节点,大幅度缩短响应时间。
爬虫
“爬虫”这个名字非常形象,它们就像是一只只不知疲倦的、辛勤的蚂蚁,在无边无际的网络上爬来爬去,不停地在网站间奔走,搜集抓取各种信息。
绝大多数是由各大搜索引擎“放”出来的,抓取网页存入庞大的数据库,再建立关键字索引,这样我们才能够在搜索引擎中快速地搜索到互联网角落里的页面。
理论
接下来就是 HTTP 接下来就是 HTTP 相关的协议理论,比如我们说的 TCP/IP、DNS、URI、HTTPS。
TCP/IP
TCP/IP 协议实际上是一系列网络通信协议的统称,其中最核心的两个协议是「TCP」和「IP」,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。
这个协议栈有四层,最上层是 “应用层”,最下层是 “链接层”, 第二层是 「传输层」,TCP 则在这一层,「IP」 属于 “「网际层」”。
IP 协议
「IP 协议」是“「I」nternet 「P」rotocol”的缩写,主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。IP 协议使用“「IP 地址」”的概念来定位互联网上的每一台计算机。可以对比一下现实中的 “时间管理大师罗老师“ 发微信聊妹场景。罗老师的手机就相当于互联网的计算机,而要发微信聊妹就需要安装微信,微信给每个人一个微信号,这个微信号就相当于 IP
地址。
TCP 协议
「TCP 协议」是“「T」ransmission 「C」ontrol 「P」rotocol”的缩写,意思是“传输控制协议”,它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流形式的通信,是 HTTP 协议得以实现的基础。
它的重点就是「控制数据传输」,“可靠”是指保证数据不丢失,“字节流”是指保证数据完整,所以在 TCP 协议的两端可以如同操作文件一样访问传输的数据,就像是读写在一个密闭的管道里“流动”的字节。
DNS
根据 TCP/IP协议我们知道使用 IP 标识计算机,但是对于人类记忆数字来区分则很困难,所以就出现了 “「域名系统」(Domain Name System)”,用一个有意义的名字代替 IP 地址,比如 baidu.com
我们就可以访问百度的搜索引擎,而不是去记 220.181.38.150
这样的数字。
“域名(Domain Name)” 又叫做 主机名(Host),为了更好的标记国家或者组织,也被设计成一个有层次的结构。
域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”。对于顶级域名,可能你随口就能说出几个,例如表示商业公司的“com”、表示教育机构的“edu”,表示国家的“cn”“uk”等。
但想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,“映射”到它的真实 IP,这就是所谓的“「域名解析」”。
URI/URL
有了TCP/IP DNS
,我们还需要统一资源标识符才能访问网络上的资源。DNS 和 IP 地址只是标记了互联网上的主机,但主机上有那么多文本、图片、页面,到底要找哪一个呢?
所以就出现了 URI(「U」niform 「R」esource 「I」dentifier),中文名称是 「统一资源标识符」,使用它就能够唯一地标记互联网上资源。
URI 另一个更常用的表现形式是 URL(「U」niform 「R」esource 「L」ocator), 「统一资源定位符」,也就是我们俗称的“网址”,它实际上是 URI 的一个子集,不过因为这两者几乎是相同的,差异不大,所以通常不会做严格的区分。
http://tomcat.apache.org/index.html
主要由三个部分组成:
- 协议:访问资源使用的协议
http
。 - 主机名:可以是域名或者 IP 地址,
tomcat.apache.org
。 - 资源路径:即资源在主机上的位置,使用“/”分隔多级目录,在这里是
/index.html
。
HTTPS
HTTPS 就相当于运行在 SSL/TLS 协议上的 HTTP。它是一个负责加密通信的安全协议,建立在 TCP/IP 之上,所以也是个可靠的传输协议,可以被用作 HTTP 的下层。相当于“HTTP+SSL/TLS+TCP/IP”。
SSL 的全称是“「S」ecure 「S」ocket 「L」ayer”,由网景公司发明,当发展到 3.0 时被标准化,改名为 TLS,即“「T」ransport 「L」ayer 「S」ecurity”,但由于历史的原因还是有很多人称之为 SSL/TLS,或者直接简称为 SSL。
SSL 使用了许多密码学最先进的研究成果,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,能够在不安全的环境中为通信的双方创建出一个秘密的、安全的传输通道,为 HTTP 套上一副坚固的盔甲。
代理
代理(Proxy)是 HTTP 协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答。
常见代理类型:
- 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
- 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;
- 正向代理:靠近客户端,代表客户端向服务器发送请求;VPN 就是一个例子
- 反向代理:跟服务端相关,代表服务端响应客户端的请求。
上一讲提到的 CDN,实际上就是一种代理,它代替源站服务器响应客户端的请求,通常扮演着透明代理和反向代理的角色。
由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:
- 负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;(反向代理)
- 内容缓存:暂存上下行的数据,减轻后端的压力;
- 安全防护:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;
- 数据处理:提供压缩、加密等额外的功能。
TCP/IP 网络分层
把复杂的网络通信划分为多个层次,每个层次负责自己的职责,单一职责,每个层次只专心做好自己的事情。如下图所示:
TCP/IP 四层协议
层次 「从下往上」:
- 第一层 「链路层」,负责在以太网、WIFI 这样的网络发送原始数据,在网卡这个层次工作,利用
MAC
地址标识设备。 - 第二层 「网际层」,IP 协议所在的层级,因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了。
- 第三层 「传输层」,主要职责就是保证数据在 IP 地址标记的两点之间 「可靠传输」,常见的这一层还有一个叫
UDP
。 - 第四层 「应用层」,下面三层把基础打好了,这一层就百花齐放,例如 Telnet、SSH、FTP、SMTP 等等,当然还有我们的 HTTP。
链路层(MAC)层传输的单位是帧(frame),IP 层传输的单位是包 (packet),TCP 层传输的单位是段(segment),HTTP 的传输单位就是消息或者说报文。也可以说是数据包。
MageByte