http 简史

  1. HTTP 协议始于三十年前蒂姆·伯纳斯 - 李的一篇论文;

  2. HTTP/0.9 是个简单的文本协议,只能获取文本资源;

  3. HTTP/1.0 确立了大部分现在使用的技术,但它不是正式标准;

  4. HTTP/1.1 是目前互联网上使用最广泛的协议,功能也非常完善;

  5. HTTP/2 基于 Google 的 SPDY 协议,注重性能改善,但还未普及;

  6. HTTP/3 基于 Google 的 QUIC 协议,是将来的发展方向。

http 是什么

HTTP 是超文本传输协议

HTTP 的名字「超文本协议传输」,它可以拆成三个部分:

  • 超文本
  • 传输
  • 协议
HTTP三部分
HTTP三部分

协议是什么

协议是指两个或两个以上实体为了开展某项活动,经过协商后双方达成的一致意见。协议在法律上是合同的同义词。合同是当事人或当事双方之间设立、变更、终止民事关系的协议。

而协议必须要有两个或多个参与者,为了保证最基本的顺畅交流与对参与者的一种行为约定和规范。

例如,为了保证你顺利就业,“三方协议”里的参与者有三个:你、公司和学校;为了保证你顺利入住,“租房协议”里的参与者有两个:你和房东。

而有多个参与者并能正常交流还是不够的,还需要达成某个共同的目的而站在了一起,那么必须明确地规定各方的“责、权、利”,约定该做什么不该做什么,先做什么后做什么,做错了怎么办,有没有补救措施等等。例如,“租房协议”里就约定了,租期多少个月,每月租金多少,押金是多少,水电费谁来付,违约应如何处理等等。

而 HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。

传输

HTTP 是一个传输协议,就是传输的过程中都需要遵循这个协议,而传输就是字面上的意思,把一堆东西从 A 点传到 B 点,或者 B 点传到 A 点,但 A、B 两点之间是否还有其他的点进行传输那它就没有限制,允许有中转或接力,就像运动会上接力棒比赛一样,起点、终点规定有多少人是不限的,但要遵循比赛规则,而且还可以 A 到 B,然后 B 到 A,可以知道它是一个双向的协议

而在 HTTP 里,需要中间人遵从 HTTP 协议,只要不打扰基本的数据传输,就可以添加任意额外的东西,例如安全认证、数据压缩、编码转换等等,优化整个传输过程。

HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。

注意是两点之间,是不限制你在服务器还是客户端

超文本

我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算作「文本」。

再来理解「超文本」,它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。

HTML 就是最常见的超文本了,它本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,再经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页了。

超文本传输协议

使用一句话表达超文本传输协议

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

HTTP 的概念

在互联网世界里 HTTP 是最常见的也是最普遍的,当然还有其实的各自的专有协议,如常用的电子邮件、BT 和 Magnet 点对点下载、FTP 文件下载、SSH 安全登录、各种即时通信服务等等

不过由于 HTTP 协议非常灵活、易于扩展,而且“超文本”的表述能力很强,所以很多其他原本不属于 HTTP 的资源也可以“包装”成 HTTP 来访问,这就是我们为什么能够总看到各种“网页应用”——例如“微信网页版”“邮箱网页版”——的原因。

综合起来看,现在的互联网 90% 以上的部分都被 HTTP 所覆盖,所以把互联网约等于 HTTP 应该也不算大错。

浏览器

浏览器的正式名字叫“Web Browser”,顾名思义,就是检索、查看互联网上网页资源的应用程序,名字里的 Web,实际上指的就是“World Wide Web”,也就是万维网。

万维网,它基于 HTTP 协议,传输 HTML 等超文本资源,能力也就被限制在 HTTP 协议之内。

浏览器本质上是一个 HTTP 协议中的请求方,使用 HTTP 协议获取网络上的各种资源。

在 HTTP 协议里,浏览器的角色被称为“User Agent”即“用户代理”,意思是作为访问者的“代理”来发起 HTTP 请求,通常称之为“客户端”。

Web 服务器

Web 服务器是协议另一端的应答方(响应方)

而 Web 服务器一般都是 Apache、Nginx、IIS、Jetty/Tomcat 等

Nginx 使用的最普遍,特点是高性能、高稳定,且易于扩展。

爬虫

它也是一种用户代理,代替我们访问互联网

而无论是“爬虫”还是“反爬虫”,用到的基本技术都是两个,一个是 HTTP,另一个就是 HTML。

HTTP 相关的协议

TCP/IP

TCP/IP 协议实际上是一系列网络通信协议的统称,其中最核心的两个协议是 TCP 和 IP,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。

IP

IP 协议是“Internet Protocol”的缩写,主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。IP 协议使用“IP 地址”的概念来定位互联网上的每一台计算机。可以对比一下现实中的电话系统,你拿着的手机相当于互联网上的计算机,而要打电话就必须接入电话网,由通信公司给你分配一个号码,这个号码就相当于 IP 地址。

现在我们使用的 IP 协议大多数是 v4 版,地址是四个用“.”分隔的数字,例如“192.168.0.1”,总共有 2^32,大约 42 亿个可以分配的地址。看上去好像很多,但已经被分配完了。所以,就又出现了 v6 版,使用 8 组“:”分隔的数字作为地址,容量扩大了很多,有 2^128 个,但 v6 没有考虑向下兼容的问题,所以完全代替 v4 版本是不可能的,而且 NAT 的出现也在一定程度上解决 v4 版本不足的问题。

TCP

TCP 协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流形式的通信,是 HTTP 协议得以实现的基础。

可靠”是指保证数据不丢失,“字节流”是指保证数据完整,所以在 TCP 协议的两端可以如同操作文件一样访问传输的数据,就像是读写在一个密闭的管道里“流动”的字节。

而互联网上的 HTTP 协议就运行在了 TCP/IP 上

DNS

IP 地址来标识计算机,对于人类来说难以记住,于是就有了“域名系统”,用有意义的名字来代替 IP 地址。

但想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,“映射”到它的真实 IP,这就是所谓的“域名解析”。

但能域名解析的服务器很多,而且会出现层级关系,逐层递归地实现域名查询,因此域名解析也会很耗时,所以出现 DNS 缓存。

而我们的本地就有一个特殊的“主机映射”文件,C:\WINDOWS\system32\drivers\etc\hosts,在缓存里找不到 DNS 记录,就会找这个文件。

使用域名,我们可以很简单的实现 IP 地址任意变动,可以基于域名实现的负载均衡,因为域名解析可以返回多个 IP 地址,所以一个域名可以对应多台主机,客户端收到多个 IP 地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡,域名解析也可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在 DNS 端把请求分发到不同的服务器,实现负载均衡

但不怀好意的人可以在域名这方面“做手脚“

  • “域名屏蔽”,对域名直接不解析,返回错误,让你无法拿到 IP 地址,也就无法访问网站;
  • “域名劫持”,也叫“域名污染”,你要访问 A 网站,但 DNS 给了你 B 网站。

HTTP 协议中并没有明确要求必须使用 DNS,但实际上为了方便访问互联网上的 Web 服务器,通常都会使用 DNS 来定位或标记主机名,间接地把 DNS 与 HTTP 绑在了一起。

代理

代理是 HTTP 协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答。

代理有很多的种类,常见的有:

  1. 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;

  2. 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;

  3. 正向代理:靠近客户端,代表客户端向服务器发送请求;

  4. 反向代理:靠近服务器端,代表服务器响应客户端的请求;

由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:

  1. 负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;

  2. 内容缓存:暂存上下行的数据,减轻后端的压力;

  3. 安全防护:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;

  4. 数据处理:提供压缩、加密等额外的功能。