1.HTTP协议
1.什么是HTTP
HTTP (
全称为
"
超文本传输协议
")
是一种应用非常广泛的
应用层协议
.
所谓 " 超文本 " 的含义 , 就是传输的内容不仅仅是文本 ( 比如 html, css 这个就是文本 ), 还可以是一些其他的资源, 比如图片 , 视频 , 音频等二进制的数据。
2.HTTP 协议的工作过程
当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.
事实上
,
当我们访问一个网站的时候
,
可能涉及不止一次的
HTTP
请求
/
响应 的交互过程
.
可以通过
chrome
的开发者工具观察到这个详细的过程
.
通过 F12 打开 chrome 的开发者工具 , 切换到 Network 标签页 . 然后刷新页面即可看到如下图效果. 每一条记录都是一次 HTTP 请求 / 响应
3.HTTP 协议格式
请求和响应的格式第一行不一样,后边的都一样。都分四个部分:
- 行信息(请求=>请求行,响应=>响应行/状态行)
- 头信息(请求=>请求头,响应=>相应头)
- 空行
- body(正文)(请求=>请求正文,响应=>响应正文)
思考问题: 为什么 HTTP 报文中要存在 "空行"?
因为 HTTP 协议并没有规定报头部分的键值对有多少个 . 空行就相当于是 " 报头的结束标记 ", 或者是 " 报头和正文之间的分隔符 ".HTTP 在传输层依赖 TCP 协议 , TCP 是面向字节流的 . 如果没有这个空行 , 就会出现 " 粘包问题 ".
2.抓包工具Fiddler的用法
HTTP
是一个文本格式的协议
.
可以通过
Chrome
开发者工具或者
Fiddler
抓包
,
分析
HTTP
请求
/
响应的细节。
1.Fiddler的使用
- 左侧窗口显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
- 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开.
可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果.
2.Fiddler的原理
Fiddler
相当于一个
"
代理
".
浏览器访问
sogou.com
时
,
就会把
HTTP
请求先发给
Fiddler, Fiddler
再把请求转发给
sogou
的服务器
.
当
sogou
服务器返回数据时
, Fiddler
拿到返回数据
,
再把数据交给浏览器
.
因此
Fiddler
对于浏览器和
sogou
服务器之间交互的数据细节
,
都是非常清楚的
.
3.抓包结果
以下是一个
HTTP
请求
/
响应 的抓包结果
.
HTTP请求
POST http://wup.imtt.qq.com:8080/?encrypt=17&tk=903001ea781d0525bf86d9561ed04ccb50fbb265bbb3304ad8a3d31d7ab428d5323f6e7f03b881db21133b1bf2ae5bc5&iv=80AD8969948C4f0c HTTP/1.1
Q-UA2: PR=PC&CO=WBK&QV=3&PL=WIN&PB=GE&PPVN=10.9.0.4626&COVC=047700&CHID=43665&RL=1920*1080&MO=QB&VE=GA&BIT=64&OS=10.0.19044
Q-GUID: 1216EFF507D5E2D9B21BAE1180D82E2C8B1BFFFD6C7CB6105EC913AF1C157CB3
QQ-S-ZIP: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 QQBrowser/9.3
Host: wup.imtt.qq.com:8080
Content-Length: 288
Pragma: no-cache
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;
HTTP响应
HTTP/1.1 200 OK
Cache-Control: no-cache
Connection: close
Content-Length: 112
Content-Type: application/multipart-formdata
Date: Wed, 08 Jun 2022 09:22:17 GMT
QQ-S-Encrypt: 17
QQ-S-ZIP: gzip
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.