HTTP 协议格式大揭秘:Fiddler 助阵,网络交互全掌握!
HTTP介绍
HTTP是超文本传输协议(Hypertext Transfer Protocol)的缩写,是一种应用非常广泛的应用层协议
我们平时打开一个网站,就是通过HTTP协议来传输数据的.
HTTP不仅能传输文本,还能传输图片,视频,音频.......
当我们在浏览器中输入小米的"URL"(即网址),浏览器就给小米的服务器发送了一个http请求,小米的服务器返回了一个http响应, 这个响应结果被浏览器解析了以后,就展示成了我们看到的页面的内容(这个过程中浏览器就会给小米服务器发送多个HTTP请求, 服务器也会相应的返回请求,这些相应里面就包含了HTML,CSS,JacaScript,图像,字体等信息)
可以看到页面上方多出来了个 "https://" ,(HTTPS是HTTP协议的安全版本,主要目的是保护用户数据在网络传输过程中的安全性,防止数据被窃取、篡改或中间人攻击。(可以理解为HTTPS是HTTP的plus版本)).
理解-应用层协议
例一
假设你在一个购物网站(比如淘宝)上购物,这其中就涉及到应用层协议。
你在手机或电脑上打开淘宝应用(就相当于一个客户端),然后你搜索一个商品,比如 “运动鞋”。当你点击搜索按钮时,你的客户端就会按照一种事先约定好的规则(这就是应用层协议,比如 HTTP 协议)来构建一个请求。这个请求有点像你写了一张纸条给商店的店员,纸条上写着 “我想要查找运动鞋相关的商品”。
然后这个请求通过网络传输到淘宝的服务器上。服务器收到这个按照协议发来的请求后,就知道你想要搜索运动鞋。服务器根据自己的数据库查找相关商品的信息,之后它又按照协议(HTTP 协议)把搜索到的运动鞋的商品信息(比如图片、价格、描述等)构建成一个响应,就像店员把你要的商品清单写在一张纸上。
最后,这个响应再通过网络传输回你的客户端,你的淘宝应用接收到这个按照协议传输回来的响应后,就能够正确地解析这些信息,然后把运动鞋的商品列表展示在你的屏幕上。
在这个过程中,如果没有 HTTP 这种应用层协议规定好客户端和服务器之间如何构建请求、传输数据、解析响应等规则的话,你的客户端和淘宝服务器之间就无法准确地进行这样的交互,就像你和店员没有共同的语言(交流规则),你就没办法顺利买到东西一样。
例二
就像世界上不同国家的人如果没有统一的语言(比如英语作为一种国际交流语言),就很难进行交流一样。不同的应用程序如果没有应用层协议,就不知道如何互相发送和接收信息。应用层协议为所有的应用程序提供了一个统一的标准,这样不管是哪个公司开发的浏览器、邮件客户端或者文件传输软件,只要遵循相应的应用层协议,就能够在网络上进行有效的信息传递。
理解HTTP协议工作过程
HTTP协议,是一种典型的"一问一答"式协议;
我们可以通过浏览器的开发者工具观察到这个过程;
打开浏览器 按 F12 键进入开发者工具,切换到NetWork标签页,刷新即可看到下图的效果,每条记录都是HTTP响应
HTTP协议格式
借助抓包工具,可以观察到 HTTP请求/响应 的具体情况(抓包:获取通过网卡的数据并解析显示出来)
Fiddler抓包
这里我们使用Fiddler,官网链接如下:
Web Debugging Proxy and Troubleshooting Tools|Fiddler (telerik.com)https://www.telerik.com/fiddler
1.首先,要确保电脑中退出了其他的代理类软件(vpn/浏览器插件)
2.开启Fiddler的HTTPS功能
点击 Tools ,然后点击Options...
点击HTTPS, 然后把没勾选的都勾选上,最后点击OK
首次使用会弹出一个框,点击 "是" 就可以了
只要启动Fiddler,抓包工作就开始了
左侧是抓到的http数据报的列表
点击其中某一项,右侧就会显示出请求和响应的基本情况
右上方,是请求的详情
右下方,是相应的详情(下方响应乱码是二进制,原本响应也是文本,此处二进制是压缩后的)
点击上方的 Raw 标签,就能显示出http请求和响应的原始模样
HTTP协议格式
HTTP请求:
- 首行: 方法 + URL + 版本
- 请求头:由一系列的键值对构成,键和值之间使用 ": " 分割; 每组属性之间使用\n分隔; 遇到空行表示结束
- 空行: 请求头结束标记
- 正文(body):有的请求有body,有的没有(比如,GET往往不带body,POST往往带body)
HTTP响应:
- 首行: 版本号 + 状态码 + 状态码解释
- 响应头: 每一行是一个键值对,不确定几行,以空行结尾,键和值之间用 ": " 分割
- 空行:响应头结束标记
- 正文(body) : 对于响应来说,正文通常是HTML/CSS/JavaScript/JSON/图片/英文/字体
为什么 HTTP 报文中要存在 "空行" ?
因为HTTP协议没有规定报头部分的键值对有多少个,空行就相当于是报头结束的标志(或者是报头和正文之间的 "分割符")
HTTP协议在传输层依赖于 TCP 协议,而 TCP 是面向字节流的,没有空行就可能出现"粘包问题"
URL
URL(Uniform Resource Locator),统一资源定位符,也是我们常说的 "网址",用于在互联网上标识和定位地址
URL组成
- 协议方案名: 用于访问资源的协议类型,常见的有 HTTP 和 HTTPS
- 例如,在 “https://www.example.com” 中,“https” 就是协议部分。
- 登录信息: (已过时)现在网站一般不会使用URL进行身份认证了
- 服务器地址: 可以是 IP,也可以是 域名(域名会通过DNS解析成IP)
- 服务器端口号: IP确定唯一的主机,端口号确定主机上的程序(端口号省略时,浏览器会通过协议类型自动分配端口号(HTTP协议,浏览器自动加上 80 端口号,HTTPS 协议,浏览器自动加上 443 端口号)
- 例如,“https://www.example.com:8080” 中的 “8080” 就是端口号。
- 带层次的文件路径: 确定服务器上的具体资源(包含很多网页,图片....)
- 例如,在 “https://www.example.com/somepage.html” 中,“/somepage.html” 就是路径部分。
- 查询字符串(Query string): 键值对结构,针对要访问的资源进补充说明
- 键值对之间,使用 "&" 分割
- 键和值之间,使用 "=" 分割
- 例如,“https://www.example.com/search?q=keyword&page=2” 中的 “q=keyword&page=2” 就是查询字符串。( "?" 后面的就是查询字符串)
- query string中的内容,一般是程序员自定义的
- 片段标识符: 表示一个页面中某个部分的,常见于文档类网站
- 例如,在 “https://www.example.com/page.html#section2” 中,“#section2” 就是片段标识符,它可以用于在页面加载后直接定位到特定的章节或部分。
URL中可以省略的部分
- 协议名:省略后默认为 https://
- IP地址/域名: 在HTML中可以省略, 省略后表示服务器的 ip/域名 与当前 HTML 所属的 ip/域名 一致
- 端口号: 根据协议自动添加端口号. HTTP协议通常为 80 端口号,HTTPS协议通常为 443 端口号
- 带层次的文件路径: 省略后相当于 /. 对于一些网站,当只输入域名而不指定具体路径时,服务器可能会默认返回一个特定的页面,通常是网站的首页
- 查询字符串
- 片段标识符
URL encode
query string 键值对结构值,可以包含各种内容, 万一值里面出现一些特殊的符号,可能是URL解析出现问题(URL中某些符号有特殊含义:例如: ":" "=" "&" "/" "@" "?"......)
URL encode 本质上就是把这些特殊含义的符号经过一些特定的规则给替换掉
转义规则:把要转义的字符/汉字,每个字节用 十六进制 的方式表示出来,给每个字节前面加上 %
例如: 我们在浏览器搜索一下 c++
+ 字符就被转义成了 %2B