HTTP协议

HTTP协议(超文本传输协议)属于是应用层最广泛使用的协议.

浏览器获取到网页就是基于http,http就是浏览器和服务器之间的交互桥梁.

 1.1是最常见的版本,我们也是以1.1版本来展开介绍.

http往往是基于传输层的tcp协议来实现的.

像我们平时所说的网址就是URL,浏览器会根据这个URL构造出一个HTTP请求,发给服务器,服务器就会返回一个HTTP响应(包含了html,css,js,图片等等),浏览器再把得到的html等数据进行显示(渲染).


抓包

http协议的交互详细过程,可以借助第三方的工具来看到,称为抓包工具.

抓包工具很多,在这里使用的是fiddler.

我们打开fiddler,左侧会立即显示当前电脑上某个程序使用http和服务器交互的过程.

fiddler本质是一个代理程序,使用的时候有两个注意事项:

1.可能和别的代理程序冲突,使用的时候要关闭其他的代理程序.(包括一些浏览器插件)

2.要想正确抓包,还要开启https功能.

https是基于http的进化版协议,当前互联网上绝大部分的服务器都是https的,fiddler默认是不能抓https的包的,需要手动开启https并安装证书.

 

 

点击tools选择options,切换到https界面,都打勾,确认即可.

 我们在浏览器中输入sogou.com

出现了很多条,这些结果就是浏览器在访问搜狗主页的时候,产生的http请求,浏览器打开一个页面,对应的http请求可能是一个,也可能是多个.

蓝色的数据,说明这个是html页面,也是我们最关注的,这一条数据就是在请求搜狗的首页页面,其他的请求 都是基于这个请求产生的(搜狗主页里,其他代码又产生了别的请求).

双击左侧请求列表中的选项,查看到请求的详细情况.

 http请求,是具有一定格式的,fiddler会按照格式解析,呈现出不同的显示效果,此处的Raw选项.就是看最原始的效果.

 

 观察抓包结果,可以看到,当前的http请求,其实是个行文本格式的数据.

 

响应数据本来也是文本,但是有的时候服务器会对响应进行压缩(变成二进制,为了节省带宽).

 

 这个文本数据就是搜狗首页,html里的内容.


http里面的一些关键的信息的含义

首行,包括三个部分,之间使用空格来区分.

GET

HTTP的方法(method)

URL,俗称的网址,唯一资源定位符

版本号


认识URL

 服务器地址:域名

端口号:描述是哪个程序

 ​​​​查询字符串:获取资源的时候带的参数.

URL最关键的四个部分:

1.域名/IP

2.端口号

3.带层次的路径

4.查询字符串

一个URL这里的几个部分,是可以省略的.

省略了端口,浏览器会提供默认的端口,对于http来说默认端口是80;https来说,默认端口是443.

/也是路径,没有省略,代表根目录,

一个http服务器提供的资源是很多的,不同的路径,拿到的是不同的资源.

这就是搜狗专门为网吧提供的搜狗主页.

我们点击一个网页传奇

这个URL里就带有query string,以?开头,以键值对的方式组织,键值对之间使用&分割,键和值之间用=分割.

我们复制,在粘贴

发现是这样的,后面变成了乱码,其实这不是乱码,而是urlencode(转义字符)

url有些字符是有特殊含义的,就需要对内容进行重新的编码,如果不编码,直接写中文,可能浏览器就无法正确识别了. 


http方法

http中的方法不知get,有很多个.

 方法就描述了这次请求的语义(想干什么).

实际开发中,这里的方法大部分用不到,最常见的就是get和post.

HTTP请求可以认为是分成四个部分:

1.首行 

2.请求头(header)

3.空行(header的结束标志)

4.正文(body)

如果是get请求,没有body

如果是post请求,一般是有body的

GET请求:

1.在浏览器地址栏里直接输入url

2.html里的link,script,img,a...

3.通过js来构造get

POST 

典型的就是登录,登录跳转的时候会涉及到post,还有就是上传文件时会涉及到post.

来抓包一个登录时的post请求

 

在抓包结果中可以看到,post的body是程序员自定义的内容.

这里存放的数据的内容和格式都是程序员自主定义的.


GET和POST的区别

1.GET也可以给服务器传递一些信息,GET传递的信息一般都是放在query string.

POST传递消息则是通过body.

但这是一个习惯用法,GET也不是不能有body,POST也不是不能有query string.

2.语义上的差别,GET请求一般是用于从服务器获取数据,POST一般是用于给服务器提供数据.

3.GET通常会被设计成幂等,POST不要求幂等.(幂等:相同的输入,得到的结果也是确定的)

4.GET可以被缓存,POST则一般不能被缓存.(把请求的结果保存下来了,下次请求就不必真请求了,直接去取缓存结果)

GET和POST没有本质上的区别(在大部分场景下,彼此都能够相互取代),主要还是使用习惯上的差异.


下列部分就是header,这里是一堆键值对,每一行,是一个键值对,键和值之间用:分割.

这些键值对都是HTTP事先定义好的,有特定的含义.

Host

 大概描述了服务器的地址和端口,Host这里的地址和端口,用来描述你最终要访问的目标.

这个内容大概率适合URL中是一样的,但是有些情况下是不同的,比如当你访问的服务器有中间代理的服务器时,当访问到代理服务器时,URL是代理服务器的地址而host中是你最终要访问的服务器的地址.

Content-Length
表示 body 中的数据长度 .
Content-Type
表示请求的 body 中的数据格式 .

User-Agent

描述了浏览器和操作系统的版本,以前的User-Agent作用主要是通过User-Agent中的版本来判定返回网页的版本,现在User-Agent的作用主要是区分PC和移动.

Referer

表示这个页面是从哪个页面跳转过来的(当前页面的来源).

如果直接在浏览器中输入URL或者直接通过收藏夹访问页面是没有Referer的.

Cookie

非常重要的header属性,本质上浏览器给网页提供的本地存储数据的机制.

网页,默认是不允许反跟你计算机的硬盘的,为了保证安全.

浏览器对于访问硬盘做出了明确的限制,只能访问硬盘上的cookie,其他资源无法访问.

cookie就是通过键值对的方式来组织数据的.

Cookie从哪来:cookie中的数据来自于服务器,服务器会通过HTTP响应的报头部分(Set-Cookie字段)来决定浏览器的Cookie要存什么.

Cookie是在哪存:可以认为是存在与浏览器中,存在于硬盘中.Cookie在存的时候,是按照浏览器+域名 维度来进行细分的,不同的浏览器,各自村各自的cookie,同一个浏览器的不同的域名,对应着不同的cookie.Cookie中的内容不光是键值对,同时还有过期时间,比如很多网站,登录一次后,自动记录登陆状态,但是隔一段时间在登录,会重新输入账号密码登入.

Cookie要到哪里去:回到服务器这里.

客户端同一时刻有很多,客户端这边就会通过Cookie来保存当前用户使用的中间状态,当客户端访问浏览器的时候,就会自动的把Cookie 的内容带入请求中,服务器就能知道现在客户端是什么样子了.


HTTP响应

四个部分:

1.首行 HTTP/1.1(版本号) 200(状态码) OK(状态码描述)

2.header

3.空行,表示header的结束标记

4.body


HTTP状态码

描述了这次响应的结果(成功还是失败,失败原因)

 200 OK 成功了

404 not found 访问的资源不存在,在服务器上没找到

403 Forbidden 访问被拒绝(没有权限)

302 Move temporarily 重定向,类似于呼叫转移,比如一个网站更换了新域名同时配置了重定向功能,如果此时我访问了旧域名,就会自动跳转到新的域名,302这样的响应报文中,会在header里带有一个Location属性,通过这个属性来描述要跳转到哪个新地址,方便进行网站迁移.

500 服务器内部错误(服务器代码抛异常)

504 gateway timeout (响应时间太久)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值