面试必考问题一文搞定:HTTP和HTTPS?TLS的工作流程?

HTTP 协议在日常网络应用中随处可见,我们在任何时候网上冲浪都会看到 HTTP 协议或 HTTPS 协议的身影。既然其普遍存在,那么就要对它们有一个较为全面的了解!本篇从 HTTP 入手,最后对 HTTPS 进行学习记录。

HTTP 协议通常承载于 TCP 协议之上,有时也会承载于 TLS 或 SSL 协议层之上,这时就成了 HTTPS 协议!HTTP 的默认端口号是 80、HTTPS 的默认端口号是 443。
在这里插入图片描述

图片出自——《图解HTTP》

HTTP 协议是一个无状态协议,并且采用"客户端请求、服务器应答"模式,这也就意味着服务器无法主动向客户端推送消息、更不能向客户端发起请求!

正文

简述 HTTP 工作流程

  1. HTTP 开始工作,首先客户端与服务器需要在经历 TCP 三次握手后建立连接。
  2. 建立连接之后,客户端发送一个请求(request)给服务器。
  3. 服务器收到请求后开始处理,给予客户端一个响应(response)。(不一定是成功)
  4. 客户端接收到响应后处理渲染后告诉用户,最后断开连接。

四步中的有任何一步出现错误,错误信息都将返回到客户端。

短连接和长连接?

短连接:每次请求都建立一个 TCP 连接,请求完成后结束连接,新的请求再建立 TCP 连接,缺点很明显就是开销很大。

长连接:发起一个请求之后,建立 TCP 连接,这条客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,但是他有一个保持时间,一般可以在服务器软件中设定这个时间。使用长连接需要客户端和服务端都支持长连接。

不难看出 HTTP 协议的长连接和短连接,实质上就是 TCP 协议的长连接和短连接。

从 HTTP/1.1 开始默认使用长连接,会在响应头加入 Connection:Keep-Alive 字段标识,如果需要断开连接,需要由客户端或者服务器提出断开,使用 Connection:close 字段。

请求和响应

请求(request)总体从上向下包括:请求首行(请求方法、URL、协议版本)、请求头(属性是key:value形式、属性一条一行)、空行、请求体(请求数据)

YlFGk9.png

响应(response)总体从上向下包括:响应首行(协议版本、状态码和状态描述)、响应头(属性是key:value形式、属性一条一行)、空行、响应体(响应数据)
在这里插入图片描述

请求方法:

HTTP 1.0 定义三种请求方法:GET、POST、HEAD

HTTP 1.1 又增加了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT

方法简述
1GET请求指定的页面信息,并返回实体主体。当前网络请求中,绝大部分使用的是 GET 方法。在 RESTful 风格中常用作查询。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头、确认 URL 的有效性以及资源更新的日期等等。。
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。在 RESTful 风格中常用作添加。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题。在 RESTful 风格中常用作更新,但是只能完全替代原始资源。
5DELETE请求服务器删除指定的资源,并且同样不带验证机制。在 RESTful 风格中常用作删除。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。使用 SSL(安全套接字) 和 TLS(传输层安全) 协议把通信内容加密后经网络隧道传输。
7OPTIONS允许客户端查看服务器的性能,查询指定的 URL 能够支持的方法,会返回形如 Allow: GET, POST, HEAD, OPTIONS 这样的内容。
8TRACE回显服务器收到的请求,主要用于测试或诊断。服务器会将通信路径返回给客户端,发送请求时,可以在 Max-Forwards 字段填入数值,每经过一个服务器就 -1 ,当数值为 0 就停止传输。但是 TRACE 容易受到 XST 攻击(跨站追踪)。
9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。在 RESTful 风格中常用作资源更新,允许部分更新。

GET 和 POST 方法的区别?

  1. 在客户端 GET 方法通过 URL 提交数据,所以只支持 ASCII 码,所以 GET 参数中如果出现中文需要先进行编码,而 POST 方法提交数据在报文中,支持多种标准字符集。
  2. GET 方法提交的数据大小浏览器有限制,Post 没有。
  3. GET 方法时幂等的,同样的请求被执行多次效果是一样的,服务器状态也是一样的(统计功能除外),POST 方法是非幂等的。
  4. GET 请求可以被浏览器主动缓存,而 POST 不会,除非手动设置。
  5. GET 请求发送一个数据包 header 和 data一起发送出去,POST 请求先发送 header ,服务器响应 100 Continue,浏览器再发送 data。

HTTP 首部字段

不需要牢记,只是作为字典进行查阅。

通用首部字段

首部字段名说明
Cache-Control控制缓存的行为
Connection控制不再转发给代理的首部字段、管理持久连接
Date创建报文的日期时间
Pragma报文指令
Trailer报文末端的首部一览
Transfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器的相关信息
Warning错误通知

请求首部字段

首部字段名说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的内容编码
Accept-Language优先的语言(自然语言)
AuthorizationWeb 认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在服务器
If-Match比较实体标记(ETag)
If-Modified-Since比较资源的更新时间
If-None-Match比较实体标记(与 If-Match 相反)
If-Range资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)
Max-Forwards最大传输逐跳数
Proxy-Authorization代理服务器要求客户端的认证信息
Range实体的字节范围请求
Referer对请求中 URI 的原始获取方
TE传输编码的优先级
User-AgentHTTP 客户端程序的信息

响应首部

首部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定 URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP 服务器的安装信息
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息

实体首部字段

首部字段名说明
Allow资源可支持的 HTTP 方法
Content-Encoding实体主体适用的编码方式
Content-Language实体主体的自然语言
Content-Length实体主体的大小
Content-Location替代对应资源的 URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围
Content-Type实体主体的媒体类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期时间

响应状态码

状态码说明
100 Continue服务器收到请求,请求者可以继续发送请求或忽略这个响应
200 OK请求正常处理完成
201 Created已创建了新资源
202 Accepted服务器已接受并处理请求,但还未处理完毕
204 No Content请求已经处理成功,但是返回的响应报文
300 Redirection重定向
301 Moved Permanently永久性重定向,返回信息会包含新的 URL ,之后的请求都应使用新的 URL
302 Found临时性重定向,之后的请求应该继续使用原本的 URL
400 Bad Request客户端请求错误
401 Unauthorized请求未授权,需要身份认证
403 Forbidden服务器拒绝执行此请求
404 Not Found服务器无法找到请求资源
405 Method Not Allowed请求方法不允许
500 Internal Server Failed服务器内部错误
501 Not Implemented服务器不支持请求的功能
502 Bad Gateway网关错误,从上游服务器收到了一个无效响应
503 Service Unavailable服务器超载或者宕机
504 Gateway Timeout网关超时
505 HTTP Version not supported服务器不支持请求的HTTP协议版本

Cookie 和 Session 的选择

  1. Cookie 只能存储 ASCII 码字符串,Session 可以存储任何类型的数据,因此考虑数据复杂性时首选 Session。
  2. Cookie 存储在客户端,容易被查看和窃取后发生 Cookie 欺骗,而 Session 存储在服务器,因此考虑数据安全性时首选 Session。
  3. Session 会在服务器存活一段时间,如果是大流量网站,Session 进行存储的开销非常大,因此考虑减轻服务器性能压力时可以选择 Cookie。
  4. 很多浏览器对 Cookie 的大小和数量都存在限制,而 Session 不会被浏览器限制。

当客户端禁用了 Cookie ,此时无法用 Cookie 保存信息,只能使用 Session;而且 SessionID 也无法存放在 Cookie 中,针对这点一般可以采用 URL 重写,将 SessionID 作为 URL 的参数进行传递、或者在页面中使用一个隐藏表单,用于传输 SessionID。

HTTPS

说好的 HTTP 和 HTTPS ,怎么所有篇幅都是在说 HTTP?

其实不然,HTTPS 并非什么新的协议,而是让 HTTP 先和 SSL(安全套接字) 通信,再由 SSL 和 TCP 完成通信,也就是说 HTTPS 是使用了 SSL 手段加密的隧道进行通信的 HTTP 协议!

SSL 位于 HTTP 和 TCP 之间的协议,其内部有 TLS握手协议、TLS记录协议,HTTPS 依然经由 HTTP进行通信,但是利用 TLS 来保证安全。在 osi 七层结构中,SSL 处于会话层、HTTP 处于应用层,在 TCP/IP 结构和五层结构中 SSL 和 HTTP 同属于应用层。

Y3TbK1.jpg

通过使用 SSL ,HTTPS 具有了加密隧道(防窃听)、认证(防伪造)、完整性保护(防篡改)的安全特效特性。

SSL:安全套接字,1994年网景公司设计,1995年发布了 3.0 版本。

TLS:传输层安全性协议,IETF 在 SSL3.0 的基础上设计的协议。

下面使用 TLS 进行表述。

TLS 工作流程

将 HTTP 所有传输的内容都经过了加密,加密采用对称加密,但是这个对称加密的秘钥用服务器上的证书(公钥)进行了非对称加密确保这个秘钥的传输安全。因此 HTTPS 消耗了更多的服务器资源,但是安全性较 HTTP 有了质的提升。
在这里插入图片描述
上图就是 TLS 的四次握手大致流程,第二次握手之后,客户端可以选择去颁发 server 证书的 CA 验证这个证书的有效性!

下面再从每次握手后 client 和 server 的状态简单阐述一下:

  1. 第一次握手,client[A]

    ​ server[A,B,选用的加密套件,公钥pk和对应秘钥]

  2. 第二次握手,client[A,B,server.crt(公钥pk)]

    ​ server[A,B,选用的加密套件,公钥pk和对应秘钥]

    server 告知 client ,hello 阶段完成了

  3. 第三次握手,client[A,B,C,server.crt(公钥pk),Sesstion Secret]

    ​ server[A,B,C1,C,选用的加密套件,公钥pk和对应秘钥,Session Secret]

    client 告知 server, 后续的通信都采用协商好的会话秘钥和加密算法

    这一步 server 需要验证 F1、F2是否一致,为了确认双方会话秘钥和加密算法一致。

  4. 第四次握手,client[A,B,C,server.crt(公钥pk),Sesstion Secret]

    ​ server[A,B,C1,C,选用的加密套件,公钥pk和对应秘钥,Session Secret]

    server告知 client , 后续的通信都采用协商好的会话秘钥和加密算法

    这一步 client 需要验证 F3和原始明文数据是否一致,为了确认 server 生成的会话秘钥和采用的加密算法是否正确。

注意三点:

  1. 生成 Session Secret 需要三个随机数的明文。
  2. 服务器证书中包含着服务器非对称加密的密钥对中的公钥,私钥只有服务器知道。
  3. server 证书中的公钥只用来在协商秘钥时加密会话秘钥中的参数。

本人菜鸟,有错误请告知,感激不尽!

更多题解和源码:github

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值