> 技术文档 > 【JavaEE精炼宝库】HTTP | HTTPS 协议详解

【JavaEE精炼宝库】HTTP | HTTPS 协议详解


文章目录

  • 一、HTTP 简介
  • 二、HTTP 协议格式
    • 2.1 抓包工具的使用:
    • 2.2 HTTP 请求报文格式:
    • 2.3 HTTP 响应报文格式:
    • 2.4 HTTP 协议格式总结:
  • 三、HTTP 请求详解:
    • 3.1 刨析 URL:
    • 3.2 方法(method):
      • 3.2.1 GET 方法:
      • 3.2.2 POST 方法:
      • 3.2.3 经典面试题:谈谈 GET 和 POST 的区别:
      • 3.2.4 其他方法:
    • 3.3 HTTP 请求的构造方式:
    • 3.4 请求报头(header):
    • 3.5 请求正文(body):
  • 四、HTTP 响应详解:
  • 五、HTTPS(重点)
    • 5.1 核心概念:
    • 5.2 HTTPS 的工作流程:
      • 5.2.1 对称加密:
      • 5.2.2 非对称加密:
      • 5.2.3 中间人攻击:
      • 5.2.4 引入证书:
      • 5.2.5 完整流程:

一、HTTP 简介

HTTP (全称为\"超文本传输协议\")是一种应用非常广泛的应用层协议。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

HTTP 往往是基于传输层的 TCP 协议实现的。(HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3 基于 UDP 实现)。

目前我们主要使用的还是 HTTP1.1 和 HTTP2.0。本文章主要以 HTTP 1.1 版本为主。

https 是在 http 基础之上做了一个加密解密的工作(SSL)。

二、HTTP 协议格式:

HTTP 是一个文本格式的协议。可以通过 Chrome 开发者工具或者 Fiddler 抓包,分析 HTTP 请求/响应的细节。

由于 Fiddler 抓 HTTP 的效果更好,所以我们采用 Fiddler 作为我们的抓包工具。

2.1 抓包工具的使用:

Fiddler 下载地址:Fiddler 官网

下载流程:

  1. 打开官网,点击下面红色框框里面的内容。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

  1. 填入信息即可安装。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

  1. 安装成功后的界面如下(左边一开始不一定有信息):

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

  1. 出现这个页面,一定要选取“是”同意安装证书,否则无法抓取 HTTPS(如果点了否,就要卸掉,重新安装)。

    【JavaEE精炼宝库】HTTP | HTTPS 协议详解

使用教程:

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

  • 左侧窗口显示了所有的 HTTP请求/响应,可以选中某个请求查看详情。

  • 右侧上方显示了 HTTP 请求的报文内容。(切换到 Raw 标签页可以看到详细的数据格式)。

  • 右侧下方显示了 HTTP 响应的报文内容。(切换到 Raw 标签页可以看到详细的数据格式)。

  • 请求和响应的详细数据,可以通过右下角的 View in Notepad 通过记事本打开。

  • 可以使用 ctrl + a 全选左侧的抓包结果,delete 键清除所有被选中的结果。

点击左下角 Capturing 即可停止抓包,再次点击开始抓包。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

抓包工具的原理:

Fiddler 相当于一个 “代理”。

浏览器访问 csdn 时,就会把 HTTP 请求先发给 Fiddler,Fiddler 再把请求转发给 csdn 的服务器。当 csdn 服务器返回数据时,Fiddler 拿到返回数据,再把数据交给浏览器。因此 Fiddler 对于浏览器和 csdn 服务器之间交互的数据细节,都是非常清楚的。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

2.2 HTTP 请求报文格式:

一个 HTTP 请求报文,分成 4 个部分(1)首行(2)请求头(3)空行(4)正文。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

  1. 首行:

首行又包含三个部分。

  • 请求的方法(GET,POST之类的)。
  • 请求的 URL(请求的对方地址)。
  • 版本号(例如 HTTP/1.1)。

这三个部分使用空格进行区分。

  1. 请求头(header):

请求的属性,冒号分割的键值对。

每组属性之间使用\\n分隔。

遇到空行表示就 Header 部分结束。

  1. 空行:

最后一个 header 后面,存在一个空行,类似于链表,使用 null 结尾。

  1. 正文(body):

空行后面的内容都是 Body。Body 允许为空字符串。如果 Body 存在,则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度。

2.3 HTTP 响应报文格式:

一个 HTTP 响应报文也是分成 4 个部分(1)首行(2)响应头(3)空行(4)正文。

基本和 HTTP 的请求报文格式差不多,区别比较大的就是首行,所以接下来主要分析首行。

响应的首行也是由三部分组成(1)版本号(2)状态码(3)状态码描述。

状态码和状态码描述,可以反应此次响应具体情况。

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

2.4 HTTP 协议格式总结:

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

这里有个问题:为什么 HTTP 报文要存在 “空行”?

因为 HTTP 协议并没有规定报头部分的键值对有多少个。空行就相当于是 “报头的结束标记”,或者是\"报头和正文之间的分隔符\"。HTTP 在传输层依赖 TCP 协议,TCP 面向字节流,如果没有这个空行,