http&https

320 阅读9分钟

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的区别

  1. 请求数据的放置位置不同:Get附在URL后,Post在请求体里
  2. 传输数据量大小不同:Get长度限制在URL中,Post理论上数据不受限
  3. 传输数据安全性不同:Get在URL明文显示,Post藏在请求体里,虽然F12也能看到

1.5 HTTP的2.0

版本产生时间内容发展现状
HTTP/0.91991年不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求没有作为正式的标准
HTTP/1.01996年传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令正式作为标准
HTTP/1.11997年持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码2015年前使用最广泛
HTTP/22015年多路复用、服务器推送、头信息压缩、二进制协议等逐渐覆盖市场

http的2.0版本是一个二进制协议,在以前1.0的时代数据传输是通过应用层的纯文本格式,然而在2.0时代引入了新的数据传输单位,分别是:帧、消息、流,2.0版本会将所有传输的信息分割为更小的消息和数据帧,它有几个特点

  1. 首部压缩
  2. 多路复用
  3. 并行双向传输
  4. 服务端推送
文章目录
[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请求由三个部分组成

  1. 请求头:若干头部的字段,如消息正文长度、字符集等
  2. 请求体:一些数据如Cookie、Token以及一些客户端数据等
  3. 请求行:包含请求方法、URL地址、协议名称和版本号

一个Http响应由三个部分组成

  1. 响应头
  2. 响应体
  3. 响应行

上面的好复杂,看下面的简易版的

报文内的内容,可以通过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三次握手过程

  1. 客户端:发送SYN帧打开请求传输通道
  2. 服务器:收到,回包进行确认
  3. 客户端:自身状态改变,发送ACK最终确认
  4. 数据传输......

TCP四次挥手过程

  1. 客户端或服务器:发送请求断开的报文
  2. 收到,并回复:我接受你的分手
  3. 被分手的人继续完成最后的数据发送......然后回复报文:我发送完成了,拜拜
  4. 最终确认,关闭连接

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协议不安全?

  1. 明文通信
  2. 身份无需验证
  3. 对报文的完整性没有校验

鉴于上述问题,https应运而生,而http协议与https协议的核心区分其实是在应用层上

而在SSL/TLS协议中,包括

  1. 握手协议 用来在协商通信的过程中使用加密套件(加密算法、密钥交换算法和MAC算法等),在服务端和客户端之间安全地交换密钥、实现服务端和客户端的身份验证。
  2. 密码变化协议 客户端服务端之间的密码变化协议,变化通知对端后,后面的报文都用新协商好的加密套件和密钥进行传输。
  3. 警告协议 用来向对端发送告警信息,消息中包含告警的严重级别和描述。
  4. 应用数据协议 真正承载的应用数据。
  5. 记录协议 类似于校验和,将上述的协议进行分块计算、MAC值处理等。

3.2 SSL/TLS的握手过程

基本流程如下

  1. 客户端向服务端索要并颜值公钥;
  2. 双方协商一致生成“对话密钥”;
  3. 使用上述密钥进行加密通信,并验证握手消息是否被第三方修改。

​ 到最后,双端的握手阶段结束,然而在后续的通信过程中仍然使用的是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博客

合家安康,身体健康