【大家好,我是爱干饭的猿,本文介绍应用层HTTP协议、HTTPS协议、当你在浏览器中输入网址后,到底发生了什么事情?HTTPS 如何进行的加密?对称加密、非对称加密、CA证书又是什么?
后续会继续分享Spring、SpringMVC、MyBatis及其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】
上一篇文章:《【web】计算机网络网络层、应用层、数据链路层协议详解》
🤞目录🤞
1.6 通过 Java socket 构造 HTTP 请求与响应
1.7 HTTP 请求响应过程(当你在浏览器中输入网址后,到底发生了什么事情?)
2.3 HTTPS 的加密工作过程(TLS(SSL) 过程)
🚀1. HTTP 协议
1.1 什么是HTTP
HTTP (Hyper Text Transfer Protocol 全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。
HTTP 往往是基于传输层的 TCP 协议实现的,(HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP 实现) 目前我们主要使用的还是 HTTP1.1 和 HTTP2.0。
所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些 其他的资源, 比如图片, 视频, 音频等二进制的数据
1.2 理解应用层协议
主要职责:描述业务
学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程 [ IP+Port ],但是我们的任务并没有结束,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或 者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节! 这层协议叫做应用层协议。
1.3 HTTP 协议格式
HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节
抓包结果:
a. HTTP请求

- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度;
b. HTTP响应

- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页 面内容就是在body中
协议格式总结
为什么 HTTP 报文中要存在 "空行"?
因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者 是 "报头和正文之间的分隔符"
HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题"
1.4 HTTP 请求 (Request)
1. 认识 URL
如何表达我们要请求哪个资源,就需要URL(Uniform Resource Locator 统一资源定位符)
统一资源标识符(Unique Resource ldentifier URI),平时我们俗称的 "网址" 其实就是说的 URL,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL 基本格式:

比如一个URL: https://www.ddd.com/web/login.html?userId=10000&classId=100
- https : 协议方案名. 常见的有 http 和 https, 也有其他的类型
- user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略
- www.ddd.com : 服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址. (通过 ping 命令可以看到, v.bitedu.vip 的真实 IP 地址为 118.24.113.28 )
- 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用 哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口
- /web/login.html : 带层次的文件路径
- userId=10000&classId=100 : 查询字符串(query string). 本质是一个键值对结构. 键值对之间使用 & 分隔. 键和值之间使用 = 分隔
- 片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转
URL哪些部分可以省略?
- https://协议名: 可以省略, 省略后默认为 http://
- ip 地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名一致
- 端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80; 如果是 https 协议, 端口号自 动设为 443
- 带层次的文件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候自动访问 /index.html
- 查询字符串: 可以省略
- 片段标识: 可以省略
2. 认识请求 "方法" (method)

1. GET 方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源. 在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求. 另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求。
GET 请求的特点
- 首行的第一部分为 GET
- URL 的 query string 可以为空, 也可以不为空
- header 部分有若干个键值对结构
- body 部分为空
- 实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现
在浏览器端, 不同的浏览器最大长 度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的。
2. POST 方法
POST 方法也是一种常见的方法. 多用于提交用户输

最低0.47元/天 解锁文章
1161

被折叠的 条评论
为什么被折叠?



