目录
1、HTTP是什么
全称:超文本传输协议——应用层协议
HTTP往往是基于传输层TCP协议实现的(HTTP1.0、HTTP1.1、HTTP2.0基于TCP,HTTP3.0基于UDP实现)
我们大家常见的,在浏览器的地址栏里输入一个“网址”,回车后就可以看到网页,这个过程中就是通过HTTP和服务器进行了通信
HTTP协议属于典型的“一问一答”模型的协议
那如何才能看到HTTP的报文格式或信息,这就需要对HTTP进行抓包,下面介绍一下如何进行HTTP的抓包。
抓包工具Fidder的下载及使用
Fidder是一款专门抓HTTP/HTTPS包的软件,它的原理就是充当一个代理,比如当访问一个网站时,会先将请求发送给Fidder,然后Fidder再把请求发送给目标网页的服务器,同理服务器返回的响应也一样,先需要经过Fidder,再发送给客户端。
这样,Fidder就能够捕获到HTTP的请求与响应,由于Fidder充当的是一个“代理”的角色,所以使用Fiddder时不能够有其他使用或修改代理的软件运行,否则Fidder就不能够捕获到HTTP/HTTPS的包。
下载
官网网址: https://www.telerik.com/fiddler
打开网页:
往下翻:
后续填写信息,下载一路next即可
简单使用
首先,找到Tools选项,选择Options,找到HTTPS
如图
会有一个窗口跳出来,一定要点yes,不然就要重装Fidder了,这样Fidder就可以使用了。
Fidder左侧是捕获到的HTTP(s)包,双击某个包后,会在右侧显示详细信息。
显示详细信息后,使用Raw模式可以看到http的本体。
点击View in Notepad可以使用记事本打开,查看详情。
对于右侧的上下两栏,上面是请求,下面是对应的响应。
我们发现响应里面的内容有一串乱码,这可能是压缩或者加密了,可以点击下面黄色的按钮来显示服务器的响应结果。
基本的简单使用就这了
2、HTTP协议工作过程
上图理解:
注:HTTPS只是在HTTP基础上做了一个加密解密的工作
3、HTTP协议格式
结合抓包来分析理解:
HTTP请求:
- 首行:方法 + url + 版本
- Header:请求的属性,冒号分割的键值对,遇到空行则结束
- Body:空行后的内容(如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度
HTTP响应:
- 首行:版本号 + 状态码 + 状态码解释
- Header:请求属性,冒号分割键值对,遇到空行则结束
- Body:空行后面都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度,如果服务器返回一个html页面,那么html页面就是在body中
协议格式总结:
4、HTTP请求
4.1、URL / URI
URI即网络资源标识符,URL即网络资源定位符,前者是使用唯一字符串来标识互联网中某一资源,后者使用字符串来表示某个资源的位置,URL可以理解为URI的一种实现,就像接口与实现类的关系一样。
4.1.1、URL(I)基本格式
协议方案名:必选项,使用 http 或https等协议方案名获取访问资源时要指定协议类型。不区分字母大小写,最后附一个冒号:,使用//与后面的字段分隔。
也可使用 jdbc:mysql:// 或 javascript: //这类jdbc程序或脚本程序的方案名。
登录信息:可选项,这是上古时期上网的时候,在这里会体现出账号与密码,现在基本上没有了,使用@符号与后面的字段分隔。
服务器地址:必选项,可以使用域名和IP地址来表示,使用:与端口号分隔,没有端口号:省略。
端口号:可选项,表示访问主机上哪一个应用程序,该字段为空,浏览器会分配默认的端口号,http是80,https是443。
文件路径:必选项,描述访问服务器的资源是什么,最简单的路径就是一个/,你访问很多网站的首页的时候,最后都会有一个/,使用?与查询字符串分隔。
查询字符串:可选项,表示浏览器或者客户端传给服务器自定义的信息,对获取的资源提出进一步的要求,一般是程序员自定义,所以如果不是你自己写的,大概率看不懂,使用#与片段标识符分隔。
片段标识符:可选项,表示访问页面的子位置,能够控制浏览器滚动到某一位置。
HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。
4.1.2、URL encode
如果查询字符串(query string)的内容包含一些具有特定含义的字符需要进行转义,如/,?,&等,如果含有这些字符,会将这些字符替换为%字符的ASCII码,这个过程就是encode,反过来将这些转义的字符串解析为原来的字符,这个过程就是decode。
比如,你在浏览器上搜索C++,在URL上就会得到C%2B%2B这样的字符串。
4.2、认识“方法”
各方法功能:
其中最最常用的方法就是GET和POST方法
4.2.1、GET方法
GET:获取资源
在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求(HTML中的link,img,script等标签可以出发GET请求,以及JavaScript中的ajax也能构造GET请求)
GET 方法用来请求访问已被 URL 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像 CGI(CommonGateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。
咱们来抓包看看:
GET请求的特点:
- 首行的第一部分为GET
- URL的query string 可以为空,也可以不为空
- header 部分有若干个键值对结构
- body 部分为空
4.2.2、POST方法
POST:传输实体主体
虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST方法。虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。
抓包瞅瞅:
POST 请求的特点:
- 首行的第一部分为POST
- URL的query string 一般为空(也可以不为空)
- header 部分有若干个键值对结构
- body 部分一般不为空,body内的数据格式通过header中的Content-Type指定,body 的长度由header 中的 Content-Length指定
4.2.3、GET和POST的区别
- 语言不同:GET一般用于获取数据,POST一般用于提交数据
- GET的body一般为空,需要传递的数据通过query string 传递
- POST的query string 一般为空,需要传递的数据通过body传递
- GET请求一般是幂等的,POST请求一般不是幂等的(多次请求得到的结果一样的,就视为幂等)
- GET可以被缓存,POST不能被缓存
- GET和POST谁更安全?是否安全取决于前端在传输密码等敏感信息时是否进行加密,与GET和POST无关
- 标准中没有规定GET的URL长度,也没有规定POST的body的长度,传输数据量多少,完全取决于不同浏览器和不同的服务器之间的实现的区别
- “GET只能传输文本数据,POST可以传输二进制数据”,说法有问题的,GET的query string 虽然无法直接传输二进制数据,但是可以针对二进制数据进行url encode
4.2.4、其他方法
PUT:传输文件
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文
件内容,然后保存到请求 URI 指定的位置。
该方法在HTTP/1.1无验证机制,不安全,配合验证机制可以开放使用该方法。
HEAD:获得报文首部
与GET的区别就是HEAD只返回报文的首部。
DELETE:删除文件
DELETE 方法按请求 URI 删除指定的资源,不安全,需配合验证机制使用。
OPTIONS:询问支持的方法
询问服务器支持哪些方法。
TRACE:追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法,不常用。
CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。
4.3、认识请求“报头”[header]
header的整体的格式也是“键值对”结构
每个键值对占一行,键和值之间使用分号分割
HOST
表示服务器主机的地址和端口
Content-Length
表示body中的数据的长度
Content-Type
表示请求中的body中的数据格式
User-Agent(UA)
表示浏览器、操作系统的属性,形如
其中:
Referer
表示这个页面是从哪个页面跳转过来的
如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的.
Cookie
Cookie中存储了一个字符串,这个数据可能是客户端自行通过JS写入的,也可能是来自于服务器
因为HTTP是一种无状态的协议,它无法对之前的发生过的请求和响应状态进行记忆,如果遇到需要登录的页面,登录之后,再刷新,是需要重新进行登录的,这个就非常的难受,为了解决这个问题,引入了Cookie机制。
好处:可以减少服务器的 CPU 及内存资源的消耗。
Cookie是浏览器为页面提供的一种持久化储存数据的机制,即就是将数据存储磁盘上,不会因为浏览器或者电脑重启而导致数据丢失。
Cookie会按照域名来进行分类并组织,针对每一个域名,都会分配一个“小房间”(一块独立的储存空间),这些小房间之间是相互独立的,在每个“小房间”里面会按照键值对的方式储存数据(值),每个键值对之间使用&来进行分隔。
那Cookie的数据从哪里来?其实是从服务器返回给客户端的,服务器完成客户端的身份认证之后会通过的头部字段Set-Cookie来给客户端响应信息。
就像下面服务器返回的Cookie一样:
Cookie的作用其实就像医院里面的就诊卡一样,就诊卡里面有就诊人的基本信息,刷卡之后会根据这些基本信息可以查出在当前医院里面的历史就诊记录等更加详细的信息,这张就诊卡就相当于Cookie,而根据就诊卡信息获得的详细记录叫做session,每个session里面记录了就诊用户的许多关键信息,例如历史就诊记录,要做的检测等等,每一个session都有对应的sessionId,即会话标识,服务器返回给客户端的Cookie响应就有这个会话标识,然后访问后续页面的,根据这个会话标识就能从服务器找到对应的信息进行登录,这样刷新页面就不用在重复登录了。
下图所圈的部分就有可能就是一种sessionId。
5、HTTP响应详解
5.1、认识“状态码”
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
分类:
部分常见状态码:
ps:此图来源于网络
5.2、认识响应“报头“
Content-Type
响应中Content-Type常见取值有以下几种:
- text/html:body数据格式是HTML
- text/css:body数据格式是css
- application/javascript:body数据格式是JavaScript
- application/json:body数据格式是JSON
本期结束啦!!!下期见,哈哈哈,很久没更了