HTTP协议是什么
- HTTP协议在TCP/IP五层(四层)网络协议模型中的应用层中出现,它是一个使用非常广泛的应用层协议
- HTTP协议的可定制性非常强。在应用层协议中,经常是需要自定义协议的,这就得HTTP协议在应用层使用非常广泛
- HTTP协议存在于任何网络之中。只要你在上网,你就会用到HTTP协议
- HTTP是"一问一答"形式的协议,即一个请求一个响应。你请求什么它就响应什么
HTTP协议基本格式查看方法
要想查看HTTP协议的基本格式,我们要借助抓包工具(Fiddler等等),在此我用的是Fiddler,下文会介绍一些基本的用法。
Fiddler官方下载地址
安装OK如下图所示:
打开如图所示:
左侧显示的是对当前主机网络的抓包情况,它会随时刷新滚动的,因为电脑中有很多程序都会发送请求
注意: 首次使用需要勾选https。如下图点击Tools,点击options
进入options,点击HTTPS,并将所有选项勾选。在设置过程中它会弹出一个类似于安装证书的对话框,一定要点击yes,否则就要卸载重装
对于无法抓包问题:
- 没有勾选https,这样就会导致抓出来的东西很少
- Fiddler本质是一个代理,它可能会与电脑上的其它代理冲突,例如插件,梯子,加速器等出现冲突,无法进行抓包
那么这么多抓包情况,哪个才是自己想要看的包呢?
例如打开搜狗搜索,想查看此抓包情况。
最快的确认方法就是看颜色,黑色的响应为普通数据,蓝色的响应为html数据,而搜狗的响应就是蓝色的。再根据Host进行进一步确认。
找到后点击,右边我们只需要点击ROW,这样就可以看出请求和响应了,上面为请求下面为响应。
HTTP协议的请求与响应
请求
如图所示,当你点击之后就会将请求以文本文档的形式表示出来,更清楚的看到请求的内容。
上图就是一个完整的HTTP请求。
请求包括四部分:
- 首行(方法 URL 版本号)
- 请求头header
- 空行
- 正文(body),空行后面的内容,可有可无
请求首行
其中GET是HTTP中的方法,描述了这个请求想干啥,GET是从服务器这里取一些东西。还有别的方法:
POST:向服务器提交一些东西
其中GET请求一般都没有正文即body,而POST请求一般都会有正文,将正文提交给服务器。例如登录,上传的时候。
URL:唯一资源定位符。用来描述网络上唯一的一个资源。例如:
其中
表示协议方案(协议名),HTTP和HTTPS是非常相似的,HTTPS只是在HTTP的基础上进行了加密操作(具体如何实现的,见后文)
域名,表示服务器的地址(IP:端口号)。其后面还有端口号,一般就省略掉了,但是存在而不是没有,浏览器会在后面加上默认端口号,对于HTTP协议来说,默认端口号为80,对于HTTPS来说,默认端口号为443
带层次的结构路径,标识要访问的这个服务器资源是什么。
query string(查询字符串),是一些参数,键值对结构,用&分割键值对,用=分割键和值,这些参数是对请求资源进行进一步补充。例如:
http://小吃/臭豆腐?辣椒=多辣&香菜=要&酱汁=多汁
表示HTTP版本号
请求头header
键值对结构:每个键值对占一行,每个键和值用冒号空格来分开,键值对可以很多对,即好多行,结束时用空行作为结束标记
- Host:描述该请求要访问哪个服务器,地址,端口号都可以写。注意:在URL中已经有了这个请求要访问的服务器地址/端口号,而此处再写的目的是当我们用代理(不是Fiddler)来访问这个服务器时,这里的URL就和Host不一致了。可以理解成URL代表当前目标,而Host代表最终目标(他们俩一般情况下是一致的)。
- User-Agent(UA):描述了用户使用的客户端是什么样子的,即操作系统版本,浏览器版本
- Referer:描述了当前页面是从哪个页面跳转过来的。当你直接用URL搜索是不会有Referer这个属性的。
- Conten-Type:描述body的数据格式。请求没有body就没有这个属性
- Content-Length:描述body的长度(字节)。请求没有body就没有这个属性
application/json:数据的格式(json格式) charset:数据字符集- Cookie:本质是浏览器在本地存储用户自定义数据的一种关键机制。键值对结构,键值对之间用分号隔开,键和值之间用等号隔开。其中的内容都是由程序员自定义的
响应
请求下面为响应,如上图,它是被压缩过的,只需要点击上面那行黄色背景即可变为字符串。
上图为一个完整HTTP响应。
响应包括四部分:
- 首行(版本号 状态码 状态码描述)
- 响应头header
- 空行
- 正文(body)
响应的首行和响应头header
- 版本号:即HTTP版本号,与请求的是一样的
- 状态码:数字表示,表示这次请求是成功还是失败以及失败的原因。
- 状态码描述: 通过一个或一组单词来描述这个状态码
- 响应头header里面的属性和请求头header里面的属性对应描述含义一致
对于状态码,状态码有很多,只需要记住常见的即可
- 404 not found :表示要访问的资源不存在
- 403 Forbidden:访问被拒绝,无权限访问
- 500 Internet Server Error:服务器内部错误
- 504 Gateway Timeout:服务器访问超时
- 302 Move Temporarily:临时重定向(这次是,下次不一定)
- 301 Moved Temporarily:永久重定向
- 200 OK: 表示请求成功
对于重定向:例如:要访问的服务器域名改变了,你这次访问这个服务器的旧域名它就会把你自动带到新的域名。
状态码可以分成以下几大类: