Skip to content

2026-02-11-网络原理-HTTP_HTTPS

HTTP(S) 请求需要使用抓包工具来抓取,入门是可以使用 Fiddler 来抓取

HTTP

请求

URL

结构

就以 http://www.msftconnecttest.com/connecttest.txt 为例

  • http://: 是表示请求协议
  • www.msftconnecttest.com: 是表示请求地址,如果是 http 协议请求的是 80 端口或者 https 请求的是 443 端口,这两个情况下端口是可以省略的
  • /connecttest.txt: 是表示资源存储的路径
  • #: 是用来表示标志符,用来定位当前页面的位置的,一般用于文档(补充)
  • uuid=xxxx&lang=EN: 这个是请求参数,一般放在请求地址的后面,请求参数与地址用 ? 隔开,参数与参数直接用 & 隔开(补充)
encode

encode 是用来处理中文/特殊字符等情况,防止解析出错的问题。

比如:在 bing 上面访问 c++ 它就会访问 https://www.bing.com/search?form=QBLH&q=c%2B%2B 其中 %2B 就是 +ASCII 的16进制表示

结构

Text
GET http://www.msftconnecttest.com/connecttest.txt HTTP/1.1
Connection: Close
User-Agent: Microsoft NCSI
Host: www.msftconnecttest.com

就以这个为例,

  • 第一行:GET 表示请求的方法,中间那一长串表示URL地址,最后一个是HTTP请求的版本
  • 第二行到空行之前,都是请求头,它们是键值对的方式存储
  • 空行它在倒数第二行,它是用来区分请求头和请求体
  • 请求体这里是没有的

请求方法

请求方法用到最多的两个就是 GETPOST

  • GET:表示从服务器上获取数据
  • POST:将数据推送给服务器

问题:

  • GETPOST 有什么区别?(面试题)

    实际上它们没有什么太大的区别,因为相互之间是可以互相转换的

    要是正的说区别,还是有的

    1. GET 的请求参数是放在 URL 上面的,POST 的参数是放在请求体里面的
    2. GET 是表示获取数据,POST 表示输入数据

报头

HOST

请求的主机地址,比如 8.8.8.8, blog.774822.xyz 等,它可以用来和请求的URL 校对

Content-Length

表示请求体(body)的长度,如果没有,浏览器就会自己猜测,可能会出现问题

Content-Type

存储请求体的类型和字符集,比如 text/html; charset=utf-8

User-Agent(UA)

表示请求的客户端的类型,可以用来表示浏览器的版本,是PC端还是移动端

Referer

表示从哪里跳转过来的,如果没有,可以不写。它是可以统计广告的跳转次数

在十几年以前(2014年左右),由于当时基本是使用 http 协议,如果路由器/交换机被攻破,就可以修改 Referer,从而影响到广告计费。 因此为了解决像这样类似的安全问题,就引入 https 进行加密,解决这个问题

Cookie与Session生成
Cookie与Session生成
为了安全,浏览器是不允许直接从硬盘上访问/存储数据,但是是有存储需求,所以设置了 Cookie 来管理数据

比如 Cookie 可以存储主题模式,也可以存储访问令牌。

问题

  • CookieSession 有什么区别?

    • Cookie 是一般存储在用户端,而 Session 是存储在服务器上。
    • Cookie 一般只存储一个 Id, Session 是存储一些列的用户信息,比如用户名,昵称等

响应

  • 第一行:第一个是HTTP请求的版本,第二个是响应码,第三个是响应信息
  • 第二行到空行之前,都是响应头,它们是键值对的方式存储
  • 空行它在倒数第二行,它是用来区分请求头和请求体
  • 响应体表示响应的结果信息

状态码

200

这个最常见的情况,表示数据响应正常,没有问题。

这里的“没有问题”指的是响应没有问题,不是业务没有问题。

比如创建用户的时候,用户名重复会报一个错误,但是响应的状态码依然是200, 这个不是响应出现问题,而是业务上的问题

301

永久重定向,一般不会使用这个,因为设置了永久重定向后,浏览器就会存储缓存,如果需要修改,那么就会出现因为缓存而导致的问题

302

临时重定向,开发中一般是使用这个来重定向。这个可以比较方便修改,不需要考虑因为缓存导致的问题

403

找到资源,但因为权限不足,无法获取。比如 gitee 设置为私有仓库,外部人员访问就会显示权限不足

404

没有找到资源,这个是一个比较常见的情况。

500

服务器错误,比如 Java 服务器抛出异常但是没有处理。这个也是一个比较场景的状态码

504

网关异常。当网络负载较大的时候会出现的异常

总结
状态码表示含义
1xx信息正在处理
2xx响应正常
3xx重定向
4xx客户端异常
5xx服务器异常

HTTPS

HTTPS 是 基于 HTTP 来实现的,它是在 HTTP 的基础上进行加密,从而保障了数据的安全性

加密类型

对称加密

双方使用同一个密钥进行加密/解密。效率是比非对称加密高很多

非对称加密

两个密钥,一把是公钥,一把是私钥。通过其中一把密钥,可以把另一把密钥加密的数据进行解密。

执行过程

由于使用对称加密,中间总会有一段是明文传输的,所以对称加密就不适合。因此采用非对称加密。
HTTPS-执行过程
HTTPS-执行过程
为了安全,每一个客户端都会自己生成一对对称加密的密钥,但是公钥/私钥是由服务器生成的。在服务器获取到客户端生成的密钥后,为了效率,后面的数据都是使用对称加密/解密

中间人攻击

HTTPS-执行过程-中间人攻击
HTTPS-执行过程-中间人攻击

上面是有一个很大的漏洞,由于客户端无法判断公钥是否是服务器的,所以可以通过中间设备来伪装公钥来代替服务器的公钥,就是中间的设备可能会伪装双方,实施中间人攻击。

CA证书签发

结构
  • 发起方:需要有 域名和服务器公钥
  • 返回的包:供应商,域名,有效期,公钥,数字签名

数字签名是和公钥强绑定的,它是由公钥等属性计算出哈希值后通过CA机构使用私钥加密获取的

流程
HTTPS-执行过程-CA证书申请过程
HTTPS-执行过程-CA证书申请过程

CA 证书能不能被修改呢?

不能。因为业务机构自己会验证一下个人是否拥有这个域名,如果没有这个域名/域名里面没有相关的信息,那么就不会申请这个证书来加密

中间人攻击解决方法

就是引入证书,通过证书的数字签名,来判断公钥是否被修改了。本地存储电脑内核出厂自带的CA公钥 pub3,
HTTPS-执行过程-中间人攻击解决
HTTPS-执行过程-中间人攻击解决
假设中间人密钥对是 pub2-pri2,CA机构的密钥对是 pub3-pri3
  • 中间人能不能把服务器响应的内容修改为自己的?

    不能。无论是修改公钥还是把公钥和数字签名都修改,这两个都不能解决,因为公钥(pub3)是在客户端手上,是无法伪装的

    • 改公钥(pub2):数字签名校验不会通过
    • 改公钥和数字签名:客户端的公钥(pub3)无法正确解析中间人的私钥(pri2)
  • 中间人能不能把 pub3 修改为 pub2 来伪装自己是密钥呢?

    不能。pub3 是系统内核出厂自带的,不是通过网络传输的。如果下载了第三方不知名的证书(把pub2加入在自己客户端上面),而且刚好中间人是被入侵有(pri2) 那么是会被中间人攻击的(Fiddler就是利用这样的原理)