【大家好,我是爱干饭的猿,本文介绍应用层HTTP协议、HTTPS协议、当你在浏览器中输入网址后,到底发生了什么事情?HTTPS 如何进行的加密?对称加密、非对称加密、CA证书又是什么?
后续会继续分享Spring、SpringMVC、MyBatis及其他重要知识点总结,如果喜欢这篇文章,点个赞,关注一下吧】
上一篇文章:《【web】计算机网络网络层、应用层、数据链路层协议详解》
目录
1. HTTP 协议
1.1 什么是HTTP
1.2 理解应用层协议
1.3 HTTP 协议格式
a. HTTP请求
b. HTTP响应
1.4 HTTP 请求 (Request)
1. 认识 URL
2. 认识请求 "方法" (method)
3. 认识请求 "报头" (header)
4. 认识请求 "正文" (body)
1.5 HTTP 响应(Response)
1. 认识 "状态码" (status code)
2. 认识响应 "报头" (header)
3. 认识响应 "正文" (body)
1.6 通过 Java socket 构造 HTTP 请求与响应
1. 构造 HTTP 请求
2. 构造 HTTP 响应
1.7 HTTP 请求响应过程(当你在浏览器中输入网址后,到底发生了什么事情?)
2. HTTPS协议
2.1 什么是HTTPS
2.2 "加密" 是什么
1. 对称加密(AES算法)
2. 非对称加密(RSA算法)
3. CA证书
4. 加密和数据摘要的区别
2.3 HTTPS 的加密工作过程(TLS(SSL) 过程)
HTTP (Hyper Text Transfer Protocol 全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。
HTTP 往往是基于传输层的 TCP 协议实现的,(HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP 实现) 目前我们主要使用的还是 HTTP1.1 和 HTTP2.0。
所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些 其他的资源, 比如图片, 视频, 音频等二进制的数据
主要职责:描述业务
学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程 [ IP+Port ],但是我们的任务并没有结束,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或 者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节! 这层协议叫做应用层协议。
HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节
抓包结果:
为什么 HTTP 报文中要存在 "空行"?
因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者 是 "报头和正文之间的分隔符"
HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题"
如何表达我们要请求哪个资源,就需要URL(Uniform Resource Locator 统一资源定位符)
统一资源标识符(Unique Resource ldentifier URI),平时我们俗称的 "网址" 其实就是说的 URL,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL 基本格式:
比如一个URL: https://www.ddd.com/web/login.html?userId=10000&classId=100
URL哪些部分可以省略?
1. GET 方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源. 在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求. 另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求。
GET 请求的特点
在浏览器端, 不同的浏览器最大长 度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的。
2. POST 方法
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面). 通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求
POST 请求的特点
谈谈 GET 和 POST 的区别
补充说明:
其他方法
这些方法的 HTTP 请求可以使用 ajax 来构造
header 的整体的格式也是 "键值对" 结构. 每个键值对占一行. 键和值之间使用分号分割
常用请求头:
正文中的内容格式和 header 中的 Content-Type 密切相关
状态码表示访问一个页面的结果
以 1xx 为开头的都表示接收请求正在处理。
以 2xx 为开头的都表示请求成功响应。
响应报头的基本格式和请求报头的格式基本一致. 类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致
正文的具体格式取决于 Content-Type
响应中的 Content-Type 常见取值有以下几种:
text/html : body 数据格式是 HTML
text/css : body 数据格式是 CSS
application/javascript : body 数据格式是 JavaScript
application/json : body 数据格式是 JSON
public class HttpClient {
public HttpClient(){}
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 80);
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "utf-8"));
String request = "GET / HTTP/1.0\r\n\r\n";
writer.println(request);
writer.flush();
InputStream is = socket.getInputStream();
byte[] buf = new byte[10240];
int n = is.read(buf);
String response = new String(buf, 0, n, "utf-8");
System.out.println(response);
}
}
public class HttpServer {
public HttpServer(){}
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(80);
while (true){
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "utf-8"));
String html = "百度一下";
byte[] bytes = html.getBytes("utf-8");
int contentLength = bytes.length;
// Content-Type: application/octet-stream;
String response = "HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 49\r\n\r\n" + html;
writer.println(response);
writer.flush();
socket.close();
}
}
}
让我们通过一个例子来探讨一下,我们假设访问的 URL 地址为 http://www.ddd.com/web/index.html,当我们输入网址并点击回车时,浏览器内部会进行如下操作:
至此,键入网址再按下回车的全过程就结束了。上述过程描述的是一种简单的请求-响应全过程,真实的请求-响应情况可能要比上面描述的过程复杂很多。
HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层.
HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被窃听、篡改、伪造的情况。
简单来说HTTPS = HTTP + TLS(SSL)
加密就是把 明文 (要传输的信息)进行一系列变换, 生成 密文
解密就是把 密文 再进行一系列变换, 还原成 明文
用来辅助的就是密钥。
对称加密:加密和解密的密钥是相同的。
速度快
非对称加密:加密和解密的密钥是不同的。
速度慢
在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书. 这个证书包含了刚才的公钥, 也包含了网站的身份信息。
CA 机构用自己的私钥对签名进行加密,得到签名密文,如果客户能用CA给的公钥将签名密文解密为签名。说明签名没问题,证书就没问题。
加密:数据经过加密,可以被解密
数据摘要:数据经过hash后,不能得到原数据
既然要保证数据安全, 就需要进行 "加密".
所以引入对称加密,其实就是通过同一个 "密钥" , 把明文加密成密文, 并且也能把密文解密成明文
但是如果直接把密钥明文传输, 那么黑客也就能获得密钥了, 因此密钥的传输也必须加密传输,使用引入了非对称加密。
简单来讲:使用对称加密的方式解决明文传输,使用非对称加密解决密钥的传输,传输的是密文和被加密的密钥。
但是客户端如何获取到公钥?客户端如何确定这个公钥不是黑客伪造的?
为了确保公钥来自服务器,所以引入了CA证书。
通过签名比对,解决证书一定是由CA颁发。数字签名(消息摘要结束Message Digital) 哈希算法MD5/ SHA-512 私钥加密,公钥解密的方式,保证传输方。
TLS(SSL) 就是 HTTPS 的加密工作过程。
分享到此,感谢大家观看!!!
如果你喜欢这篇文章,请点赞加关注吧,或者如果你对文章有什么困惑,可以私信我。