HTTP协议
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
HTTP请求/响应步骤(HTTP1.1)
- 客户端连接到web服务器
一个HTTP客户端通常是浏览器,与web服务器的HTTP端口建立一个TCP套接字连接 - 发送HTTP请求
通过TCP套接字,客户端返回Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头、空行和请求数据4个部分组成 - 服务器接受请求并返回HTTP响应
web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成 - 释放连接TCP连接
若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection为keeplive模式,则该连接会保持一段时间,在该时间内可以继续接收请求 - 客户端浏览器解析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的区别

- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTPS的加密方式
对称加密:加密和解密都是同一个密匙。
- 非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。
HTTPS的工作流程(暂时没搞清楚)
整个过程分为以下几步:
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是证书的签发机构。
如果操作系统中没有安装GlobalSign的证书该怎么办?
- 浏览器会去GS的网站下载证书
- 浏览器会看GS证书上有没有签发方
- 如果有,递归进行检查签发方的证书是否安装在操作系统本地,知道找到根证书
DNS
概念
将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
根域名服务器
位于最顶层的是根域名服务器。
根域名服务器只是一个目录,并不提供具体的数据。
- 先发送给本地dns服务器,本地的就会在自己的区域里面查找,若找到,根据此记录进行解析,若没有找到,就会在本地的缓存里面查找
- 本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名dns服务器
- 根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址
- 客户机的dns服务器根据返回的信息接着访问下一级的dns服务器
- 这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
- 客户机的本地的dns服务器会将查询结果返回给我们的客户机
- 客户机根据得到的ip信息访问目标主机,完成解析过程
权威DNS服务器和本地DNS服务器存储具体的DNS记录IP,其他只存储下级目录。
所有步骤中都有缓存,叫做分级缓存,基本DNS请求不会到达根DNS服务器。




