Http 协议
1. Http 发展
- HTTP/0.9
- 只有get 命令,且服务端直返HTML 格式字符串,服务器响应完毕就关闭TCP 连接
- 1991年提出
- HTTP/1.0
- 1996 提出
- 可以发送任何格式内容,包括文字、图像、视频、二进制。也丰富了命令Get、Post、Head,请求和响应的格式加入头信息
- 每个TCP 连接只能发送一个请求,而新建TCP 连接的成本很高,导致Http/1.0 性能很差
- HTTP/1.1(目前使用的最多协议)
- 1997年提出
- 引入持久连接,TCP 默认不关闭,可被多个请求复用
- SPDY(基本上没人用)
- 2012 年google 提出
- 综合了HTTP 和HTTPS两者的优点于一体的传输协议
- 必须使用HTTPS 连接
- 请求头Header 压缩
- 多路复用
- HTTP/2.0
- 2015 年提出
- 已经包括了SPDY 中的优点
- 采用二进制格式而非文本格式,解析更高效,数据更紧凑,错误更少
- 服务器可以将响应主动推送到客户端
2. Socket
- 定义:套接字,实对TCP/IP的封装,提供可供程序员做网络开发所用的接口——Socket 编程接口
3. HTTP 报文格式
- 请求信息格式
- 响应信息格式
4. HTTP 协议的代码实例
- 使用语言:java
- 使用工具:Socket、StringBuilder、InetSocketAddress(域名解析)、Http1Codec(okhttp-x.x.x.x.jar中的类,用于解析响应体)
- 访问对象:百度天气
- 编写请求信息:使用StringBuilder 构造请求行、请求头、请求空行、请求体信息
- GET请求必须加上Host 请求头,且一般没有请求体
- 注意中文编码问题
- POST请求必须加上Content-Length 请求头和Content-Type 请求头
- 注意中文编码问题
- GET请求必须加上Host 请求头,且一般没有请求体
- 创建Socket 对象并进行连接和请求
- ip地址使用InetSocketAddress进行域名解析获得
- 端口号是默认的端口号80
- 请求响应与响应信息处理
- 响应头中如果存在Content-Length,读取时按该长度去读取(Http1Codec获得响应体)
- 响应头中如果存在Transer-Encoding: chunked 则按 5 中的方法去解析数据(Http1Codec获得响应体)
5. HTTP 分块编码
- 用于响应体数据
- 当数据量很大时,一般会采用此技术
- 对应的响应头为Transfer-Encoding: chunked
- 一般当不存在Content-Length请求头的时候,会出现该请求头
- 具体格式
- 服务端返回信息:shouyue你好,我是你爷爷!
- 响应体具体内容
-
// 格式为 // 数据分块k的字符数\r\n // 数据分块k\r\n // 最后一行 // 0\r\n 7\r\n shouyue\r\n 3\r\n 你好,\r\n 3\r\n 我是你\r\n 3\r\n 爷爷!\r\n 0\r\n
HTTPS/SSL 协议
1. 概述
- HTTP 的缺点
- HTTP 在传输数据时,所有传输的内容都是明文,无法保证数据的安全性
- HTTPS:即 HTTP Over TLS,运行在TLS 协议上的安全的HTTP协议
- 即在HTTP 协议的基础上通过对数据进行加密,保证数据的安全性
- 结构图
2. TLS 的发展
- 1994 ,NetScape 公司设计了 SSL 1.0
- 1995,升级为SSL 2.0
- 1996,升级为SSL3.0,并得到大规模的应用
- 1999,ISOC 接替NetScape,发布SSL的升级版 TLS 1.0版
- 2006,升级为TLS 1.1
- 2008,升级为TLS 1.2
- 2018,升级为TLS 1.3
3. SSL 握手
- SSL握手目的
- SSL握手的过程都是明文的,因此SSL握手的重点就在于怎么在不安全的网络中安全的进行密钥交换
- SSL 握手过程
- RSA 算法交换密钥(一般不会直接使用RSA,会加上其他技术)
- 客户端给出协议版本号、一个随机数(R1)以及客户端支持的加密方法(对称加密方法)
- 服务端确定使用的加密方法,并给出数字证书以及一个随机数(R2)
- 客户端确定数字证书有效,并生成一个新的随机数(premaster secret,三个随机数中唯一加密的),并使用数字证书中的公钥,利用RSA 算法加密这个随机数,发给服务端
- 服务端使用自己的私钥,获取客户端发来的随机数(premaster secret)
- 客户端和服务端根据约定的加密算法,使用前面三个随机数,生成对话密钥(master secret),用来加密接下来的整个对话过程
- 更详细的过程图