http & https
| 文章目录 |
|---|
| 疯狂创客圈 JAVA 高并发 总目录 - 疯狂创客圈 - 博客园 (cnblogs.com) |
| 《图解HTTP - 上野宣》 |
一、概述
来看看几个概念点
-
Hyper Text Transfer Protocol,超文本传输协议
-
基于
请求与响应、无状态的应用层的协议
1.1 http的诞生
| 文章目录 |
|---|
| HTTP_百度百科 (baidu.com) |
1.2 TCP/IP协议与DNS协议
它们与http协议关系密切,来了解一下它们的工作原理
TCP/IP四层模型
| 名称 | 作用 |
|---|---|
| 应用层 | 向用户提供应用服务时通信的活动 |
| 传输层 | 提供处于网络连接中的两台计算机之间的数据传输 |
| 网络层 | 处理在网络上流动的数据包,数据包是网络传输的最小数据单位 |
| 数据链路层 | 处理连接网络的硬件部分 |
当TCP/IP协议进行网络通信时,内部的传输流会根据分层顺序,发送端从应用层往下走,接收端则往应用层往上走。
每层在接收到上一层或下一层的数据报文后,会进行封装或解封装处理。
从上图可以看到,TCP是位于传输层的,提供了可靠的字节流传输服务。为什么说它可靠呢,相较于UDP,TCP协议采用三次握手四次挥手策略,在发送数据包出去后,会向对方确认数据包是否成功送达;而对于UDP来说,数据发出去后它是做一个甩手掌柜,置之不理的。
而对于DNS(Domain Name System)域名解析服务来说,它负责了域名到IP地址之间的解析服务,因为记忆一串纯数字的IP地址来说,对于我们用户实在是太不友好了,所以DNS解析服务应运而生,通常一个访问可能会经过本地DNS及公共DNS服务器。
所以,在http的传输过程中,TCP/IP协议与DNS协议它们三者都是密不可分的。
1.3 URL & URI
- url:统一资源定位符
- uri:统一资源标识符
如果从书上绝对URI的格式来看
事实上上面是遵循了一个通用标准:RFC3986,统一资源标识符(URI)通用语法。
1.4 GET和POST的区别
- 请求数据的放置位置不同:Get附在URL后,Post在请求体里
- 传输数据量大小不同:Get长度限制在URL中,Post理论上数据不受限
- 传输数据安全性不同:Get在URL明文显示,Post藏在请求体里,虽然F12也能看到
1.5 HTTP的2.0
| 版本 | 产生时间 | 内容 | 发展现状 |
|---|---|---|---|
| HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 |
| HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 |
| HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 |
| HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
http的2.0版本是一个二进制协议,在以前1.0的时代数据传输是通过应用层的纯文本格式,然而在2.0时代引入了新的数据传输单位,分别是:帧、消息、流,2.0版本会将所有传输的信息分割为更小的消息和数据帧,它有几个特点
- 首部压缩
- 多路复用
- 并行双向传输
- 服务端推送
| 文章目录 |
|---|
| [HTTP 2.0_百度百科 (baidu.com)](baike.baidu.com/item/HTTP 2.0/12520156?fr=aladdin) |
| 有关HTTP2.0详解_Benjamin的博客-CSDN博客 |
而在2012年的时,以下面几项协议为基础,以改善用户在使用Web时的速度体验为目的去进行讨论研发:
- SPDY
- HTTP Speed+Mobility
- Network-Friendly HTTP Upgrade
二、协议内部
2.1 http的组成部分
一个Http请求由三个部分组成
- 请求头:若干头部的字段,如消息正文长度、字符集等
- 请求体:一些数据如Cookie、Token以及一些客户端数据等
- 请求行:包含请求方法、URL地址、协议名称和版本号
一个Http响应由三个部分组成
- 响应头
- 响应体
- 响应行
上面的好复杂,看下面的简易版的
报文内的内容,可以通过wireshark抓包工具去看看,不过我比较懒就是了。
2.2 状态码
接下来看看http的状态码有哪些
| 状态码 | 说明 |
|---|---|
| 100-199 | (没遇到过......)成功接收请求,要求客户端继续提交下一次请求完成整个处理过程 |
| 200-299 | 请求成功,例如200,我也只遇到过200 |
| 300-399 | (没遇到过......)需要进一步细化请求 |
| 400-499 | 浏览器请求出现错误,例如请求资源不存在(404) |
| 500-599 | 后端服务器出现问题,例如SQL报错等等 |
2.3 TCP与长连接
其实,HTTP长连接和HTTP短连接指的是传输层的TCP连接是否被多次使用
模型对比
先看看OSI七层模型
如果把它跟TCP/IP协议进行一个对比的话
| OSI模型 | TCP/IP |
|---|---|
| 应用层 | 应用层 |
| 表示层 | 👆 |
| 会话层 | 👆 |
| 传输层 | 传输层 |
| 网络层 | 网络层 |
| 数据链路层 | 链路层 |
| 物理层 | 👆 |
我们最常用的http、ssh、dns都是在应用层上进行处理的,并且在http报文传输中的本质过程就是数据封装和解封装的一个过程
握手与挥手
TCP三次握手过程
- 客户端:发送SYN帧打开请求传输通道
- 服务器:收到,回包进行确认
- 客户端:自身状态改变,发送ACK最终确认
- 数据传输......
TCP四次挥手过程
- 客户端或服务器:发送请求断开的报文
- 收到,并回复:我接受你的分手
- 被分手的人继续完成最后的数据发送......然后回复报文:我发送完成了,拜拜
- 最终确认,关闭连接
TCP的连接状态
可以在Linux用netstat进行查看
参数解释
2.4 长连接的配置
长连接的本质是TCP连接建立后该传输层连接不再进行释放,供应用层反复使用,如果客户端在首部加上Connection:Keep-Alive请求头,表示请求服务端将传输层TCP连接保持在打开状态;如果服务端同意将这条TCP连接保持在打开状态,就会在HTTP响应中包含同样的首部
那么,怎么配置长连接呢?
独立部署Tomcat
修改apache-tomcat-8.5.69\conf\server.xml文件中的Connector(连接器)的配置,死命写参数
SpringBoot内嵌式Tomcat
可以通过配置TomcatServletWebServerFactory容器工厂Bean实例
Nginx长连接配置
去修改那个conf文件
设计原则
连接不是时间越久越好,需要看单个用户在单位时间内的请求次数而定
2.5 Apache HttpClient
引入依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
算了,不写了
| 文章目录 |
|---|
| Apache HttpClient示例_一名可爱的技术搬运工-CSDN博客 |
三、https
HTTP不安全,所以引入了HTTPS,引入安全通道和密钥机制,在HTTP的基础上加入了SSL/TLS协议,TLS是传输层加密协议,前身是SSL协议,两者不作太多区分。
3.1 概述
为什么http协议不安全?
- 明文通信
- 身份无需验证
- 对报文的完整性没有校验
鉴于上述问题,https应运而生,而http协议与https协议的核心区分其实是在应用层上
而在SSL/TLS协议中,包括
- 握手协议 用来在协商通信的过程中使用加密套件(加密算法、密钥交换算法和MAC算法等),在服务端和客户端之间安全地交换密钥、实现服务端和客户端的身份验证。
- 密码变化协议 客户端服务端之间的密码变化协议,变化通知对端后,后面的报文都用新协商好的加密套件和密钥进行传输。
- 警告协议 用来向对端发送告警信息,消息中包含告警的严重级别和描述。
- 应用数据协议 真正承载的应用数据。
- 记录协议 类似于校验和,将上述的协议进行分块计算、MAC值处理等。
3.2 SSL/TLS的握手过程
基本流程如下
- 客户端向服务端索要并颜值公钥;
- 双方协商一致生成“对话密钥”;
- 使用上述密钥进行加密通信,并验证握手消息是否被第三方修改。
到最后,双端的握手阶段结束,然而在后续的通信过程中仍然使用的是http协议或WebSocket协议,只是在应用层上报文内容都进行了加密。
上述流程是以单向认证的握手流程为蓝本进行描绘的。
3.3 Keytool & 单向认证与双向认证
简单理解一下
-
Keytool:Java中管理和生成自签名证书的工具
是Java中自带的工具,将密钥(Key)和证书(Certificates)存在一个格式为“.keystore”(或.jks)的文件中,然后可以导出自签发的数字证书。在JDK安装过程中,Keytool工具已经解压到对应的JDK的/bin目录中,其可执行文件的文件名为keytool.exe。
文章目录 keytool (oracle.com) Java制作证书的工具keytool用法总结 - 孤傲苍狼 - 博客园 (cnblogs.com) -
单向认证:客户端对服务端进行身份验证
-
双向认证:客户端服务端双向认证
下一节进入实战案例
3.4 Netty通信中的SSL/TLS
不做了,懒
| 文章目录 |
|---|
| netty使用ssl双向认证 - 知乎 (zhihu.com) |
| netty4,openssl双向认证 - 谈建林的个人空间 - OSCHINA - 中文开源技术交流社区 |
| Netty及SSL/TLS介绍_摩登时代-CSDN博客_netty ssl |
| Netty使用技巧-使用Openssl加密传输【附源码】_大新哥666_51CTO博客 |