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 是面向字节流的,没有空行就可能出现"粘包问题"