「梳理」http和https

241 阅读6分钟

谈谈对HTTP协议的理解?

http 和 https区别?

http协议的主要特点?

http报文的组成部分?

http方法?

post 和 get区别?

http 状态码?

什么是持久连接?

什么是管线化?

从“在浏览器输入域名”到“页面静态资源完全加载”的整个流程

HTTPS协议

加密方式

http 缓存

http 和 https 区别?

  • SSL: 安全-套接字-协议,靠证书验证服务器身份,在本地和服务器之间建立通道
  • 定义:
// http:

1. http(超文本传输协议) : 传输过程不加密, 明文传输(账号密码不安全)

// https:

1. https :增加SSL协议,负责网络连接加密

2. https连接: 

step1,和服务器建立安全的连接通道; 
step2,服务器发证书到浏览器(说明访问的服务器没有问题);
step3,服务器把没有上锁的箱子和钥匙发给浏览器;
step4,浏览器把信息放到盒子里用钥匙锁上发给服务器;
step5, 随后服务器用自己的钥匙打开,密码随机,每次会话生成不同的密码

3. https缺点:

aSSL证书收费(功能越强越贵)
b: 延迟页面加载时间,约50%
c: 缓存不如http
d:占用更多服务器连接资源
e:面对黑客攻击,和dos拒绝服务攻击也没区别

http协议的主要特点:

1.简单快速:
2.灵活:完成不同数据类型的传输
3.无连接:连接一次就会断掉
4.无状态:客户端和服务端连接是不会记住身份的

http报文的组成部分:

1.请求报文
    请求行:http方法,页面地址,http协议及其版本
    请求头: key value值,告诉服务端需要的内容
    空行: 
    请求体:
    
2.响应报文
    状态行: http协议及其版本,状态码
    响应头: 
    空行
    响应体

http方法:

1. get : 获取资源
2. post: 传输资源
3. put: 更新资源
4. delete: 删除资源
5. head: 获取报文首部
6. options: 询问支持的方法(返回服务器对指定资源支持的 HTTP 请求方法,一般用于测试服务器功能的可用性。)

post 和 get区别:

1. 安全性: post更安全,因为get参数直接暴露在url上
2. 长度限制:get传送的参数有长度限制
3. 传参方式:get通过url传递, post放在请求体中
4. 缓存: get请求会被浏览器主动缓存,post需要手动设置
5. 数据类型: get只接受ASCII字符, post没有限制

http 状态码:

   1. 1xx: 指示信息,已接收,待下一步处理
   
   2. 2xx: 成功
      200:客户端请求成功
      201: created, 请求被处理,创建类新的资源
      202: accept, 服务器接收到消息,未进行处理
      204: no content,请求成功,客户端不需要更新现有视图
      206:客户端发送了带有rang头的get请求,服务器完成了
      
   3. 3xx: 重定向
      301: 永久重定向
      302: 临时重定向
      304: 协商缓存,告诉浏览器有缓存,可以从缓存取
      
   4. 4xx: 客户端错误
      400: 客户端请求语法有错,不能被服务器理解
      401: 请求未经授权
      403: 页面禁止被访问
      404: 资源不存在
      
   5. 5xx: 服务器错误
      500: 服务器错误
      502: 服务器中接收到的响应是无效的, 服务器挂了
      503: 服务不可用,停机维护或超载。
      504: 网关超时

什么是持久连接:

1. http协议采用【请求-应答】模式
2.【普通模式】:每个请求/应答,客户和服务器都要建立一个连接,完成后立即断开
3.【keep-alive模式】:(持久连接)keep-alive功能使客户端到服务端的连接持续有效,当出现对服务器后继请求时,keep-alive避免了重新建立连接
         

什么是管线化:

1.【过去】在持久连接前提下,请求1->响应1->请求2->响应2
2.【管线化】:现有请求一次打包发过去,响应一次性发回来
             请求1->请求2->响应1->响应2->
2. 限制:
        仅http1.1支持
        只有get 和 head请求支持, post 有所限制
        
        

从“在浏览器输入域名”到“页面静态资源完全加载”的整个流程?

  • 第一步: 用户输入url
  • 第二步: 浏览器检查本地DNS 缓存, 没有就向DNS服务器发起DNS解析请求,返回对应域名的ip地址
  • 第三步:浏览器建立TCP/IP连接(传输层)三次握手
建立连接时:
第一次握手: 浏览器发送序列包syn到服务器,等待服务器确认
第二次握手: 服务器接收到序列包syn, 向浏览器发送确认的序列包ack, 以及发送自己的序列包syn,即ack + syn包
第三次握手: 浏览器接收服务器的ack和syn包, 向服务器发送确认包ack,此包发送完毕,客户端和服务端建立连接,完成三次握手
  • 浏览器发送http请求报文
  • 服务器处理http请求
  • 服务器发送http响应报文
  • 浏览器解析html内容
  • 浏览器发送页面资源请求(http)
  • 服务器返回页面资源(图片,样式,脚本)
  • html dom树和css规则树,生成渲染树
  • 最终呈现在页面上
  • 浏览器建立TCP/IP连接(传输层)四次握手
关闭连接时:
第一次握手: 浏览器发送-个FIN
第二次握手: 服务器接收到FIN, 向浏览器发送一个确认的ack
第三次握手: 服务器数据传输完成后, 向浏览器发送一个FIN
第四次握手: 浏览器发送确认的ack给服务器,完成关闭连接

XSS?

存储型XSS?

CSP?

  • 这个信息可以用HTTP头的形式出现; 网站通过这个信息告诉浏览器哪些外部资源可以加载和执行。
  • 也可以通过 标签出现
<meta http-equiv="Content-Security-Policy" 
      content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
- script-src:外部脚本
- style-src:样式表
- img-src:图像
- media-src:媒体文件(音频和视频)
- font-src:字体文件
- object-src:插件(比如 Flash)
- child-src:框架
- frame-ancestors:嵌入的外部资源
- connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
- worker-src:worker脚本
- manifest-src:manifest 文件

HTTPS协议

  • HTTPS = HTTP + SSL/TLS
  • 为了网络数据的安全性,通过加密传输的方式来对传统上网的HTTP流量进行保护

加密方式

  • 对称加密算法(常用)
    • 加密解密采用 “ 同一个 ” 密钥
  • 非对称加密算法
    • 加密解密采用 “ 不同的 ” 密钥

http 缓存

  • 分类: 强缓存 和 协商缓存
  • 定义:
// 协商缓存:

1. 资源时间过期: 
    响应头: expires-绝对时间; 
    请求头和响应头: cache-control 相对时间

// 强缓存:

1. 资源修改时间: 
    响应头:last-modify;
    请求头:if-modify-since, 只能精确到秒

2.内容修改:
    响应头:etag;    请求头:if-none-match(存储上一次服务器的etag)