一、HTTP是什么?
HTTP (全称为 "超⽂本传输协议") 是⼀种应用非常广泛的应用层协议
所谓 " 超文本 " 的含义 , 就是传输的内容不仅仅是文本 ( 比如 html, css 这个就是文本 ), 还可以是一些其他的资源, 比如图片 , 视频 , 音频等二进制的数据。
- 是一个简单的请求响应,运行在 TCP 之上。规定客户端发送什么样的请求以及得到什么样的响应。
- 请求和相应消息的头是以 ASCII 形式给出;而消息类容则已 MIME 格式
当我们在浏览器中输⼊⼀个 搜狗搜索的 "网址" (URL) 时, 浏览器就给搜狗的服务器发送了⼀个 HTTP 请求, 搜狗的服务器返回了⼀个 HTTP 响应。
这个响应结果被浏览器解析之后, 就展示成我们看到的⻚⾯内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应⾥就包含了⻚⾯ HTML, CSS, JavaScript, 图片, 字体等信息)。
二、HTTP 协议的工作过程
当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.事实上 , 当我们访问一个网站的时候 , 可能涉及不止一次的 HTTP 请求 / 响应 的交互过程 .
可以通过 chrome 的开发者工具观察到这个详细的过程 .
通过 F12 打开 chrome 的开发者工具 , 切换到 Network 标签页 . 然后刷新页面即可看到如下图效果. 每一条记录都是一次 HTTP 请求 / 响应
三、HTTP 协议格式
请求和响应的格式第一行不一样,后边的都一样。都分四个部分:
- 行信息(请求=>请求行,响应=>响应行/状态行)
- 头信息(请求=>请求头,响应=>相应头)
- 空行
- body(正文)(请求=>请求正文,响应=>响应正文)
1、常用的抓包工具
这里列举了常用的抓包工具
比如常用的抓包工具,charles,fiddler。
以 Fiddler 为例. (下载地址: https://www.telerik.com/fiddler/ )
左侧窗⼝显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
右侧上⽅显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
右侧下⽅显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
请求和响应的详细数据, 可以通过右下角的
View in Notepad 通过记事本打开.
2、抓包工具原理
Fiddler 相当于⼀个 "代理".
浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器.
当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器,因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的。
因为 HTTP 协议并没有规定报头部分的键值对有多少个 . 空行就相当于是 " 报头的结束标记 ", 或者是 " 报头和正文之间的分隔符 ".
HTTP 在传输层依赖 TCP 协议 , TCP 是面向字节流的 . 如果没有这个空行 , 就会出现 " 粘包问题 ".
3.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的长度;