HTTP及HTTPS协议原理
http 通信协议的基本原理
一次 HTTP 请求的通信流程
客户端向DNS发送域名,DNS返回ip地址
客户端根据ip找到服务器,服务器返回HTML/JSON等格式的内容
HTTP 通信协议的组成
请求 URI 定位资源
1 通过URI找到资源的位置
2 http://www.baidu.com:80/java/index.html?name=john#head
schema://host[:port#]/path/.../?[url-params]#[ query-string]
scheme 指定应用层使用的协议(例如:http, https, ftp)
host HTTP 服务器的 IP 地址或者域名
port# HTTP 服务器的默认端口是 80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/
path 访问资源的路径
query-string 查询字符串
片段标识符(#)(使用片段标识符通常可标记出已获取资源中的子资源(文档内
的某个位置))
MIME Type
标识消息内容类型
文本文件:text/html,text/plain,text/css,application/xhtml+xml,application/xml
图片文件:image/jpeg,image/gif,image/png.
视频文件:video/mpeg,video/quicktime
Accept和Content-Type
Accept:客户端希望的消息内容类型
Content-Type:服务端实际返回的消息内容类型如代码resposne.setContentType(“application/json;charset=utf-8”)
若Accept和Content-Type内容不一致,则浏览器无法解析
如果用户访问一个不存在的地址呢?
状态码:描述请求处理结果
image.png
大家见得比较多的错误码:
200:一切正常
301:永久重定向
404:请求资源不存在
500:服务端内部错误
告诉服务器端当前请求的意图
浏览器定义了 8 种方法来表示对于不同请求的操作方式
GET:获取服务器的资源,一般用于查询操作,URL长度有限制,具体限制有浏览器决定。
POST:将实体传给服务端,让服务端保存,一般用于创建操作
PUT:向服务器发送数据,一般用于更新操作
DELETE:删除,一般用于删除操作
HEAD:获得报文首部
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:用隧道协议连接代理
http 协议的完整组成
请求报文
请求报文格式包含三个部分,(起始行、首部字段、主体)
image.png
响应报文
响应的报文格式也是一样,分为三部分
image.png
Http 协议中的扩展
如果传输的文件过大怎么办
1 对文件进行压缩,减少文件大小
首先服务端需要能支持文件的压缩功能,其次浏览器能够针对被压缩的文件进行解压缩。浏览器可以指定 Accept-Encoding 来高速服务器我当前支持的编码类型
Accept-Encoding:gzip,deflate;那服务端会根据支持的编码类型,选择合适的类型进行压缩。常见的编码方式有:gzip/deflate
image.png
2 分割传输
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码
每次请求都要建立连接吗?
1 Http1.0的版本
image.png
2 Http1.1
持久连接:连接建立后,客户端或服务端没有明确提出断开连接,则tcp保持连接状态。通过Connection:Keep-Alive表示表示希望将此条连接作为持久连接。默认持久连接是开启的,通过在connection增加close头部来关闭连接,客户端或服务端仍然可以随时关闭空闲连接。
管道化连接:并行发送多个请求,而不需要一个接一个地等待响应
image.png
Http 协议的特点
Http 无状态协议
HTTP 协议:不会保存请求和响应之间的通信状态
如何实现带状态的协议呢?
通过服务端的session来保存状态,通过浏览器的cookie来传递sessionId
image.png
Tomcat 实现 session 的代码逻辑分析
将sessionId放在cookie内容里
image.png
Https 协议基本分析
https 安全传输协议
HTTPS和HTTP的区别:Https对传输内容进行加密,而Http则是明文传输。
通过在Http协议或TCP协议增加SSL层来实现的。
SSL(Secure Socket Layer,安全层)或者 TLS(Transport Layer Security) 安全层传输协议组合使用用于构造加密通道;
image.png
如何去建立一个安全的传输通道
加密的基础知识
对称加密
客户端和服务端拥有一个相同的秘钥S,客户端通过秘钥S对消息内容进行加密,服务端通过秘钥S进行解密
image.png
非对称加密
私钥加密且只有一个,属于服务端;公钥解密,输入客户端。
image.png
签名算法
用于验证是否发生修改如md5。
整体过程
使用非对称加密
主要解决秘钥泄密的问题,服务端将公钥发给每个客户端。
使用第三方机构
主要解决通过公钥的定位如是第三方机构的公钥还是中间人的公钥
1 第三方机构和服务端
服务端将公钥A发给第三方机构,第三方机构利用私钥对公钥A进行加密并返回给服务端即返回数字证书给服务端。
image.png
2 客户端和服务端
客户端向服务端发送请求公钥的的请求
服务端返回数字证书
客户端利用本地的第三方机构的公钥对数字证书进行解密,若解密成功则表示该数字证书来自于第三方机构。
第三方机构的公钥证书存哪里?
存在浏览器中,浏览器都会默认内置受信任的数据证书如谷歌浏览器的设置-->高级-->证书
证书编号
判断证书有没有被修改过。通过客户端和服务端的证书编号是否相同,证书编号生成规则:服务器内容+md5算法
image.png
image.png