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进制表示
结构
GET http://www.msftconnecttest.com/connecttest.txt HTTP/1.1
Connection: Close
User-Agent: Microsoft NCSI
Host: www.msftconnecttest.com就以这个为例,
- 第一行:GET 表示请求的方法,中间那一长串表示URL地址,最后一个是HTTP请求的版本
- 第二行到空行之前,都是请求头,它们是键值对的方式存储
- 空行它在倒数第二行,它是用来区分请求头和请求体
- 请求体这里是没有的
请求方法
请求方法用到最多的两个就是 GET 和 POST
GET:表示从服务器上获取数据POST:将数据推送给服务器
问题:
GET和POST有什么区别?(面试题)实际上它们没有什么太大的区别,因为相互之间是可以互相转换的
要是正的说区别,还是有的
GET的请求参数是放在URL上面的,POST的参数是放在请求体里面的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
Cookie 来管理数据比如 Cookie 可以存储主题模式,也可以存储访问令牌。
问题
Cookie与Session有什么区别?Cookie是一般存储在用户端,而Session是存储在服务器上。Cookie一般只存储一个Id,Session是存储一些列的用户信息,比如用户名,昵称等
响应
HTTP/1.1 200 OK
Content-Length: 22
Cache-Control: max-age=30, must-revalidate
Connection: keep-alive
Content-Type: text/plain
Date: Mon, 31 Aug 2026 06:25:59 GMT
Keep-Alive: timeout=60
Proxy-Connection: keep-alive
Microsoft Connect Test- 第一行:第一个是HTTP请求的版本,第二个是响应码,第三个是响应信息
- 第二行到空行之前,都是响应头,它们是键值对的方式存储
- 空行它在倒数第二行,它是用来区分请求头和请求体
- 响应体表示响应的结果信息
状态码
200
这个最常见的情况,表示数据响应正常,没有问题。
这里的“没有问题”指的是响应没有问题,不是业务没有问题。
比如创建用户的时候,用户名重复会报一个错误,但是响应的状态码依然是200, 这个不是响应出现问题,而是业务上的问题
301
永久重定向,一般不会使用这个,因为设置了永久重定向后,浏览器就会存储缓存,如果需要修改,那么就会出现因为缓存而导致的问题
302
临时重定向,开发中一般是使用这个来重定向。这个可以比较方便修改,不需要考虑因为缓存导致的问题
403
找到资源,但因为权限不足,无法获取。比如 gitee 设置为私有仓库,外部人员访问就会显示权限不足
404
没有找到资源,这个是一个比较常见的情况。
500
服务器错误,比如 Java 服务器抛出异常但是没有处理。这个也是一个比较场景的状态码
504
网关异常。当网络负载较大的时候会出现的异常
总结
| 状态码 | 表示含义 |
|---|---|
| 1xx | 信息正在处理 |
| 2xx | 响应正常 |
| 3xx | 重定向 |
| 4xx | 客户端异常 |
| 5xx | 服务器异常 |
HTTPS
HTTPS 是 基于 HTTP 来实现的,它是在 HTTP 的基础上进行加密,从而保障了数据的安全性
加密类型
对称加密
双方使用同一个密钥进行加密/解密。效率是比非对称加密高很多
非对称加密
有两个密钥,一把是公钥,一把是私钥。通过其中一把密钥,可以把另一把密钥加密的数据进行解密。
执行过程
中间人攻击
上面是有一个很大的漏洞,由于客户端无法判断公钥是否是服务器的,所以可以通过中间设备来伪装公钥来代替服务器的公钥,就是中间的设备可能会伪装双方,实施中间人攻击。
CA证书签发
结构
- 发起方:需要有 域名和服务器公钥
- 返回的包:供应商,域名,有效期,公钥,数字签名
数字签名是和公钥强绑定的,它是由公钥等属性计算出哈希值后通过CA机构使用私钥加密获取的
流程
CA 证书能不能被修改呢?
不能。因为业务机构自己会验证一下个人是否拥有这个域名,如果没有这个域名/域名里面没有相关的信息,那么就不会申请这个证书来加密
中间人攻击解决方法
中间人能不能把服务器响应的内容修改为自己的?
不能。无论是修改公钥还是把公钥和数字签名都修改,这两个都不能解决,因为公钥(pub3)是在客户端手上,是无法伪装的
- 改公钥(pub2):数字签名校验不会通过
- 改公钥和数字签名:客户端的公钥(pub3)无法正确解析中间人的私钥(pri2)
中间人能不能把 pub3 修改为 pub2 来伪装自己是密钥呢?
不能。pub3 是系统内核出厂自带的,不是通过网络传输的。如果下载了第三方不知名的证书(把pub2加入在自己客户端上面),而且刚好中间人是被入侵有(pri2) 那么是会被中间人攻击的(Fiddler就是利用这样的原理)