HTTP & HTTPS

149 阅读9分钟

HTTP

HTTP 端口号 80;https 端口号 443;

HTTP 共4个版本:0.9 -> 1.0 -> 1.1 -> 2

HTTP/0.9

  • 只支持 GET
  • 没有请求头概念,不能在请求中指定版本号;
  • 响应也只能返回 HTML 字符串;
  • 响应之后立即关闭 TCP 连接;

HTTP/1.0

  • 新增 POST, DELETE, PUT, HEAD;
  • 增加请求头 & 响应头的概念,可指定 HTTP 版本号 & 其他的元信息(状态码、缓存、内容编码等);
  • 扩充了可传输数据的格式,包括图片、音频、视频和二进制等;
  • 无状态:不记录请求过的状态;(可以通过 cookie/session来做身份认证 & 状态记录)
  • 无连接:每次请求都要建立 TCP 连接;

缺点:

  • 无法复用连接,网络利用率低;
  • 队头阻塞:1.0 规定必须在前一个响应到达后,才能发送下一个请求(即等待前一个响应会阻塞下一个请求)

Content-type 对照表

注意:

对于 script 和 img 标签,不受跨域限制,发送的都是 GET,但如果返回响应的 Content-type 不是标签对应的,浏览器会屏蔽返回结果(这是出于安全考虑)

HTTP/1.1

  • 长连接:新增字段 Connection 可以设置为 keep-alive 保持连接不断开,继续使用这个通道进行数据传输;
  • 管道化:基于长连接,可以不用等待前一个响应返回,就发送后面的请求,但是响应的顺序还是按照请求的顺序返回,依旧没有解决队头阻塞的问题;
  • 新增缓存控制字段 cache-Control
  • 断点传输:在 上传 / 下载 资源时,如果资源过大,可将其分为多个部分分别进行;如果遇到网络故障,可以从已经 上传 / 下载 好的位置继续请求,不用从头开始(提高效率);

HTTP/2

  • 二进制分帧:1.x的解析都是基于文本,2 之后将所有传输的信息分割为更小的消息和帧,并对他们采用二进制格式的编码,提高传输效率;
  • 多路复用:在共享 TCP 连接的基础上,同时发送响应 & 请求;http 报文被分解为独立的 帧,乱序发送;服务器根据标识符 & 首部将消息重组;
  • 头部压缩:因为 http 是无状态的,每个请求都要表示请求的相关信息,但是这里面会有很多重复的信息,当请求数量很多时,消耗的资源也会越来越多;http/2 会维护一个头部信息字典,差量更新头信息,减少头部信息传输占用的资源;
  • HTTP/2 中所有头部名称必须小写;
  • HTTP/1 中的状态行信息(Method、Path、Status 等)在 HTTP/2 中被拆成键值对放入头部;

头部压缩原理

需要在支持 HTTP/2.0 的浏览器 & 服务器之间:

  • 维护一份相同的静态字典(Static Table):包含常见的头部字段 & 特别常见的头部字段与其值的组合;
  • 维护一份相同的动态字典(Dynamic Table):可以动态地添加内容;
  • 支持基于静态哈夫曼码表的哈夫曼编码(Huffman Coding);

静态字典的作用

  1. 对于完全匹配的键值对,可以直接用一个字符来表示;
  2. 对于头部名称匹配的键,可以使用一个字符来表示;
  • 首次请求就可以使用静态字典中的内容。

静态字典

动态字典

  • 浏览器可以告知服务器,将某个键值对添加到动态字典中,这样后续整个键值对就可以只使用一个字符来表示了;
  • 同理,服务器也可以更新客户端的动态字典;
  • 注意动态字典是上下文有关的,需要为每个 HTTP/2.0 连接维护不同的字典;

哈夫曼表

  • 也需要内置在客户端和服务端;
  • 对于静态字典和动态字典中不存在的内容,可以使用哈夫曼编码来减少体积;

哈夫曼表

HTTPS

通常 HTTP 直接和 TCP 通信; HTTPS 先与 SSL 通信,再由 SSL 和 TCP 通信;

  • 使用传输层安全性(TLS)安全套接字层(SSL)对通信协议进行加密。也就是 HTTP + SSL(TLS) = HTTPS;
  • 默认端口号443
  • 需要申请证书;

解决的问题

  • HTTP 是明文传输的,传输过程中任何人都有可能从中截获、修改或者伪造请求发送;
  • HTTP 没有用户验证,信息发送的双方可能会遭到伪装;
  • HTTP 传输过程中的接收方和发送方并不会验证保温的完整性;

三个关键指标

  1. 加密(Encryption):即数据传递过程中,没有人能够监听或者跟踪用户的活动、访问记录等;
  2. 数据一致性(Data integrity):数据在传输过程中不会被修改,即一方发的是什么,另外一方接收的就是什么;
  3. 身份认证(Authentication):能够确认对方身份,防止中间人攻击并建立用户信任。

SSL/TLS

TLS(Transport Layer Security) 是 SSL(Secure Socket Layer) 的后续版本,它们是用于在互联网两台计算机之间用于身份验证加密的一种协议。

SSL/TLS 功能实现主要依赖于三种算法:散列函数、对称加密 & 非对称加密;

  1. 利用非对称加密实现身份认证 & 密钥协商;
  2. 对称加密采用协商的密钥对数据进行加密;
  3. 基于散列函数验证数据信息的完整性。

TLS 是使用对称加密非对称加密 的混合加密方式来实现机密性。 RSA 运算速度比较慢,AES 的加密速度比较快,TLS正是使用了这种混合加密方式。 在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题,然后用随机数产生对称算法使用会话密钥(session key),再用公钥加密,对方拿到密文后,用私钥解密,取出会话密钥

对称加密

顾名思义是加密和解密的过程都使用同样的密钥; 只要保证密钥的安全性,整个通信的过程就具有安全性

TLS 里面有比较多的加密算法可供使用,比如 DES、3DES、AES、ChaCha20、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。目前最常用的是 AES-128, AES-192、AES-256 和 ChaCha20。

非对称加密

常见的比如 DH、DSA、RSA、ECC 等。 其中 RSA 加密算法是最重要的、最出名的一个了。例如 DHE_RSA_CAMELLIA128_GCM_SHA256。它的安全性基于 整数分解,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的。

ECC(Elliptic Curve Cryptography)也是非对称加密算法的一种,它基于椭圆曲线离散对数的数学难题,使用特定的曲线方程和基点生成公钥和私钥, ECDHE 用于密钥交换,ECDSA 用于数字签名。

非对称加密(Asymmetrical Encryption):公钥加密,私钥解密;公开密钥可供任何人使用,私钥只有你自己能够知道。

公钥不需要具有安全性,因为公钥需要在网络间传输; 网站保管私钥,在网上分发公钥,登陆网站只有用公钥加密就行了,密文只能由私钥持有者才能解密

常用状态码

状态码类别描述
1xxInformational(信息状态码)接受请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要附加操作已完成请求
4xxClient Error(客户端错误状态码)服务器无法处理请求
5xxServer Error(服务器错误状态码)服务器处理请求出错
状态码状态码英文名称中文描述
200OK请求成功。一般用于GET与POST请求
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
206Partial Content是对资源某一部分的请求,服务器成功处理了部分GET请求,响应报文中包含由Content-Range指定范围的实体内容。
301Moved Permanently永久性重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时性重定向。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与302类似。使用GET请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向,会按照浏览器标准,不会从POST变成GET。
400Bad Request客户端请求报文中存在语法错误,服务器无法理解。浏览器会像200 OK一样对待该状态吗
401Unauthorized请求要求用户的身份认证,通过HTTP认证(BASIC认证,DIGEST认证)的认证信息,若之前已进行过一次请求,则表示用户认证失败
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。也可以在服务器拒绝请求且不想说明理由时使用
500Internal Server Error服务器内部错误,无法完成请求,也可能是web应用存在bug或某些临时故障
501Not Implemented服务器不支持请求的功能,无法完成请求
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

参考文章

# HTTP 中常用的状态码(14种)