文章目录
本文介绍了HTTP协议的基本概念和抓包分析技术。主要内容包括:1)HTTP协议的发展历程,从HTTP1.x到HTTP3的演变,重点说明加密机制的变化;2)HTTP抓包方法,演示如何通过Wireshark捕获明文HTTP流量;3)HTTPS解密技术,详细讲解配置浏览器导出TLS密钥实现HTTPS流量解密的过程;4)HTTP状态码分类,列举了1XX-5XX共5大类状态码及其具体含义。文章通过实际案例展示了网络协议分析的技术细节,为理解HTTP/HTTPS协议工作原理提供了实用参考。
http抓包
HTTP即HyperText Transfer Protocol,超文本传输协议,我们平时上网看到的网页,就是用的http协议,只不过http有不同的版本,早期http不提供加密,安全性较差,所以现在基本不怎么用了,取而代之的是http2和http3。
浏览器的地址栏最开头的https,表示的是HTTP over SSL(Secure Socket Layer),即加密了的http。如果某网站以http开头,那么浏览器会提醒不安全,因为http是明文传输,可能会被人拦截后造成隐私泄露。一般来说,http1.x默认是不加密的,http2默认加密,http3则是必须加密。目前大部分https开头的网址,内部走的都是http2协议,但http3会越来越多。
现在想找一个不加密的http网站还真是困难,我找了老半天,终于找到了这个测试网站:http://neverssl.com,域名说的就是不加ssl,非常直观且友好。打开wireshark之后,以http为过滤器,然后点击进入该网站,Wireshark就可以看到具体传输的网页内容了,抓取结果如下

下面分析第902条HTTP的报文,由于抓取到的内容太多,这里就不列出具体内容了,但其前54个字节是IP、TCP等协议的内容,http/1.1的头部从0x0048开始,其开始几个字节是【00 00 48 54 54 50 2f 31 2e 31】,对应的ASCII码正好是【.HTTP/1.1】。
https抓包
由于HTTPS加密了,所以WireShark抓不到,要是非想要抓到,就得解密。Edge浏览器基于Chromium,支持导出TLS密钥,步骤如下
-
【1】Edge设置
- 关闭所有 Edge 窗口,新建一个临时目录,如C:\tlskeys
- 系统环境变量里新增(WIN+R → SystemPropertiesAdvanced → 环境变量):
- 变量名:SSLKEYLOGFILE
- 变量值:C:\tlskeys\edgekey.log
-
重新启动 Edge(必须从系统图标或开始菜单启动,不要从命令行)。
-
打开 Edge 访问任意 HTTPS 站点,确认edgekey.log文件已生成并持续增长。
-
【2】WireShark设置:【编辑】→【首选项】->【Protocols】→【TLS】,将【(Pre)-Master-Secret log filename】指向【C:\tlskeys\edgekey.log】→【确定】
这时再输入过滤条件【tls && (http || http2 || http3)】,并通过edge浏览器访问网页,就可以看到WireShark中远远不断的报文了。
http返回码
在我们一开始请求的页面的报文中,HTTP/1.1后面马上就是301,这是一个HTTP状态码,301表示永久移动。所以,虽然我们用WireShark抓到了neverssl.com的网页,但浏览器中并未在此停留,而是马上跳转到了新的页面。
http的相应总共分为5类,分别用起始位标识,分别代表
- 1XX 信息,服务器收到请求,需要请求者继续执行操作
- 2XX 成功,操作被成功接收并处理
- 3XX 重定向,需要进一步的操作以完成请求
- 4XX 客户端错误,请求包含语法错误或无法完成请求
- 5XX 服务器错误,服务器在处理请求的过程中发生了错误
具体状态码如下
| 状态码 | 含义 |
|---|---|
| 100 | 继续。客户端应继续其请求 |
| 101 | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
| 200 | 请求成功。一般用于GET与POST请求 |
| 201 | 已创建。成功请求并创建了新的资源 |
| 202 | 已接受。已经接受请求,但未处理完成 |
| 203 | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
| 204 | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
| 205 | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
| 206 | 部分内容。服务器成功处理了部分GET请求 |
| 300 | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表供用户终端(例如:浏览器)选择 |
| 301 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。 |
| 302 | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
| 303 | 查看其它地址。与301类似。使用GET和POST请求查看 |
| 304 | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。 客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
| 305 | 使用代理。所请求的资源必须通过代理访问 |
| 306 | 已经被废弃的HTTP状态码 |
| 307 | 临时重定向。与302类似。使用GET请求重定向 |
| 400 | 客户端请求的语法错误,服务器无法理解 |
| 401 | 请求要求用户的身份认证 |
| 402 | 保留,将来使用 |
| 403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
| 404 | 大名鼎鼎的404,表示服务器无法找到资源(网页) |
| 405 | 客户端请求中的方法被禁止 |
| 406 | 服务器无法根据客户端请求的内容特性完成请求 |
| 407 | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
| 408 | 服务器等待客户端发送的请求时间过长,超时 |
| 409 | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
| 410 | 客户端请求的资源已经不存在,表示以前有现在被永久删除了 |
| 411 | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
| 412 | 客户端请求信息的先决条件错误 |
| 413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求。 |
| 414 | 请求的URI过长(URI通常为网址),服务器无法处理 |
| 415 | 服务器无法处理请求附带的媒体格式 |
| 416 | 客户端请求的范围无效 |
| 417 | 服务器无法满足请求头中 Expect 字段指定的预期行为。 |
| 418 | 表示你正在访问的是一个茶壶,因此无法满足。(好冷......) |
| 500 | 服务器内部错误,无法完成请求 |
| 501 | 服务器不支持请求的功能,无法完成请求 |
| 502 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
| 503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
| 504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
| 505 | 服务器不支持请求的HTTP协议的版本,无法完成处理 |