HTTP(Hyper Text Transfer Protocol
),全称超文本传输协议,是一种应用非常广泛的应用层协议。HTTP是一套在网络上传输文件(如文本、图像、视频、声音和其他多媒体文件)的规则。
通常,当我们在浏览器输入一个“网址”,此时浏览器就会给对应的服务器发送一个HTTP请求,对方服务器收到这个请求之后,经过计算处理,就会返回一个HTTP响应。
HTTP是一个文本格式的协议,可以通过Chrome开发者工具或者Fiddler进行抓包,来分析HTTP协议的格式。
抓包工具Fiddler相当于一个“代理”,当浏览器访问发送一个请求时,会将请求先发给Fiddler,Fiddler再把请求转发给服务器,当服务器端返回数据时,Fiddler拿到返回数据,再把数据交给浏览器。
举个栗子来理解Fiddler的代理功能:我们现在经常会使用uu跑腿帮你买东西,当我们要买一个东西时,把钱发给uu跑腿的小哥,然后小哥在来到超市把钱给老板,买到东西之后,再把这个东西交到你手上,因此这个跑腿小哥对“我”和“超市老板”之间的交易非常清楚。
这就时Fiddler的工作原理。
Fiddler(下载:https://www.telerik.com/fiddle):
以上就是Fiddler的抓包功能的一些使用,运用上面的方法,完全可以实现抓包。
下面用一个具体的HTTP请求和响应的抓包结果,我们用这个抓包结果来分析HTTP请求和HTTP响应的详细数据格式:
注意:
HTTP中的报文中空行的作用:由于HTTP协议并没有规定报头部分的键值对的个数,因此空行的作用就是为了分隔报头和正文的内容。
HTTP交互主要分为:
下面我们来详细的分析一下HTTP请求和HTTP响应中的内容。
URL
的全称是(Uniform Resource Identifier),中文名是统一资源定位符,也就是我们俗称的“网址”。
由于服务器的ip地址很难记,是一串数字,因此将ip地址转换为便于人类记忆的协议就是DNS协议
(域名系统),它作为将域名和ip地址相互映射的一个分布式数据库,当人们使用URL地址进行请求时会对DNS系统进行解析得到具体的ip地址。(我们通过ping命令
可以看到真实的IP地址)
一个具体的URL地址:
https://edge.microsoft.com/extensionrevocation/v1/threatListUpdates:fetch?&key=d414dd4f9db345fa8003e32adc81b362
https
:协议方案名。常见的有http和https。edge.microsoft.com
:服务器地址,此处是一个域名,会通过解析DNS系统解析成一个具体的ip地址。端口号
ip地址+端口号可定位到计算机上的某个程序。当端口号省略时,浏览器会根据协议类型自动决定使用哪个端口。http协议默认使用80端口,https协议默认使用443端口。key=d414dd4f9db345fa8003e32adc81b362
:url中的参数,本质是一个键值对结构,键值对之间使用&分隔,键和值之间使用=分隔。这里的方法是指请求的方法类型。
GET常用于获取服务器上的某个资源。GET中的请求参数会直接加在url后面,只能添加少量参数,请求参数会显示在浏览器的地址栏。
浏览器会发送get请求的情况:
GET请求的特点:
POST常用于提交用户的数据给服务器。请求参数添加在实体内容里,可以添加大量参数(这也就解释了为什么浏览器地址栏不能发送POST请求,因为在地址栏里我们只能填写url,并不能进入到HTTP包的实体当中)。
浏览器会发送post请求的情况:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录系统</title>
</head>
<body>
<form action="login" method="post" >
<div style="margin-top:50px;margin-left:40%">
<h1>用户登录</h1>
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password">
<p>
<input type="submit" value="提 交">
<input type="reset" value="重 置">
</p>
</div>
</form>
</body>
</html>
POST请求的特点:
Content-Type
指定。body的长度由header中的Content-Length
指定。请求报头在发送请求时用来描述更多消息,header整体格式也是键值对结构的,每个键值对占一行,键和值之间用冒号分隔。
下面介绍几个常见的消息:
表示服务器的地址和端口号。
表示body中的数据长度。
表示请求的body中的数据格式。
常见的数据格式有以下几种:
error=login_required&error_description=AADSTS500
{
"username": "12345678",
"password": "12345678"
}
表示浏览器/操作系统的属性,形如
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39
5.3.5 Referer
表示这个页面是从哪个页面跳转过来的,如:Referer: https://www.sojson.com/
如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer的。
Cookie顾名思义就是“甜饼”,由于HTTP是一种无状态的协议,服务器单从网络连接上无法直到用户的身份,那该怎么办呢?因此人们想出了一个办法,就是给客户端颁发一个通行证,在向服务器端发送请求时带上自己的通行证,这样服务器就能从通行证上确认客户身份了。这就是cookie的工作原理了。
上文在讲Content-Type
时已经提到请求正文的数据格式由Content-Type
决定,上面列出了三种形式。
分别是: application/x-www-form-urlencoded
、application/json
、multipart/form-data
。具体我们可以通过抓包看到详细信息,这里就不再展示。
常见的状态码:
2. 404 NOT FOUND:没有找到资源
当输入的url所标识的资源不存在,就会出现404。
3. 403 Forbidden: 表示访问被拒绝
有的页面通常需要用户具有一定的权限才能访问,如果没有权限进行访问就会见到403.
4. 500 Internal Server Error
服务器内部出现错误,一般是服务器的代码在执行过程中遇到了一些错误。
5. 504 Gateway Timeout
当服务器负载比较大,流量剧增时,服务器单条请求的时候消耗时间就会很长,就会出现超时的情况。
6. 302 Move temporarily
临时重定向,重定向就相当于呼叫转移,拨打这个号码会在用户不知情的情况下自动跳转到另一个号码。
重定向常见于登录页面,用于登录成功后自动跳转到哪个页面。响应报文中会包含一个字段Location
,表示要跳转到哪个页面。
7. 301 Moved Permanently
永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改为新地址。
同302,也是通过Location
来表示重定向的新地址。
响应报头中的Content-Type
和Content-Length
等属性的含义一致。
Content-Type:
text/html
:body数据格式是HTMLtext/css
:body数据格式是CSSapplication/javascript
:body数据格式是JavaScriptapplication/json
:body数据格式是JSON与请求正文类似,响应正文的数据格式由响应报头中的Content-Type
决定。
以上就是HTTP协议以及HTTP协议的交互的详细介绍啦,如果觉得对你有帮助,那就点个赞吧~~