Http协议讲解

  Http是超文本传输协议,规定了客户端(浏览器)和服务端之间的通信格式,通过本篇文章一起来了解一下Http

特点:

首先来说一下Http的特点:

  1. 基于请求响应模型
  2. 默认端口:80
  3. 无状态的,底层是TCP实现,所以是可靠的

  基于请求响应模型就是指每一次业务过程都是客户端请求服务器,服务器响应客户端。Http是无状态的协议,也就是下一次请求响应对上一次请求响应是没有记忆的,而我们现在所使用的一直登陆状态等功能都是通过另外的功能实现的。由于TCP是全双工的,Http基于TCP实现,所以Http也是全双工的,Http协议通过TCP三次握手的保障,是可靠的协议。

历史版本以及长连接

Http有三个版本:1.0   1.1   1.2

  1.2还未普及,我们先不做讨论。1.0是曾经淘汰的版本,1.1是目前普遍使用的版本,两个版本最大的区别点在于长连接。

  在Http通信的过程中,每建立一次通信,就需要TCP三次握手来支持,然后断开时TCP四次挥手,而在版本1.0中,每请求一次,就建立一次连接,请求完成后就断开连接,显然连续多次请求时非常消耗资源的。所以在1.0+版本中,在请求首部加上了Connection:Keep Alive,服务端和客户端都加上这个协议来告知对方本次是长连接,如果没有该属性,则服务端会在响应报文之后就结束掉当前连接。

加上Keep Alive可以保证长连接,已经解决了长连接的问题,但是存在一些问题:

  1. Keep Alive不是标准的协议,客户端必须发送该属性才可以保证
  2. 如果是代理服务器的话,代理服务器可能会盲目转发,不解析头部的信息,导致建立长连接失败

  这个时候1.1横空出世,1.1采用了持久连接的方式替代Keep Alive,1.1默认采用长连接,如果要关闭长连接,则需要显示的在首部加上Connection:Close,但是空闲的连接也会被客户端和服务端关闭,不发送Connection:Close不意味着服务器承诺连接会永久打开。

报文结构

Http请求报文的结构如下:

请求行:标明是GET还是POST请求,请求的URL,HTTP的版本
请求头:请求头主要是以键值对的形式出现
空行:就是一个分割的标志,分割请求头和请求体
请求体:只有当请求时POST请求的时候, 请求体中才会出现请求的参数,如果时GET,请求参数会在URL中体现

下面时在浏览器抓到的一次请求:
在这里插入图片描述
对于请求头的一些意思,在这里做一些解释:

  • Host:访问的网站域名
  • Connection:标志该连接是长连接,详细的内容在上面已经讲过了
  • Accept:表明浏览器支持的类型,*表示通配符,可以支持html,xml等
  • User-Agent:这里给出了浏览器的一些信息,通过这个字段,服务端可以针对浏览器的兼容性问题给出解决方案
  • Referer:Referer是为了告诉服务器,该请求是从哪里来?早期使用较为广泛,主要的功能有两个,第一是防止盗链,举一个例子,优酷的电影链接,任何一个三方网站都可以把链接发到自己的网站上,如果不加以防止,那么流量就会分一些到三方网站,这肯定是优酷的一些损失,为了防止这个现象,优酷可以在自己的电影播放网站上加上判断,如果Referer是优酷认可的网站,则可以播放,如果是不认证的三方网站,那就不能播放。第二点是做统计使用,某网站为了统计请求的来源,就可以通过Referer来统计某网站的访问占比情况。

在这里插入图片描述

Http响应报文格式:

响应行:HTTP版本,状态码,状态码的描述
响应头:键值对
空行:分割
响应体:一般都是返回响应界面

通过浏览器看一下:
在这里插入图片描述
介绍几个常用的响应头信息:

  • Content-Type:服务端告诉客户端本次响应的数据格式和编码格式,通过该字段,可以设置浏览器的编码格式,主要用来解决编码问题
  • Content-disposition:服务器告诉客户端以什么格式打开响应数据,有几个默认值
    in-line:默认值,在当前页面内打开
    attachment;filename=xxx:以默认附件的形式打开响应体,用于文件下载

在这里插入图片描述
  响应体是真实用来传输数据,一般的响应体都是Html页面,我这里的页面实现的功能只是通知一下页面是否提交成功,所以传过来的是一个json对象。常用的还有二进制流,二进制流主要是图片,文件等。

解释一下响应的状态码:
分类:

  • 1xx:服务器端接受客户端消息,但是没有完成,等待一段时间后,发送该类型状态码,即问一下客户端,到底还有没有消息
  • 2xx:成功
  • 3xx:重定向,302(重定向),304(缓存:该图片或其他资源没有更改,浏览器已经缓存至本地,就不需要再请求服务器了,直接从浏览器本地拿即可),
  • 4xx:客户端错误,401(没有权限,需要登录),404(客户端请求路径错误),405(请求方式没有对应的方法,比如Get请求,但服务端没有doGet方法)
  • 5xx:服务器端错误,500(服务器端异常,内部出错)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值