zoukankan      html  css  js  c++  java
  • HTTP HTTPS 的基本知识点

    HTTP

    • HTTP 超文本传输协议, 他可以拆分成三个部分: 超文本,传输,协议。
      协议表示两个以上的参与者,对参与这的一种行为约定和规范
      HTTP 是一个双向协议
      HTTP是一个文字、图片、视频的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本,HTML就是最常见的超文本。

    • HTTP 状态码

    • HTTP 常见字段

    • Host字段:客户端发送请求时,用来指定服务器的域名。

    • Content-Length 字段: 表明本次回应的数据长度

    • Connection 字段:Connection 字段最常用用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。HTTP/1.1版本的链接都是持久连接,但是为了兼容老版本HTTP, 需要制定connection 首部字段的值为Keep-Alive。Connection:keep-alive

    • Content-Type 字段:用于服务器回应时候,告诉客户端,本次数据是什么格式。 Content-Type: text/html; charset=utf-8。客户端请求时候可以使用Accept字段声明自己可以接受那些数据格式。Accept: /

    • Content-Encoding 字段:用于表明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式。

    • GET 与 POST
      GET 方法的韩式是请求从服务器获取资源,这个资源可以是文本、页面、图片视频等

      POST 方法是相反操作,它想URL指定的资源提交数据,数据就放在报文的body里。例如在文章底部,设置了留言,点击提交之后,浏览器就会执行一次POST请求,把你的留言文字放进了报文body里,然后拼接好POST请求头,通过TCP协议发送给浏览器。

    • HTTP特性
      HTTP最突出的优点是简单、灵活和易于扩展、应用广泛和跨平台。
      简单:HTTP基本的报文格式就是header + body, 头部信息也是 key - value, 简单文本的形式,易于理解,降低了学习和使用的门槛。
      灵活和易于扩展: HTTP协议里的各种请求方法、URI/URL状态码,头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。HTTPS也就是在HTTP与TCP层之间增加了SSL/TLS安全传输层,HTTP/3甚至把TCP层换成基于UDP的QUIC
      应用广泛和跨平台:从台式机的浏览器到手机上的各种APP,从看新闻、刷贴吧到购物理财、吃鸡,HTTP的应用片地开花,同时天然具有跨平台的优越性。

    • HTTP缺点
      HTTP协议里有优缺点一体的双刃剑,分别是"无状态、明文传输", 同时还具有一大缺点————不安全。

    • 无状态双刃剑
      好处: 因为不会去记忆HTTP的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的CPU和内存用来对外提供服务。
      坏处: 因为服务器没有记忆力他在完成相关联的操作时候会非常麻烦。

    • Cookie 技术解决无状态的问题
      Cookie 通过在请求和响应报文中写入Cookie 信息来控制客户端的状态, 相当于在客户端第一次请求后,服务器会下发一个装有客户信息的小贴纸,后续客户端请求服务器的时候,带上小贴纸,服务器就能认得。

    • HTTPS 解决HTTP 的不安全性
      通过接入SSL/TLS 层使得在安全上得到了极致。
      是HTTP1.0 性能上一个很大的问题就是每发起一个请求都要新建立一次TCP连接,而且是串行请求,做了无畏的TCP链接的简历和断开,增加了通信的开销。
      为了解决TCP连接的重复简历和断开造成的额外开销,减轻服务器端的负载,建立了持久连接。持久连接的特点是,只要任意一端没有明确的提出断开连接,就保持TCP连接状态。
      HTTP/1.1采用了长连接的方式,这使得管道网络传输成为了可能。即在一个TCP连接里面,客户端可以发起多个请求,只要第一个请求发出去了,就不必等其回来,就可以发第二个请求出去,减少整体的相应时间。
      请求应答模式家具了HTTP的心梗问题,因为当顺序发送的请求序列中的一个请求因为某种原因被阻塞时候, 在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也是队头阻塞,好比上班的路上塞车。

    HTTPS

    因为HTTP 是基于明文传输的,所以安全上会存在以下三个风险:窃听风险,篡改风险,冒充风险。(公钥加密,私钥解密)
    HTTPS 解决以上问题的方式是:

    • 混合加密的方式实现信息的机密,解决了窃听的风险。在通讯建立前采用非对称加密的方式交换会话密匙,后续就不再使用非对称加密,在通信过程中全部使用对称加密的会话密匙的方式加密明文数据。
    • 摘要算法的方式来实现完整性,他能够为数据生成独一无二的指纹,指纹用于校验数据的完整性,解决了篡改的风险
    • 将服务器的公匙放入数字证书中,解决了冒充的风险

      整个SSL/TLS的握手阶段涉及四次通信,可见下图:

    HTTP/1.1、 HTTP/2、 HTTP/3演变

    • HTTP 1.1 相比HTTP1.0 改进: 1、 使用TCP场链接的方式改善了HTTP/1.0短连接的性能开销。2、支持管道网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,以减少整体的相应时间。
      HTTP/1.1 的性能瓶颈:1、 请求/相应头部未经压缩就发送,首部信息越多,延迟越大,智能压缩body部分。
      2、发送冗长的首部,每次互相发送相同的首部造成的浪费较多。
      3、服务器是按照请求的顺序进行相应的,如果服务器端相应慢,那么就会招致客户端一直请求不到数据,也就是队头阻塞。
      4、请求只能从客户端开始,服务器端只能被动响应。

    • HTTP/2 协议是基于HTTPS的,所以HTTP/2的安全性是有一定保证的。 基于HTTP/1.1性能上的改进:
      1、头部压缩,HTTP/2会压缩投,如果你发送多个请求他们的头是一样的或者相似的,那么协议会帮你消除重复的部分。
      2、二进制格式,HTTP/2 不再像 HTTP/1.1 纯文本的形式的报文,而是全面采用了二进制格式, 头信息和数据题都是二进制,并且统称为帧:头信息帧和数据帧
      3、HTTP/2 可以在一个连接中并发的多个请求或回应而不用按照顺序一一对应。降低的延迟,大幅度的提高了连接的利用率。
      4、服务器端也可以主动向客户端发送信息。
      5、HTTP/2 的所有包不是按照顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数

    • HTTP/2的主要问题在于,多个HTTP复用一个TCP连接,下层的TCP协议是不知道有多少个HTTP请求的,所以一旦发生的丢包现象,就会触发TCP的重传机制,这样在一个TCP中的所有HTTP请求就必须等待这个丢了的包被重传回来。

    • 基于HTTP/2的问题,HTTP/3将下层的传输层由TCP 改为了UDP
      UDP 是不可靠传输,但是UDP的QUIC协议可以实现类似TCP的可靠传输。

    HTTPS

    客户端如何验证证书的合法性

    • 首先浏览器读取证书中的证书所有者、有效期等信息进行校验,校验证书的网站域名是否与证书颁发的域名一致,校验证书是否在有效期内
    • 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
    • 如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
    • 如果找到,那么浏览器就会从操作系统中取出颁发者CA 的公钥(多数浏览器开发商发布
    • 版本时,会事先在内部植入常用认证机关的公开密钥),然后对服务器发来的证书里面的签名进行解密
    • 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
    • 对比结果一致,则证明服务器发来的证书合法,没有被冒充

    参考连接
    https://cloud.tencent.com/developer/article/1464938
    https://www.jianshu.com/p/94dd4b197f5b

  • 相关阅读:
    html页面禁止自动填充浏览器记住的密码
    未能加载文件或程序集“System.Data.SQLite.DLL”或它的某一个依赖项
    DotNetMQ的一个小demo
    js 排列 组合 的一个简单例子
    js 生成笛卡尔积
    290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)
    递归与迭代的联系以及优缺点(以c++为例)
    leetcode344 反转字符串 c++实现
    面试题:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。(c++实现)
    LeetCode题库13. 罗马数字转整数(c++实现)
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14521064.html
Copyright © 2011-2022 走看看