目录:1.HTTP协议的作用
2.Fiddler 抓包工具
3.协议报文格式
HTTP协议的应用:HTTP属于应用层最广泛使用的协议之一,HTTP是浏览器和服务器之间的交互纽带
![](https://i-blog.csdnimg.cn/blog_migrate/533287f53ffdfe8ee7e0af640c08bde6.png)
当我们在浏览器中输入一个百度搜索的“网址”时,浏览器就给百度的服务器发送了一一个HTTP请求,百度的服务器就返回了一个HTTP响应,这个响应结果被浏览器解析之后,就展示成我们看到的页面内容,(这个过程浏览器会给服务器发送多个请求,服务器会对应返回多个响应,这些响应里面包含了页面的html,css,javascipt,图片,文字等等).
对于浏览器和服务器之间的交互过程,我们借用Fiddler这个抓包工具可以更好的去观察
Fiddler抓包工具
Fidder为啥能够了解浏览器和服务器之间的交互过程呢?我们不妨来看一张图。
Fidder相当于一个“代理”
![](https://i-blog.csdnimg.cn/blog_migrate/e67be97d93378003819400464c9dcedb.png)
当我们再浏览器里输入baidu.com时,就会把HTTP请求发送给Fidder,然后Fidder接着会把这个请求在转发给百度的服务器,然后百度服务器响应,返回数据给Fiddler,然后Fiddler再把数据给浏览器。
给大家举个例子:我想要吃饭,但我不想下去,于是我把我的钱给我的舍友让他帮我带饭,然后我的舍友把钱给了食堂窗口的老板,然后老板把饭给了我的社友,然后我的舍友把饭给了我,所以我这个舍友对“我”和“食堂老板”之间的交互细节非常清楚。
抓包结果:
HTTP请求:
![](https://i-blog.csdnimg.cn/blog_migrate/a95fbef8602dfb96ed3f2c5ba738a642.png)
HTTP响应:
![](https://i-blog.csdnimg.cn/blog_migrate/e7eaf02535a3bbd5a574551d142d31b6.png)
协议报文格式:
![](https://i-blog.csdnimg.cn/blog_migrate/6dc0414b502c109ffd79c0134812764d.png)
首行:包含三个部分,之间使用空格来区分,GET:HTTP的方法
URL(俗称网址)https://www.baidu.com/?tn=44004473_52_oem_dg
HTTP/1.1版本号
认识URL:
![](https://i-blog.csdnimg.cn/blog_migrate/2e728af4942a06b0ad98f84e951cf8f5.png)
URL最关键的四个部分:
域名:ip
端口号
带层次的路径
查询字符串
举个简单的例子:
比如我要卖肉夹馍:在齐工大餐厅:16号窗口/纯瘦肉的肉加膜,辣度:微辣带香菜
IP地址 端口号 带层次的路径 查询字符串(以键值对方式组织)
一个url里的几个部分,有些是可以省略的
例如:https://www/sogou.com/ 省略了端口,浏览器会提供默认端口,对于http来说,默认端口80;对于https来说,默认端口是443,/也是路径,代表“根目录”,这里的根目录是http服务器的根目录,HTTP服务器是系统上的一个进程,委托于服务器管理系统上的一个特定的目录,这个目录里面的资源可以让外面进行访问,一个HTTP服务器提供的资源是很多的,不同的路径,拿到的是不同的资源。
下面我们来看一下方法:
![](https://i-blog.csdnimg.cn/blog_migrate/55935a0700a4ce40cea082a5670b6a1e.png)
在这里面我们最常用的两个方法一个是GET,另一个是POST,
GET请求:
在浏览器地址栏里直接输入url
html里的link,script,img.....
通过js来构造GET
![](https://i-blog.csdnimg.cn/blog_migrate/79d73b592b1e30e13f11eeaa74c73ac3.png)
POST 典型的是登录,登录跳转的时候会涉及到POST,另一个就是上传文件
GET和POST之间的典型区别:
GET可以给服务器传递一些信息,GET传递的信息一般都是放在query string,POST传递信息则是通过body
语义上的区别:GET请求一般是用于从服务器获取数据
POST请求:一般是用于给服务器提供数据
GET通常会被设计成幂等, POST不要求幂等,幂等的意思是指相同的输入,得到的结果是相同的。
GET是可以被缓存的,因为GET通常会被设计成幂等,POST则一般不能被缓存,缓存的好处是把请求的结果保存下来,下次请求就不必真请求,直接取缓存结果)
![](https://i-blog.csdnimg.cn/blog_migrate/7b0adee9c43569a74f9080b5f6f120a3.png)
Host
Host:www.baidu.com
大概描述了服务器所在的地址和端口 Host这里的地址和端口,用来描述最终要访问目标,这个内容大概率和URL是一样的,也有一定的情况下是不同的。
Content-Length 表示body中的数据长度
Content-Type 表示body中的数据格式
GET请求,没body,请求中就没有这两个字段
POST请求:有body,则必须有这两字段
User-Agent
![](https://i-blog.csdnimg.cn/blog_migrate/79bc57477214990968a47246a64968a2.png)
User-Agent以前主要用于描述浏览器和操作系统的版本
User-Agent主要用来区分PC和移动
通过user agent进行大的区分,细节上还可以进行区分,“响应式页面”
Referer 描述当前页面的“来源“.
cookie
![](https://i-blog.csdnimg.cn/blog_migrate/69f1ad3d4043b2b6abbbf6b53a9c8779.png)
本质上是浏览器给网页提供的本地存储数据的机制,网页默认是不允许访问你的计算机硬盘的(保证安全)浏览器对于访问硬盘做出了明确的限制,规定只可以访问cookie,cooike通过键值对的方式来组织数据。
Cookie 中的数据来自于服务器,服务器会通过HTTP响应报头部分,服务器来决定,浏览器的Cookie要存什么
Cookie存在于浏览器中,存在于硬盘的,Cookie在存的时候,是按照浏览器+域名维度来进行细分的,不同的浏览器各自存各自的cookie,同一个浏览器不同的域名,对应不同的cookie,Cookie最终要回到服务器里,客户端同一时刻会有很多,客户端会同过cookie来保存当前用户使用的中间状态,当客户端访问浏览器的时候,就会自动的把Cooike的内容带入到请求中,服务期就能知道现在的客户端的状态。
Cookie并不是会永久保存的,会有一个过期时间,比如我们在公共电脑上登录自己账号,此时登录状态就保存到cooike中,下个人使用的时候,很可能cookie就过期了,就要求重新登录,越敏感的网站,过期时间就越短。
![](https://i-blog.csdnimg.cn/blog_migrate/d8093b3e9f6fd23aa7f78a5c993eaaf4.png)
Cookie中的数据具体存啥,又程序员决定,这里面的内容是程序员自定义的。
HTTP状态码:描述了这次响应的结果.
![](https://i-blog.csdnimg.cn/blog_migrate/df607b17eda4a39674e295fc33e36784.png)
200 表示成功
404 NOT Found 访问的资源不存在,在服务器上没找到
403 Forbidden 访问被拒绝
302 重定向(类似于呼叫转移)
这里给大家举个例子来理解一下它的用途,比如我们学校的教务系统原来域名v.qiluvip,后来又换了个域名,那那些已经毕了业的同学怎么办?我们就可以重新配置个定向,如果老学员访问旧域名,就自动跳转到新域名,302 这样的响应报文中,会在header里带有个Location属性,通过这个属性来描述要跳转到那个新的地址。
我们再来看一下重定向和请求转发之间的区别
重定向:
![](https://i-blog.csdnimg.cn/blog_migrate/d47220a2cafbffe3e1751b123c14dc5d.png)
请求转发:
![](https://i-blog.csdnimg.cn/blog_migrate/8fe09d43e22c1678d6bbcc5480874450.png)
这里给大家举个例子:比如有同学来问我个数学题,但我是个语文老师,重定向就是:我说同学这个题我不问,你去问数学老师吧,请求转发是:我接着去问这个数学老师,然后我在告诉这位同学。
重定向,可以重定向到外部资源(跳转到别的网站)
请求转发只能在服务器内部的资源之间转发,少了一次交互更加高效
500 服务器内部错误(服务器代码抛异常了)
504 gateway,timeout(响应时间久了,浏览器等不及)
状态码的分类:1** 接收的请求正在处理中
2**成功
3** 重定向
4**客户端错误
5**服务器错误
HTTP协议里,能够被程序员自定义的地方,1.URL中的路径 2.URL中的querry string 3.header中的键值对 4.header中的cookie的键值对 5.body
HTTP协议的报文格式:
![](https://i-blog.csdnimg.cn/blog_migrate/ba19a7394cc7e9db377cd03467a3b313.png)