目录
http——超文本传输协议(HyperText Transfer Protocol)
https——安全超文本传输协议(Hyper Text Transfer Protocol over SecureSocket Layer)
http——超文本传输协议(HyperText Transfer Protocol)
简介
超文本传输协议,顾名思义,分为3个部分:超文本、传输、协议
超文本:是文字、图片、视频等的混合体——最关键是有超链接,即能从一个超文本跳转到另外一个超文本
传输:专门用来在两点(服务器-浏览器、服务器-服务器)之间双向传输数据
协议:各种控制和错误处理方式的行为约定和规范
因此,http是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」
http首部格式
请求报文格式
http请求报文通常由请求行(request line)、请求头部(header)、空行和请求数据(body)4个部分组成
POST /user HTTP/1.1
Host: www.baidu.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-agent: Mozilla/5.0.
(空行)
name=world
- 请求行:请求方法+URL+协议版本,采用“空格“分隔
如:POST /user HTTP/1.1
- 请求头部:由key-value对组成,每行一对,关键字和值用英文冒号“:”分隔,用于通知服务器有关于客户端请求的信息
如:Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
Content-Type:媒体类型信息
Connection:连接状态
User-agent:产生请求的浏览器类型
- 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
- 请求数据:请求数据不在GET方法中使用,而是在POST方法中使用,与请求数据相关的最常使用的请求头是Content-Type和Content-Length
如:name=world
响应报文格式
http响应报文通常由状态行、响应头部、空行、响应正文4部分组成
HTTP/1.1 304 Not Modified
Date:Sat, 15 Oct 2011 15:39:29
(空行)
(空响应体)
状态行:协议版本+状态码+状态码描述,采用“空格“分隔
响应头部:同请求报文
空行:同请求报文
响应正文:响应的消息内容,如果是纯数据就返回纯数据,HTML页面则返回HTML代码,诸如此类
常见请求方法
-
GET和POST的区别
GET | POST | |
---|---|---|
目的 | 从服务器获取数据 | 向服务器传递数据 |
数据位置 | 参数包含在URL中 | 传递的数据封装在http请求体中 |
保存 | 请求参数会被完整保留在浏览器历史记录里 | 参数不会被保留 |
长度 | 传递参数长度受限(浏览器URL有最大长度限制) |
可以传递大量数据 |
隐秘性 | 暴露在URL中,不隐密 | 封装在请求体中,隐密 |
数据量 | 浏览器会把http header和data一并发送出去,产生一个数据包,服务器响应200 | 浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)产生两个数据包 |
安全和幂等的概念
在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源
所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的
很明显GET是幂等的,因为它是只读操作,不修改服务器数据,所以是安全的,且多次操作结果相同
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的
http状态码
状态码的第一个数字代表当前响应的类型
状态码 | 类别 | 含义 | 举例 |
1XX | 信息性状态码 | 接收的请求正在处理 | 100-正常处理 |
2XX | 成功状态码 | 请求正常处理完毕 | 200-OK 204-请求成功处理,但返回响应不包含实体 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 | 301-永久性重定向 302-临时性重定向 |
4XX | 客户端错误状态码 | 服务器无法处理请求 | 403-请求被拒绝 404-Not Found |
5XX | 服务器错误状态码 | 服务器处理请求出错 | 500-服务器正在执行请求时发生错误 503-服务器超负载或正在维护 |
特点
简单
基本报文格式:header+body,头部信息是key-value的简单文本形式,易于理解
无状态
协议对客户端没有状态存储,减少了服务器的负担,但在完成关联性操作时很麻烦,如:访问一个网站需要反复进行登录操作
无连接
HTTP/1.1之前,每次请求都需要通过TCP三次握手四次挥手,和服务器重新建立连接
比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,增加开销
不安全
在网络传输中使用明文进行通信,没有对数据进行加密,内容容易遭到窃听,如:账号可能泄露
不验证通信方的身份,可能遭遇伪装,如:访问假的淘宝
无法保证数据的完整性,可能遭到篡改,如:广告植入
灵活且易扩展
请求方法、URI/URL、状态码、首部字段的要求没有固定形式,允许开发人员自行扩充
https——安全超文本传输协议(Hyper Text Transfer Protocol over SecureSocket Layer)
简介
http协议存在三个安全问题:
- 窃听:明文信息传输可能遭到恶意截获
- 伪装:没有身份校验机制可能有伪造的请求和响应
- 篡改:通信途中可能遭遇截获并篡改信息
因此 https 在 TCP 和 http 中间加入了 SSL/TLS 安全协议解决以上三个问题
- 信息加密:混合加密的方式实现信息的加密传输
- 身份认证:通过数字证书解决冒充风险
- 内容校验:摘要算法来实现完整性校验
信息加密——混合加密
-
对称加密
加密和解密使用同一密钥
优点:运算速度快
缺点:无法保证密钥在通信过程中的安全性
-
非对称加密
加密和解密使用不同密钥,公钥所有人都可以获得,私钥只能由一方保管不能泄露
如:你向银行请求公钥,使用公钥进行加密,则只有私钥的持有人才能对你的消息解密
优点:公钥是公开的,只要私钥不泄露就不存在安全性问题
缺点:运算速度慢
-
混合加密
结合对称加密和非对称加密的特点,可以采用混合加密的方式,综合二者的优点进行使用
发送方 将 对称加密的密钥 使用 非对称加密 的 公钥 进行加密,然后发送出去(解决了对称加密密钥传输不安全的问题)
接收方 使用 私钥 进行解密得到 对称加密的密钥 ,然后双方可以使用 对称加密 来进行沟通(解决了非对称加密运算速度慢的问题)
身份认证——数字证书
回想加密过程,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密,那么如何保证公钥不被篡改和信任度?
这里就需要借助第三方权威机构(CA,Certificate Authority),将服务器公钥放在数字证书(由CA颁发)中,只要证书是可信的,公钥就是可信的
服务器向 CA 提出公钥的注册申请,CA 在判明提出申请者的身份之后,会对已申请的公钥做数字签名,然后分配这个已签名的公钥,并将该公钥放入公钥证书后绑定在一起
进行 HTTPS 通信时,服务器会把证书发送给客户端,客户端取得其中的公钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了
内容校验——摘要算法
客户端在发送信息之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发送给服务器
服务器解密后,用相同的摘要算法计算发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,则说明数据是完整未被篡改的
http和https的区别
特性 | http | https |
---|---|---|
安全性 | 明文传输 | 混合加密 |
身份认证 | 没有身份认证 | 需要申请数字证书 |
内容校验 | 没有内容校验机制 | 通过内容校验保证数据完整性 |
端口号 | 80 | 443 |
处理速度 | 较快 | 需要加密解密,速度稍慢 |
连接管理 | TCP连接 | TCP+SSL/TLS |
参考
https://blog.csdn.net/csdnnews/article/details/104765642
https://blog.csdn.net/xiaoming100001/article/details/81109617