HTTP协议

超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。

HTTP请求/响应步骤(HTTP1.1)

  1. 客户端连接到web服务器
    一个HTTP客户端通常是浏览器,与web服务器的HTTP端口建立一个TCP套接字连接
  2. 发送HTTP请求
    通过TCP套接字,客户端返回Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头、空行和请求数据4个部分组成
  3. 服务器接受请求并返回HTTP响应
    web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成
  4. 释放连接TCP连接
    若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection为keeplive模式,则该连接会保持一段时间,在该时间内可以继续接收请求
  5. 客户端浏览器解析HTML内容
    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知一下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML。根据HTML的语法对其格式化,并在浏览器窗口中显示

    HTTP1.0/1.1

    HTTP1.0

    1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,如果还要请求其他资源,就必须再新建一个连接。
    TCP三次握手过程比较耗时,所以HTTP1.0的性能比较差。

    1.0也可以强制开启长链接,但是这不是标准字段,兼容性有些问题

HTTP1.1

  • 1.1最重要的改进就是引进了 持久连接。TCP连接默认不关闭,可以被多个请求复用。客户端和服务端发现对方一段时间没有活动,就可以主动关闭连接。或者客户端在最后一个请求时,主动告诉服务端要关闭连接。
  • HTTP1.1还引进了管道机制。客户端可以通过同一个TCP连接同时发送多个请求,但是服务端还是按照顺序依次回应

    线头阻塞问题

    在HTTP1.1引入了管道机制之后,虽然客户端发起请求时,能够同时发送多个请求,但是服务端会按照请求的顺序依次响应。客户端在未收到之前发出的所有请求的响应之前,将会阻塞后续的请求,也就是”线头阻塞”。

    由于线头阻塞问题,所以多数客户端还是选择不使用管道,宁愿多开几个TCP请求也不愿意阻塞。

HTTP2.0

多路复用

HTTP2.0采用了多路复用机制。即为,在一个TCP连接里,客户端和浏览器都可以同时发送多个请求或响应,且不用按照顺序响应。

二进制分帧

能够做到多路复用,主要就是HTTP/2将所有传输的信息分割为了更小的消息和帧,并且对它们采用二进制编码。这个负责拆分、组装请求二进制帧的这一层就叫 二进制分帧层。
除了二进制分帧层,HTTP/2还进行了Header压缩、服务端推送等优化。

数据流

HTTP2的连接中,存在数据流的虚拟通道概念。每个流都有一个唯一的ID,奇数时客户端发出的流,偶数是服务端发出的流。每个流中由一个或多个帧组成。流ID存在于帧首部中,根据ID将多个帧再组成一个流消息。

双方都可以通过发送RST_STREAM帧拒收。

HTTPS

HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。 HTTPS = HTTP + SSL

HTTPS和HTTP的区别

image.png

  • https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    HTTPS的加密方式

  • 对称加密:加密和解密都是同一个密匙。

  • 非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。

    HTTPS的工作流程(暂时没搞清楚)

    image.png
    整个过程分为以下几步:
    1、浏览器发起往服务器的 443 端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
    2、服务器收到请求,选择浏览器支持的加密算法和哈希算法。
    3、服务器下将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。(注释:证书包括以下这些内容:1. 证书序列号。2. 证书过期时间。3. 站点组织名。4. 站点DNS主机名。5. 站点公钥。6. 证书颁发者名。7. 证书签名。因为证书就是要给大家用的,所以不需要加密传输)
    4、浏览器进入数字证书认证环节,这一部分是浏览器内置的 TSL 完成的:
    4.1 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。
    4.2 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性(验证过程类似上面 Bob 和 Susan 的通信)。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
    4.3 浏览器生成一个随机数 R,并使用网站公钥对 R 进行加密。
    5、浏览器将加密的 R 传送给服务器。
    6、服务器用自己的私钥解密得到 R。
    7、服务器以 R 为密钥使用了对称加密算法加密网页内容并传输给浏览器。
    8、浏览器以 R 为密钥使用之前约定好的解密算法获取网页内容。
    注释:
    第3步中,证书的内容包含的证书的签名是什么?签名是指利用上一层证书的私钥,加密一些元信息(证书所有者的信息,包括基本信息,公钥,证书生效域名等)。这样,当收到签名证书时,只需要根据CA提供的公钥对签名解密,验证元信息是否一致,就可以判断当前证书是否合法。一句话来说就是,每个证书会对下一层的证书合法性做担保 。
    第4步中,怎么认证数字证书?
    客户端怎么确认你的证书是合法的呢。首先你的证书会在https握手过程中被传递到浏览器,浏览器从你的证书中找到了颁发者,从颁发者的证书(如果你电脑上有的话)又找到了CA的证书(CA证书会在操作系统安装时就安装好,所以每个人电脑上都有根证书),使用CA证书中带的公钥来对颁发者证书做验签,一旦匹配,说明你电脑上的颁发者证书不是伪造的,同理,再用颁发者证书中的公钥去验证你的证书,以此证明你的证书不是伪造的。这样整个链状的验证,从而确保你的证书一定是直接或间接从CA签发的,这样浏览器地址栏会显示一个绿色的盾牌,表示你的网站能通过证书验证
    如果你的电脑上没有颁发者证书(断链)或者你自己本身就是自签名证书(自己做CA,但是要记得,人家电脑上并没有装你的自签名根证书),那么浏览器会报警提示不能验证证书,问你是否还需要继续。

    证书

    假设GlobalSign是证书的签发机构。
    image.png

    如果操作系统中没有安装GlobalSign的证书该怎么办?
    1. 浏览器会去GS的网站下载证书
    2. 浏览器会看GS证书上有没有签发方
    3. 如果有,递归进行检查签发方的证书是否安装在操作系统本地,知道找到根证书

https://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247489246&idx=2&sn=f10aab4ba0b6b4f4fcf6a6d0558ac694&chksm=fddec01acaa9490ceb50c188234ecea7144f94f4d4666d14c00a12db58571dd3280775f399b4&mpshare=1&scene=23&srcid=0808HfyLv0p7HrNDTr3jMMVX&sharer_sharetime=1596887426260&sharer_shareid=583fae75f4f4a7c89f1defd7b8170572#rd

DNS

概念

将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

根域名服务器

位于最顶层的是根域名服务器。
根域名服务器只是一个目录,并不提供具体的数据。

  • 域名分级和数据分区
    • 根服务器提供的目录有一定的索引规则,域名的世界中,通过分级域名的策略建立索引。

      三级域名系统

      image.png
      image.png
      image.png
  1. 根DNS服务器
  2. 顶级域DNS服务器
  3. 权威DNS服务器
  4. 本地DNS服务器(路由器中的DNS缓存、小区的DNS服务器、ISP运营商的DNS服务器…)

    DNS寻址过程

    image.png
  • 先发送给本地dns服务器,本地的就会在自己的区域里面查找,若找到,根据此记录进行解析,若没有找到,就会在本地的缓存里面查找
  • 本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名dns服务器
  • 根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址
  • 客户机的dns服务器根据返回的信息接着访问下一级的dns服务器
  • 这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
  • 客户机的本地的dns服务器会将查询结果返回给我们的客户机
  • 客户机根据得到的ip信息访问目标主机,完成解析过程

权威DNS服务器和本地DNS服务器存储具体的DNS记录IP,其他只存储下级目录。

所有步骤中都有缓存,叫做分级缓存,基本DNS请求不会到达根DNS服务器。