目录
抓包工具 Fiddler
需要的抓包工具 Fiddler
Fiddler 本质上是一个代理程序,Fiddler开启后 客户端与服务端直接的传输都要经过Fiddler。
客户端向服务端发送传输请求时,会先将请求发送给Fiddler 然后再由Fiddler将请求发送给服务端
同理,服务端向客户端发送请求时也会先经过Fiddler
左边就是电脑 接收发送的http请求,一般蓝色的就说明传输的是一个html
页面, 绿色的是js
, 黑色的是数据
,
双击某个请求 就会出现右边的详情页 上面是客户端发送的请求,下面是服务端回复的请求
选择Raw 进行查看http的本体(最原始的效果)
点击View in Notepad 可以生成记事本方便复制粘贴
有时候服务端为了节省网络带宽,会将响应数据压缩成二进制数据,此时点击中间的黄色条框就能进行解码
HTTP 协议格式
HTTP请求本质上就是给tcp scket
里写了一个符合http格式的字符串, 下面就来介绍一下http协议的报文格式, 基本格式如下:
1.http请求格式
http请求的报文格式由请求行, 请求报头(header), 请求正文(body)这三部分组成, 报头与正文之间使用空行做标记进行分隔.
比如用Fidder抓到的访问搜狗页面的请求包, 如下:
1.1 请求行
首行由三部分组成
· HTTP协议有很多种方法,GET 方法就是表示从服务器获取某些数据
最常见的还有 POST 方法表示传输实体
· URL表示唯一资源定位符, 俗称网址, 用来标识互联网上唯一资源的位置.
· 最后的表明当前http的版本号
常见的http方法 :
GET 与 POST 方法有什么区别? 经典面试题 !!!
两者没有本质的区别,使用GET的场景替换成POST也可以用。使用POST的场景替换成GET也行
但两者在使用习惯上存在区别:
1.GET习惯上用来表示 获取一个数据,POST习惯用来表示 提交一个数据
2.GET一般没有body,需要携带数据则放到URL中, POST一般有body
3.GET请求通常会设计成 幂等 的,POST则无要求
什么是 幂等性 ?
如果输入一定,得到的输出也一定,这种情况就认为是幂等的
如牛吃草,挤出来的一直是奶 这个过程就是幂等的
4.GET 可缓存 (前提是 具有 幂等性 ) POST不能缓存
5.GET 请求可以被浏览器收藏 POST则不能
认识URL
URL 唯一资源定位符,描述了网络上的唯一的一个资源
URL的结构大概是以下几个部分:
举一个开熏肉大饼的店的例子就是:
URL最关键的四个部分是域名/IP, 端口号, 带层次的路径, 查询字符串, URL里的的有些内容不可省略(必选项), 有些内容可以省略, 具体如下:
协议方案名: 必选项, 使用http或https等协议方案名获取访问资源时要指定协议类型, 不区分字母大小写, 最后附一个冒号:, 使用//与后面的字段分隔, 也可使用 jdbc:mysql:// 或 javascript: // 这类指定数据程序或脚本程序的方案名.
登录信息: 可选项, 现在基本已经不用了.
服务器地址: 必选项, 可以使用DNS可解析的域名或直接使用IP地址来表示, 使用:与端口号分隔, 没有端口号则:省略.
服务器端口号: 可选项, 描述了要访问主机上的哪一个应用程序, 若该字段为空, 浏览器会提供默认的端口号, http是80, https是443.
带层次的文件路径: 必选项, 描述访问的服务器上指定位置的资源, 不同的路径, 拿到的资源是不同的, 最简单的路径就是一个/, 代表的是http服务器的根目录, 可以理解为http服务器是系统上的一个进程, 就让这个进程管理系统上的一个特定的目录, 这个目录里面的资源都可以让外面进行访问, /管理的根目录可以是系统上的任意一个目, 由http服务器具体配置.
查询字符串: 可选项, 是获取资源的时候带的参数, 是以键值对的方式组织(query string), 以?开头, 键值对之间使用&分割, 键和值之间使用=分割; 表示浏览器或者客户端传给服务器自定义的信息, 对获取的资源提出进一步的要求, 一般是程序员自定义, 所以这部分除非是自己写的, 要不然大概率是看不懂的, 使用#与片段标识符分隔.
片段标识符: 可选项, 使用片段标识符通常可标记出已获取资源中的子资源(文档内的 某个位置), 但在RFC中并没有明确规定其使用方法.
1.2 请求报头
最下面的空行 就相当于请求报头的结束标志
接下来,来学习下 请求报头中各种键值对 的含义分别是什么
1.
Host 用来描述最终要访问的服务器是谁
在请求行我们已经学习到了URL的作用就是写明当前要访问的服务器是谁,这里为什么还要 再写一遍呢?
在大多数情况下,Host的值 和 URL 的值 是一致的,但有的时候计算机不会直接访问服务 器,而是通过代理的方式间接访问服务器,此时 URL 里的值 就是指向代理,而 Host 里的值 才是最 终要访问的服务器
2.
Conten-type 描述了body的数据格式
Conten-length 描述了body的长度(字节)
这两个属性是跟着body出现的,如果没有body 就不会出现这两个属性
json格式:
在进行前后端交互的时候(浏览器和http服务器),json是最常用的一种数据格式
3.
User-Agent 描述了发出请求的客户端是什么样子的
在互联网发展的早期,存在着各式各样的浏览器,此时服务器就可以根据UA判断出用户客户端的种类 然后返回不同的页面。
随着时间的推移,浏览器度过了快速发展的阶段,现在各个浏览器的区别已经越来越小了,此时UA 的作用 就大大缩小了。不过现在还有一个重要的用途,那就是区分用户客户端 是 PC/手机/平板 然后返回不同的页面。
但对于这一点,现在其实也有更好的方案,CSS3中提供了 “媒体查询” 的功能,可以自动根据浏览器窗口的大小来设置不同的样式,这种页面开发方式也叫 “响应式布局”。
4.Referer 描述了当前页面的来源
在浏览器的搜索中,如果直接按网址搜索网站,此时抓包出来的请求中是没有Referer的。如果是输入关键字搜索,此时就会有Referer,告诉你,这个搜索结果的页面是来自于哪里的。
像浏览器中的广告都是都是按点击计费的, 广告主就需要知道用户是通过哪个搜索平台跳转到广告主对应的网站, 支付给对应搜索平台费用
但HTTP
本身是明文传输的, 很容易有网络运营商劫持的现象出现, 于是就有了HTTPS
来解决这个问题.
5.
Cookie 是浏览器在 本地存储 用户自定义数据 的一种关键机制 !
所以为了保证用户的上网安全,浏览器禁止网页可直接访问硬盘,浏览器提供了Cookie机制,允许网页往浏览器存储一些自定义的键值,这些数据通过浏览器提供的api 写到特定的文件中
每个网站都有各自的Cookie
Cookie中存储的是一个字符串, 这个字符串中有若干的键值对, 键和值之间使用=分隔, 而键值对之间使用;分隔, 还有一些其他的内容.
红框的这一部分内容是有程序员自己定义的,没有什么规范,所以我们是看不懂的,只有负责开发这一部分内容的程序员才看得懂
Cookie从哪里来
从服务器来,当浏览器访问服务器的时候,服务器会在HTTP响应中,通过set-Cookie 字段,把Cookie的键值对返回给浏览器,浏览器收到这个数据后,就会在本地存储。
Cookie到哪里去
会在下次请求的时候,把Cookie带给服务器,Cookie在浏览器这边只是暂存,真正要让这个数据发挥作用还是要交由服务器来使用
Cookie有什么作用
服务器需要面对很多个客户端,为每个客户端提供的服务也是不一样的
例如在教务系统中,服务器为学生客户端 与 老师客户端 提供的服务是不一样的
因此,服务器就可以通过cookie来区分
比如在客户端登录的时候,服务器识别好了这个客户端的角色,把角色信息返回给浏览器,在cookie中保存,后续客户端再次访问时,带着这个cookie就行了,此时服务器就直接知道这个客户端是什么身份了,不用再去搜索识别。
2.http的响应格式
响应格式与请求格式差不多 也是由首行 响应报头 空行 正文 组成
此处 是服务器响应 我们打开搜狗搜索器的请求
可以发现正文其实就是一个html的代码
实际上,不仅仅是html,还有css,js,图片,链接等等浏览器上的所有内容都是由服务器发送过来的
2.1 响应行
http响应行由三部分组成:
版本号
状态码 数字,用数字来表示这次请求执行成功还是失败以及失败的原因
状态码描述 通过一个或一组单词,描述这个状态码的含义
状态码
http面试必问状态码 !!!
常见的状态码:
200 OK 表示请求成功
301 Moved Permanently 永久重定向 重定向:访问旧的地址,被自动引导到新的地址上
302 Move temporarily 临时重定向
404 NOT Found 表示要访问的资源不存在
403 Forbidden 访问被拒绝(没有权限)
500 Internal Server Error 服务内部错误(一般是自己开发时,服务器出现bug,才会500)
504 Gateway Timeout 服务器访问超时