HTTP协议

1.HTTP协议简介

HTTP协议(超文本传输协议HyperText Transfer Protocol),一种无状态的,以请求/应答方式运行的协议,使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动

它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。

注意:
客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现

2.HTTP报文格式

HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:

  1. 起始行(start line):描述请求或响应的基本信息
  2. 头部字段集合(header):使用key-value形式更详细地说明报文
  3. 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据

请求:
在这里插入图片描述
在这里插入图片描述

响应:
在这里插入图片描述
在这里插入图片描述

2.1 请求行报文格式

在这里插入图片描述

  1. 请求方法:如GET/HEAD/PUT/POST,表示对资源的操作
  2. 请求目标:通常是一个URI,标记了请求方法要操作的资源
  3. 版本号:表示报文使用的HTTP协议版本
2.2 响应行版本格式

在这里插入图片描述

  1. 版本号:表示报文使用的HTTP协议版本
  2. 状态码:一个三位数,用代码的形式表示处理的结果,比如200是成功,500是服务器错误
  3. 原因:作为数字状态码补充,是更详细的解释文字
2.3 HTTP头字段

头部字段是key-value的形式,key和value之间用:分隔,最后用CRLF换行表示字段结束。比如传输数据类型的 Content-type:application/json。
HTTP头字段非常灵活,不仅可以使用标准里的Host、Connection等已有头,也可以任意添加自定义头。

头字段注意事项:

  1. 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符-,但不能使用下划线_。
  2. 字段名后面必须紧接着:,不能有空格,而:后的字段值前可以有多个空格
  3. 字段的顺序是没有意义的,可以排列不影响语义
  4. 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie

常用的头字段:

  • Accept:这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。有text/html,image/,/等几种常用类型。/*可以简单的概括为告诉服务器,客户端什么数据类型都支持
  • Accept-Charset:这个头信息指定浏览器可以用来显示信息的字符集。例如 ISO-8859-1
  • Accept-Encoding:这个头信息指定浏览器知道如何处理的编码类型。值 gzip 或 compress 是最常见的两种可能值
  • Accept-Language:这个头信息指定客户端的首选语言,在这种情况下,Servlet 会产生多种语言的结果。例如,en、en-us、ru 等。
  • Authorization:这个头信息用于客户端在访问受密码保护的网页时识别自己的身份。
  • Connection:这个头信息指示客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续连接。
  • Content-Length:这个头信息只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。
  • Cookie:这个头信息把之前发送到浏览器的 cookies 返回到服务器。
  • Host:这个头信息指定原始的 URL 中的主机和端口。
  • Referer:这个头信息指示所指向的 Web 页的 URL。例如,如果您在网页 1,点击一个链接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。
  • User-Agent:这个头信息识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

3. HTTP请求的完整过程

在这里插入图片描述

简单来说:
在这里插入图片描述

  1. URL匹配和DNS解析。在浏览器中输入一段 URL 的时候,会通过一系列规则,匹配到相应的唯一资源,比如说:http://mu-mu.cn/example/index.html,则是告诉浏览器,我们需要通过http协议,在mu-mu.cn这个服务端,在默认的80端口下,在/example目录下,请求index.html这个资源。
  2. 建立TCP连接:三次握手。在正式发送请求之前,需要先建立TCP连接。建立TCP连接的过程简单地来说就是客户端和服务端之间发送三次消息来确保连接的建立,这个过程称为三次握手。
  3. 发送请求。TCP连接建立完毕之后,客户端就可以向服务端发送请求报文来请求资源了。请求报文分为请求行、请求头、空行和请求体,服务端通过请求行和请求头中的内容获取客户端的信息,通过请求体中的内容获取客户端传过来的数据。
  4. 响应应答。在接收到客户端发来的请求报文并且确认完毕之后,服务端会向客户端发送响应报文。响应报文由状态行、响应头、空行和响应体组成,服务端通过状态行和响应头告诉客户端请求的状态和如何对数据处理等信息,真正的数据则在响应体中传输给客户端。
  5. 断开TCP连接。当请求完成后,还需断开TCP连接。断开的过程简单地说就算客户端和服务端之间发送四次信息来确保连接的断开,所以称为四次挥手

4. HTTP请求的特性

  1. 单向请求。 HTTP请求是单向的,是只能由客户端发起请求,由服务端响应的请求-响应模式。(如果你需要双向请求,可以用socket)
  2. 基于TCP协议。 HTTP是应用层协议,所以其数据传输部分是基于TCP协议实现的。
  3. 无状态。 HTTP请求是无状态的,即没有记忆功能,不能获取之前请求或响应的内容。起初这种简单的模式,能够加快处理速度,保证协议的稳定,但是随着应用的发展,这种无状态的模式会使我们的业务实现变得麻烦,比如说需要保存用户的登录状态,就得专门使用数据库来实现。于是乎,为了实现状态的保持,引入了Cookie技术来管理状态。
  4. 无连接。 HTTP协议不能保存连接状态,每次连接只处理一个请求,用完即断,从而达到节约传输时间、提高并发性。在TCP连接断开之后,客户端和服务端就像陌生人一样,下次再发送请求,就得重新建立连接了。有时候,当我们需要发送一段频繁的请求时,这种无连接的状态反而会耗费更多的请求时间(因为建立和断开连接本身也需要时间),于是乎,HTTP1.1中提出了持久连接的概念,可以在请求头中设置Connection: keep-alive来实现。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值