HTTP
- HyperText Transfer Portocol 超文本传输协议
- 超文本:在电脑中,显示的含有可以指向其他文本链接的文本
HTTP的工作方式
浏览器-->发送请求-->服务器
GET/HTTP/1.1
Host:····.com服务器-->响应-->浏览器
HTTP/1.1 200 OK
Server:nginx/1.13.1
Date:Sun,0,...
URL--->HTTP报文
- 示例:http://space.bilibili.comsp/56285643
https: 协议类型
space.bilibili.com:服务器地址
56285643: 路径
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ - GET/56285643 HTTP/1.1
Host:space.bilibili.comsp
- 报文格式:Request
GET/Users HTTP?1.1 //请求行 Host:api.githu.com //headers Content-Type: text/plain //headers Content-Length:243 //headers ... //body
- 报文格式:Response
HTTP/1.1 200 OK //状态行
//请求头
Content-type:application/json;charset=UTF-8 //headers
Cache-control:public,max-age=60,S-maxage=60
vary:Accept,Accept-Encoding
etag:w/“02eec5b33460”
Content-encoding:g-zip
//Body
[{
.......
}]
Request Methods
- Get
获取资源,无Body - Post
增加或者修改资源;Body - Put
修改资源;有Body - DELETE
删除资源;无Body - HEAD
获取信息;如下载文件的大小;服务器不返回Body
Get/Put/DELETE具有幂等性
Status Code 状态码
- 1xx: 临时性消息
101:支持HTTP2.0
100:未完成 - 2XX:成功
- 3XX:重定向
301:永久迁移
302:临时迁移
304:内容无改变 - 4XX:客户端错误
- 5XX:服务器错误
Header 请求头
-
作用:HTTP消息的元数据(metadata)
- Host:服务器的主机地址 虚拟主机
- Content-Type/Content-Length: Body的类型/长度
- Content-Length:内容的长度(字节)
- Content-Type:
- text/html:HTML内容,用于浏览器页面响应
- application/x-www-form-urlencoded:普通表单
- encoded:URL模式
- multipart/form-data:多部分形式;包含二进制的多内容
- application/json:json形式,用于Web Api的响应或者Post/Put请求
- image/jpeg/application/zip...:单文件,用于Web API响应或者put/post请求
Chunked Transfer Encoding
- Transfer-Encoding:chunked
表示Body长度无法确定,Content-Length不能使用
Body格式:...... 0
0加换行
最后传输0表示内容结束
- Location:重定向的目标URL
- User-Agent:用户代理
- Range/Accept-Range:指定Body内容范围
- Cookie/Set-Cookie:发送/设置 Cookie
- Authorization:授权信息
- Accept:客户端可接受的数据类型:如text/html
- Accept-charset:客户端接收的字符集:如 UTF-8
- Accept-Encoding:客户端接收的压缩类型编码。如gzip
- Conetent-Encoding:压缩类型:如gzip
Cache 缓存
- Cache和Butter的区别?
- Cache-Control:
- no-cache: 缓存,使用前询问
- no-store:不缓存
- max-age:指定日期
- Last-Modified:
- If-Modified-since
- ETag: If-None-Match
- Cache-Control:private/public 个性信息/公共信息
REST
- 什么是REST:
一种架构风格对HTTP加以限制 - Sever-Client architecture CS架构
- StateLessness 无状态
- Cacheablility 可缓存
- Layered System 分层的服务器集群对客户端透明
- Code on demand 服务器返回包含可执行代码
- Uniform interface
- Resource identication in requests
- Resource manipulation through representation
- self-descriptive messages
- Hypermedia as engine of application state(HATEOAS)
RESTFUL HTTP
- 正确的使用Http
编码,加密,Hash
加密
- 对称加密
- 原理:使用密钥和加密算法对数据进行转换,得到的无意义的数据即为密文。使用密钥和解密算法对密文进行逆向转换,得到原数据。
- 经典算法:AES DES
- 非对称加密
- 原理使用公钥对数据进行加密得到密文,使用私钥对数据解密得到原数据
- 经典算法:RSA DSA
- 衍生用途:数字签名
原数据---加密算法+加密密钥===>密文---加密算法+解密密钥===>原数据
- 密钥(key)
- 场景:用于加密和解密
- 目的:保证数据被人截取时不被人读懂
- 焦点:数据
- 密码(pasword)
- 场景:用户进入网站或者游戏的身份验证
- 目的:数据提供方或者应用服务方对账户拥有者的数据的保护,保证你是你的时候提供权限
- 焦点:身份
Base64
- 将二进制数据转化为64个字符组成的字符串的编码算法
- 用途:让原数据拥有字符串所拥有的特性,如可以放在URL中传播,可以保存到文本文件,可以通过普通聊天软件进行文本传输。
- 可以将人眼可读的字符串变为读不懂的字符串,降低窥视危险
URL Encoding
- 将URL中的保留字符使用百分号”%“进行编码(”+“,”/“,"&"等)
- 消除歧义避免解析错误
- 例: http://spica.com/user/?name=我&你
http://spica.com/user/?name=我&26你
- 例: http://spica.com/user/?name=我&你
压缩和解压缩
压缩:把数据换一种方式来存储,减少存储空间
解压缩:把压缩后的数据还原为原先的形式,以便使用
常见压缩算法:DEFLATE,JPEG,MP3
-
压缩属于编码吗?
- 编码五官方定义
- 压缩属于编码
-
媒体数据的编码解码
- 图片的编码:把图像数据写成JPG,PNG,等文件的编码格式
- 图片的解码:把JPG,PNG等文件的数据解析为标准的图像数据
序列化
- 把数据对象(一般为内存中的,例如JVM对象)转换为字节序列的过程
- 目的:让内存中的对象可以被存储和传输
Hash
- 把任意数据转化为指定大小范围(通常很小的计算)
- 作用:摘要,数字指纹
- 经典算法:MD5,SHA1,SH256等等
- 实际用途:数据完整性验证,快速查找:hashCode()和HashMap()
登录和授权
- Cookie
- Authorization
Cookie
起源:购物车
-
工作机制:
- 客户端----->服务器
Post/cart HTTP/1.1
Host:shop.com
Cookie:cart="apple=1 " banana=1 - 服务器---->客户端
HTTP/1.1 200 ok
set-Cookie:Cart=”apple=1&banana=1“ - 客户端
shop.com:
cart:"apple=1&banana=1"
- 客户端----->服务器
-
Cookie的作用:
- 会话管理:购物车,登录状态等等
- 使用Cookie管理登录状态
- 个性化
- 分析用户行为
-
Xss(cross-site scrpting):HTTP only 跨站脚本攻击
- Set-Cookie:Sessionid=123;Http Only 使Cookie对本地脚本不可见
XSRF(cross-site request forgery ):Referer:跨站请求伪造
利用之前登录留下的Cookie实现无登录转账
Authorization
- Authorization: Basic
- Authorization: Bearer
- OAuth2
- 微信登录
TCP/IP协议簇
- 一系列模型组成的网络模型分层
- 为什么要分层:因为网络不稳定
- 具体分层:
- 应用层:HTTP,FTP,DNS
- 传输层:TCP,UDP
- 网络层:IP
- 数据链路层:以太网,WIFI
- TCP连接
- 三次握手...
- 长连接:
- 实现方式:心跳
在类小区网络环境下,防止长时间不连接端口关闭
- 实现方式:心跳
HTTPS
- HTTP OVER SSL
- SSL:Secure Socket Layer====>TLS:Transport Layer Secure
- 定义:在HTTP下增加一个安全层,用于保障HTTP的加密传输
- 本质:在客户端和服务器之间协商出一套对称密钥,每次发送信息之间将内容加密,收到之后在进行解密,达到内容加密传输
HTTP 连接
- 客户端请求建立TLS连接
- 服务器发回证明
- 客户端验证服务器证书
- 客户端信任服务器之后,和服务器协商对称密钥
- 使用对称密钥开始通信
在Android中使用
- 正常情况下,直接使用
- 什么时候不行:
- 用的自签名证书(例如用于内网的Https)
- 证书信息补全,缺乏证书机构信息
- 手机操作系统较旧,没有安装新加入的根证书
- 如何处理:
- 手写验证过程