透视HTTP协议

April 06, 2022

01| HTTP的前世今生

史前时期

20世纪70年代,基于对ARPA网的实践和思考,研究人员发明出著名的TCP/IP协议,并在80年代中期进入UNIX系统内核

创世纪

提出超文档链接系统的构想,确立三项关键技术:

URI: 统一资源标识符,作为互联网上资源的唯一身份;

HTML: 超文本标记语言,描述超文本文档;

HTTP: 超文本传输协议,用于传输超文本

HTTP/0.9

只允许用GET请求从服务器上获取HTML文档,并且在响应请求之后立即关闭连接

HTTP/1.0

  • 增加HEAD、POST等新方法
  • 增加了响应状态码,标记可能的错误原因
  • 引入协议版本号的概念
  • 引入了HTTP header的概念,让HTTP处理请求和响应更加灵活
  • 传输的数据不再仅限于文本

HTTP/1.1

正式的标准,所有浏览器、服务器、网关、代理等,只要用到HTTP协议,就必须严格遵守这个标准。

  • 增加PUT、DELETE等新方法
  • 增加缓存管理和控制
  • 明确了链接管理,允许持久连接
  • 运行响应数据分块(chunked),利于传输大文件
  • 强制要求Host头,让互联网主机托管称为可能

HTTP/2 基于Google的SPDY协议

  • 二进制协议,不再是纯文本;
  • 可发起多个请求,废弃1.1里的管道
  • 使用专用算法压缩头部,减少数据传输量
  • 允许服务器主动向客户端推送数据
  • 增加安全性

HTTP/3

基于Google的QUIC协议,目前处于标准化制定阶段

02 | HTTP是什么?HTTP又不是什么?

HTTP是什么

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

HTTP协议是一个双向协议。数据在A和B之间双向流动。举例来说,浏览器就是请求方A,网易、新浪这些网站就是应答方B,双方约定HTTP协议来通信,于是浏览器把一些数据发送给网站、网站再把一些数据发回给浏览器。 数据虽然在A和B之间传输,但并没有限制A和B两个角色,允许中间有“中转”

A<>B变成A<>X<>Y<>B,只要不打扰基本的数据传输,就可以添加任意功能,例如安全认证、数据压缩、编码转换等。因此HTTP是一个在计算机世界里专门用来在两点之前传输数据的约定和规范。

图片、视频、音频、压缩包都可以是”文本”。而”超文本”,是文字、图片、视频、音频等的混合体,最关键是含有”超链接”,能从一个”超文本”跳跃到另一个”超文本”,形成复杂的非线性、网状的结构关系。“超文本”最熟悉的就是HTML,本身只是纯文字文件,但内部用很多标签定义了对图片、音频、视频等的连接,再经过浏览器的解释,呈现一个具有视听信息的页面。

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

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

hw-os-app

03 | HTTP世界全览(上):与HTTP相关的各种概念

网络世界

通常说的”上网“实际访问的只是互联网的子集的,万维网,它基于http协议,传输HTML等超文本资源,能力也被限制在HTTP协议之内。

互联网上还有许多万维网之外的资源,例如常用的电子邮件、BT、Magnet点对点下载、SSH安全登录等,它们需要用各自专用协议来访问。

浏览器

HTTP协议中的请求方

Web服务器

硬件含义就是物理形式或“云”形式的机器。在大多数情况下它可能不是一台服务器,而是利用方向代理、负载均衡等技术组成的庞大集群。

软件就是提供Web服务的应用程序,通常运行在硬件含义的服务器上。利用强大的硬件能力响应海量的客户端HTTP请求,处理磁盘上的网页、图片等静态文件,或者把请求转发给Tomcat、Node.js等业务应用。

Web服务器一般有Apache、Nginx

CDN

浏览器通常不会直接连到服务器,中间会经过一个重要角色就是CDN。

CDN, Content Deliverty Network, 内容分发网络。它应用了HTTP协议里的缓存和代理技术,代替原站响应客户端的请求。

除了基本的网络加速外,还提供负载均衡、安全防护、边缘计算、跨运营商网络等功能,能成倍地“放大”原站服务器的服务能力。

WebService

Web Service是一种由W3C定义的应用服务开发规范,使用client-server主从架构,通常使用WSDL定义服务接口,使用HTTP协议传输XML或SOAP消息。基于Web(HTTP)的服务架构技术

03 | HTTP世界全览(下):与HTTP相关的各种协议

TCP/IP

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

这个协议栈有四层,从上到下是应用层-〉传输层-〉网际层-〉链接层。 IP协议主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。

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

可靠是指保证数据不丢失,“字节流”保证数据完整。

DNS

DNS(Domain Name System), 域名系统。域名解析,域名转换到真实IP。

URI/URL

DNS和IP地址只是标记了互联网上的主机,但主机上管理了一大堆文档,要如何准确找出是哪一个呢?

所以就出现URI(Uniform Resource Identifier),统一资源标识符,使用它能够唯一地标记互联网上的资源。

URL(Uniform Resource Locator),统一资源定位符,就是俗称的“网址”,它实际上是URI的一个子集。

URI主要有三个基本的部分构成:

  1. 协议名:即访问该资源应当使用的协议
  2. 主机名:互联网上主机的标记,域名或者ip地址
  3. 路径:资源在主机上的位置,使用“/”分割多级目录。

HTTPS

HTTP, HTTP over SSL/TLS, 运行在SSL/TLS协议上的HTTP。 SSL/TLS是一个负责加密通信的安全协议,建立在TCP/IP。HTTPS相当于HTTP+SSL/TLS+TCP/IP。

SSL使用了许多密码学先进的研究成功,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术。

代理

代理常见的种类有:

  1. 匿名代理:完全隐匿了被代理的机器,外界看到的只是代理服务器。
  2. 透明代理:在传输过程中是“透明开放”的,外界即知道代理,也知道客户端
  3. 正向代理:靠近客户端,代表客户端向服务器发送请求;
  4. 反向代理:靠近服务器端,代表服务端响应客户端的请求;

代理在传输过程中插入一个“中间层”,可以在这个环节做很多事情:

  1. 负载均衡: 把访问请求均匀分散到多台机器,实现访问集群化
  2. 内容缓存:暂存上下行的数据,减轻后端的压力
  3. 安全防护:隐匿IP,使用WAF等工具抵御网络攻击,保护被代理的机器、
  4. 数据处理:提供压缩、加密等额外功能

正向代理 vs 反向代理 正向代理:为了从目标服务器获得内容,客户端从代理服务器发送一个请求并制定目标,代理服务器向目标服务器转交请求并将获得的内容返回客户端。like 科学上网 “代理服务器”代理了客户端,去和目标服务器进行交互

反向代理:代理服务器代理了目标服务器,去和客户端交互

05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?

TCP/IP网络分层模型

hw-os-app

第一层是链接层,负责在以太网、wifi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用mac地址来标记网络上的设备,有时候也叫mac层。

第二层是网际层或者网络互联层。IP协议就在这一层,IP协议定义了IP地址的概念,所以可以在链接层的基础上,用IP地址取代MAC地址,用IP地址取代MAC地址,把许多局域网、广域网连接成一个虚拟的巨大网络。

第三层是传输层,这个层的协议职责是保证数据在IP地址标记的两点之间可靠地传输,是TCP、UDP协议工作的层次。

TCP是有状态的协议,需要先与对方建立连接然后才能发送数据,而且保证数据不丢失不重复。

UDP是无状态的,不用建立连接就可以发送任意数据,但不保证数据一定会发到对方。

两个协议的另一个重要区别在于数据的形式,TCP数据的连续的字节流,有先后顺序。UDP则是分散的小数据包,顺序发,乱序收。

第四层是应用层,有各种面向具体应用的协议,like Telnet、SSH、FTP、HTTP

MAC层的传输单位是帧,IP层传输单位是包,TCP传输单位是段,HTTP的传输单位是消息或报文。

OSI网络分层模型

OSI(Open System Interconnection Reference Model),开放式系统互联通信参考。 TCP/IP发明于1970年代,设计出一个新的网络分层模型,想用这个新框架来统一既存的各种网络协议。 hw-os-app

OSI模型分成了七层:

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

第五六七层统一对应到TCP/IP的应用层

二层转发:二层指数据链路层,工作在二层的设备,通过查找到目标MAC地址,进行数据转发 三层路由:三层是指网络层,工作在三层的设备,通过解析数据包头信息,找到目标IP地址,转发数据 CDN、DNS都是处于应用层

06 | 域名里有哪些门道?

域名解析:IP地址必须转换成MAC地址才能访问主机,域名也必须转换成IP地址

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

  1. 根域名服务器:管理顶级域名服务器,返回com、net、cn等顶级域名服务器IP地址
  2. 顶级域名服务器:管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址
  3. 权威域名服务器:管理自己域名下主机的IP地址,比如apple.com权威域名服务器可以返回www.apple.com的IP地址

假如要访问www.apple.com,会经历下面三次查询

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

为了减轻域名解析的压力,会使用缓存来解决,有两种方法:

  1. 公司、网络运行商建立自己的DNS服务器,作为用户DNS查询的代理,代替用户访问核心DNS系统。可以缓存之前的查询结果,如果已经有记录,就无须再向根服务器发起查询,直接返回对应的IP地址
  2. 操作系统里也会对DNS解析结果做缓存,如果之前访问过www.apple.com,那么下一次在浏览器里再输入这个网址就不会再跑到DNS访问,直接在操作系统拿到IP地址

基于域名的负载均衡

  1. 因为域名解析可以返回多个IP地址,所以一个域名可以对应多台主机,客户端收到多个IP地址后,就可以使用轮询算法依次向服务器发起请求,实现负载均衡
  2. 域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,在DNS端把请求分发到不同服务器,实现负载均衡

DNS解析过程:浏览器DNS缓存 -> 操作系统缓存 -> hosts文件 -> 非权威域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 权威域名服务器


Profile picture

百事可乐

Let it snow, let it snow, let it snow