目录
🎍HTTP协议是什么?
🍀应用层协议(HTTP)存在的意义
🎄HTTP 协议的工作过程
🌴HTTP 协议格式
🌳Fiddler抓包工具的使用
🚩如何抓HTTPS的包?
🎋抓包工具的原理
🌲抓包结果展示
🎍HTTP协议是什么?
HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议
HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议
发展阶段可以分为:以下几个阶段:
- 0.9 这个版本的协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。
- 1.0 到了1.0协议阶段,也就是在1982年,Tim Berners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。
- 1.1 在1.0协议中,双方规定了连接方式和连接类型,这已经极大扩展了HTTP的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。毕竟,作为协议的制定者,当时也没有想到HTTP会有那么快的普及速度。
- 2.0 HTTP2.0的前身是HTTP1.0和HTTP1.1。虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼。网络协议新版本并不会马上取代旧版本。实际上,1.0和1.1在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的。
最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经支持了
HTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP实现)
目前我们主要使用的还是 HTTP1.1 和 HTTP2.0 . 当前文章上讨论的 HTTP 以 1.1 版本为主.
应用场景:
1)网页 = > 服务器之间的交互
我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的.
当我们打开了一个b站,输入了一串网址的时候,此时就是在基于通过HTTP的方式和b站的服务器进行通信。浏览器就给b站的服务器发送了一个 HTTP 请求, b站的服务器返回了一个 HTTP 响应.
这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片,字体等信息)
所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据
2)手机app => 服务器之间的交互
比如打开一个外卖软件,加载一些食品列表数据以及下单操作,这些过程也是通过HTTP来完成的
虽然HTTP的作用很大,应用很广,但是实际开发中,不一定是真的直接使用HTTP,更大的概率是使用HTTPS(本质上是HTTP引入的加密层,s指安全,即叫做"超文本安全传输协议")。
🍀应用层协议(HTTP)存在的意义
我们已经学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程
可是,仅仅把数据从A点传送到B点就完了吗?
这就好比,在淘宝上买了一台电视,卖家[ 客户端 ]把手机通过顺丰[ 传送+路径选择 ] 送到买家 [服务器 ] 手里就完了吗?
当然不是,买家还要使用这款产品,还要在使用之后,给卖家打分评论。
所以,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节!
这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之一的HTTP就是其中的佼佼者.
再回到我们刚刚说的买电视的例子,顺丰相当于 TCP/IP的功能,那么买回来的手机都附带了说明书【产品介绍,使用介绍,注意事项等】,而该说明书指导用户该如何使用手机,此时的说明书可以理解为用户层协议
🎄HTTP 协议的工作过程
当我们在浏览器中输入一个 “网址”,此时浏览器就会给对应的服务器发送一个HTTP 请求。 对方服务器收到这个请求之后,经过计算处理, 就会返回一个 HTTP 响应。也就是典型的"一问一答"模式,请求和响应是一一对应的。
事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程.那么要想进一步的理解HTTP协议工作过程,以及理解HTTP的报文格式,就需要用到"抓包工具"。
抓包工具是指能够把网络上传输的HTTP数据获取到,并且能够显示出来。
HTTP抓包工具,种类有很多,比如浏览器(chrome就内置了抓包工具):
在浏览器页面通过 F12 打开 chrome 的开发者工具, 切换到 Network 标签页. 然后刷新页面即可看到如下图效果. 每一条记录都是一次HTTP 请求/响应
但是chrome自带的这个工具,看起来不够直观。推荐使用Fiddler。
🌴HTTP 协议格式
HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下:
- 请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
请求行以方法字段开始,后面分别是URL字段和HTTP协议版本字段,并以CRLF结尾。SP是分隔符。除了在最后的CRLF序列中CF和LF是必需的之外,其他都可以不要。有关通用信息头,请求头和实体头方面的具体内容可以参照相关文件。
应答报文格式如下:
- 状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作,而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头,响应头和实体头方面的具体内容可以参照相关文件。
HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节
🌳Fiddler抓包工具的使用
- 下载安装
推荐使用必应搜索Fiddler进入官方下载:
这里呢有两个版本,我们只需要下载Fiddler Classic版本就好(该版本免费)
点击Try For Free
下载好后一路next就好
- 抓包
我们打开该软件就可以直接开始抓包了
页面左侧包含你主机上所有进程http请求/响应数据
右侧是对左侧某个数据包双击之后的一个详细信息
我们对搜狗来进行抓包:这些结果都是浏览器打开搜狗网页的时候,给搜狗发送的http/https的请求数据。我们关注的是蓝色的数据,并且body这一列数据比较大的
双击之后,右侧的上方为请求数据的详情
右侧的下方是响应数据的详情
上述请求默认是Headers选项卡,对于这里面的请求数据我们看得并不是很清晰易懂,我们要选择Raw选项卡,Raw这个选项卡下的数据是一次http请求最原始的数据,其他选项卡下的内容,是不同风格对内容的展示。
这样的观察也不清楚,字体太小了,可以通过旁边的View in Notepad使用记事本打开
响应数据中也是选择Raw,也会响应数据的原始数据,其中可能会存在一些乱码的内容,点击黄色框框即可。也可使用记事本打开。
总结:
- 左侧窗口显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
- 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开.
- 可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果.
🚩如何抓HTTPS的包?
点击Tools
点击Options里面的HTTPS选项,然后将里面的选项全部打勾
这里值得注意的是,它会出现一个提示框,提示你是否安装一个证书,这里一定要选择是,如果不小心选择否,重装Fiddler
然后OK就可以开始抓HTTPS的包了。
🎋抓包工具的原理
Fiddler 相当于一个 “代理服务器”.
浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器.
当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.
因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的
代理就可以简单理解为一个跑腿小弟. 你想买3.5元的冰红茶, 又不想自己下楼去超市, 那么就可以把钱给你的跑腿小弟, 跑腿小弟来到超市把钱给超市老板, 再把3.5元的冰红茶拿回来交到你手上. 这个过程中, 这个跑腿小弟对于 “你” 和 “超市老板” 之间的交易细节, 是非常清楚的
代理也有正向代理和反向代理,可以简单的理解为帮助客户端"跑腿"的为正向代理,帮助服务器"跑腿"的为反向代理。
🌲抓包结果展示
搜狗页面抓包结果,HTTP协议是一个文本格式的协议,本质上一个HTTP数据包,就是按照HTTP协议的格式,构造出一串文本,写道tcp socket中。
🚩HTTP请求
一个HTTP请求报文,分成四个部分
- 1)首行,也就是上述记事本中的第一行
首行中又包含3个部分
(a)请求的方法,也就是GET,方法的意思就是描述了这次请求要干啥,GET的意思要从服务器获取某个数据
(b)请求的URL,请求的对方的网址,这里面的具体格式含义后序讲述
https://www.sogou.com/web?query=Fiddler&_asf=www.sogou.com&_ast=&w=01015002&p=40040108&ie=utf8&from=index-nologin&s_from=index&oq=&ri=0&sourceid=sugg&suguuid=&sut=0&sst0=1724663525730&lkt=0%2C0%2C0&sugsuv=1724661927128554&sugtime=1724663525730
(c)版本号 上述的HTTP1.1
使用空格来区分上述三个部分
- 2)请求的报头(header)
从第二行开始到空白行之前,header中可以包含若干行数据,此处本质上是一个"键值对"结构,每一行是一个键值对,键和值之间用 : 分割。比如Host就是key,www.sogou.com是value
- 3)空行
header中最后一个键值对就是在空行之前,上述的header中,Cookie下面就是空行,这里的空行,起到一个结束标记的作用,类似与链表使用null作为结尾,这里也就是header遇到空行就结束
- 4)正文 body
body是空行后面的内容,注意,正文是可选的,有些情况下有,有些情况下没有正文,像上述中就没有正文。
而且这里的body不是html中的body,http的body相当于tcp/ip等协议的载荷一样,这里的内容可以是任意的,也可以是完整html,也可以是完整的css/js,也可以是json数据,也可以是图片,也可以是文件,还可以是字体......(可以方任何你先要传输的数据)。
比如抓取某教务系统的登录:
这里的body就是一个json结构的数据,这个数据就包含了客户端(浏览器)要给服务器传输的一些必要数据。
🚩HTTP响应
- 1)响应的首行
首行也是包含三个部分:
(a)版本号 HTTP/1.1
(b)状态码 200
(c)状态码的描述 OK
所谓的状态码和状态码描述是一起的,反应了这是一个成功的响应还是一个失败的响应,如果失败了具体是啥样的原因,上述看到的200 OK就是成功。失败的原因有很多,所以对于的状态也有很多,最典型的就是404。
比如在搜狗上搜索123.html,这是一个不存在的地址
对应的抓包结果:点进去查看响应,对应的状态码就是404,描述就是Not Found
- 2)响应的报头 Header
首行之后,空行之前的为Header,格式还是键值对,里面具体内容后序解释
- 3)空行
Header的结束标记
- 4)正文
正文中是什么都可以存储,可能也有空行或者没有,都表示内容,并不是结束标记。
🎍HTTP协议格式总结
由抓包可知协议格式如下
HTTP 报文中此处存在的 "空行"是因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 “报头的结束标记”, 或者是 “报头和正文之间的分隔符”.HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 “粘包问题”.
总结:HTTP协议,请求格式和响应格式需要重点掌握,是我们日常开发中加面试的重点