一、HTTP的发展历程

1.互联网上构建超链接文档系统的关键技术

  • URI:即统一资源标识符,作为互联网上资源的唯一身份;
  • HTML:即超文本标记语言,描述超文本文档;
  • HTTP:即超文本传输协议,用来传输超文本。

    2.HTTP/0.9(简单文本协议、只能获取文本资源)

网络上绝大多数的资源都是纯文本,很多通信协议也都使用纯文本,HTTP/0.9结构比较简单,为了便于服务器和客户端处理,它也采用了纯文本格式

3.HTTP/1.0(不是正式标准)

1.增加了 HEAD、POST 等新方法;
2.增加了响应状态码,标记可能的错误原因;
3.引入了协议版本号概念;
4.引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活;
5.传输的数据不再仅限于文本。

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

1.增加了 PUT、DELETE 等新的方法;
2.增加了缓存管理和控制;
3.明确了连接管理,允许持久连接;
4.允许响应数据分块(chunked),利于传输大文件;
5.强制要求 Host 头,让互联网主机托管成为可能。

5.HTTP/2(普及率还比较低)

1.二进制协议,不再是纯文本;
2.可发起多个请求,废弃了 1.1 里的管道;
3.使用专用算法压缩头部,减少数据传输量;
4.允许服务器主动向客户端推送数据;
5.增强了安全性,“事实上”要求加密通信。

6.HTTP/3(未来的方向)

是将来的发展方向

二、HTTP是什么

1.HTTP 是一个用在计算机世界里的协议,它确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
2.HTTP 专门用来在两点之间传输数据,不能用于广播、寻址或路由。
3.HTTP 传输的是文字、图片、音频、视频等超文本数据。
4.HTTP 是构建互联网的重要基础技术,它没有实体,依赖许多其他的技术来实现,但同时许多技术也都依赖于它。

三、HTTP概览

1.浏览器本质上是一个 HTTP 协议中的请求方,浏览器的角色被称为“User Agent”即“用户代理”,“客户端”

2.服务器是应答方,“服务端”,常用的服务器Nginx、Apache

3.CDN位于浏览器和服务器之间,主要起到缓存加速的作用,它可以缓存源站的数据,让浏览器的请求不用“千里迢迢”地到达源站服务器,直接在“半路”就可以获取响应。如果 CDN 的调度算法很优秀,更可以找到离用户最近的节点,大幅度缩短响应时间。

4.爬虫是一种可以自动访问 Web 资源的应用程序,是另一类 User Agent。它会过度消耗网络资源,占用服务器和带宽,影响网站对真实数据的分析,甚至导致敏感信息泄漏。

四、与HTTP相关的协议

1.TCP/IP

1.第一层“链接层”
2.第二层“网际层”或者“网络互连层”
3.第三层“传输层”
4.第四层“应用层”

TCP 属于“传输层”,IP 属于“网际层”

2.DNS

域名做一个转换,“映射”到它的真实 IP,这就是所谓的“域名解析”。

3.URI && URL

URI 是用来标记互联网上资源的一个名字,由“协议名 + 主机名 + 路径”构成,俗称 URL

4.HTTPS

HTTPS 相当于“HTTP+SSL/TLS+TCP/IP”,为 HTTP 套了一个安全的外壳;

5.代理

代理HTTP 传输过程中的“中转站”,可以实现缓存加速、负载均衡等功能。

五、网络分层

1.TCP/IP 网络分层模型

1.第一层叫“链接层”(link layer),负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标记网络上的设备,所以有时候也叫 MAC 层。

2.第二层叫“网际层”或者“网络互连层”(internet layer),IP 协议就处在这一层。因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了。

3.第三层叫“传输层”(transport layer),这个层次协议的职责是保证数据在 IP 地址标记的两点之间“可靠”地传输,是 TCP 协议工作的层次,另外还有它的一个“小伙伴”UDP。

4.第四层叫“应用层”(application layer),由于下面的三层把基础打得非常好,所以在这一层就“百花齐放”了,有各种面向具体应用的协议。例如 Telnet、SSH、FTP、SMTP 等等,当然还有我们的 HTTP。

2.OSI七层模型

1.第一层:物理层,网络的物理形式,例如电缆、光纤、网卡、集线器等等;
2.第二层:数据链路层,它基本相当于 TCP/IP 的链接层;
3.第三层:网络层,相当于 TCP/IP 里的网际层;
4.第四层:传输层,相当于 TCP/IP 里的传输层;
5.第五层:会话层,维护网络中的连接状态,即保持会话和同步;
6.第六层:表示层,把数据转换为合适、可理解的语法和语义;
7.第七层:应用层,面向具体的应用传输数据。

3.两个分层模型的映射关系

image.png

1.第一层:物理层,TCP/IP 里无对应;
2.第二层:数据链路层,对应 TCP/IP 的链接层;
3.第三层:网络层,对应 TCP/IP 的网际层;
4.第四层:传输层,对应 TCP/IP 的传输层;
5.第五、六、七层:统一对应到 TCP/IP 的应用层。

4.TCP/IP 协议栈的工作方式

image.png
HTTP 协议的传输过程就是这样通过协议栈逐层向下,每一层都添加本层的专有数据,层层打包,然后通过下层发送出去。
接收数据是则是相反的操作,从下往上穿过协议栈,逐层拆包,每层去掉本层的专有头,上层就会拿到自己的数据。
但下层的传输过程对于上层是完全“透明”的,上层也不需要关心下层的具体实现细节,所以就 HTTP 层次来看,它不管下层是不是 TCP/IP 协议,看到的只是一个可靠的传输链路,只要把数据加上自己的头,对方就能原样收到。

小结:

1.TCP/IP 分为四层,核心是二层的 IP 和三层的 TCP,HTTP 在第四层;
2.OSI 分为七层,基本对应 TCP/IP,TCP 在第四层,HTTP 在第七层;
3.OSI 可以映射到 TCP/IP,但这期间一、五、六层消失了;
4.日常交流的时候我们通常使用 OSI 模型,用四层、七层等术语;
5.HTTP 利用 TCP/IP 协议栈逐层打包再拆包,实现了数据传输,但下面的细节并不可见。

有一个辨别四层和七层比较好的(但不是绝对的)小窍门,“两个凡是”:凡是由操作系统负责处理的就是四层或四层以下,否则,凡是需要由应用程序(也就是你自己写代码)负责处理的就是七层。

六、域名解析

1.域名的形式

域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,然后是“二级域名”,层级关系向左依次降低。

最左边的是主机名,通常用来表明主机的用途,比如“www”表示提供万维网服务、“mail”表示提供邮件服务,不过这也不是绝对的,名字的关键是要让我们容易记忆。

2.域名的解析

域名必须要转换成 IP 地址,这个过程就是“域名解析”。

DNS 的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:

1.根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的 IP 地址;

2.顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 apple.com 域名服务器的 IP 地址;

3.权威域名服务器(Authoritative DNS Server):管理自己域名下主机的 IP 地址,比如 apple.com 权威域名服务器可以返回 www.apple.com 的 IP 地址。
image.png

例如,你要访问“www.apple.com”,就要进行下面的三次查询:

1.访问根域名服务器,它会告诉你“com”顶级域名服务器的地址;
2.访问“com”顶级域名服务器,它再告诉你“apple.com”域名服务器的地址;
3.最后访问“apple.com”域名服务器,就得到了“www.apple.com”的地址。

3.减轻域名解析的压力

减轻域名解析的压力,并且能够更快地获取结果,基本思路就是“缓存”。

4.域名解析的过程

浏览器缓存 -> 操作系统缓存 -> hosts 文件 -> 本地域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 权威域名服务器

5.基于域名的负载均衡

第一种方式,因为域名解析可以返回多个 IP 地址,所以一个域名可以对应多台主机,客户端收到多个 IP 地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡。

第二种方式,域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在 DNS 端把请求分发到不同的服务器,实现负载均衡。