http头authorization值格式错误_Http协议详解(深入理解)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 00:12   672   0

种一棵树最好的时间是十年前,其次是现在

The best time to plant a tree was ten years ago,then is here and now

前言

实际开发过程中肯定离不开http请求,面试的时候也难免会碰到面试官让你谈一谈http的场景。如果上来就是"三连"起始行、header、body,是一个应用层协议,没到三句话结束了,那可以想象场面有多尴尬。本篇文章主要以HTTP1.1展开讲解。

了解HTTP协议

HTTP是一种超文本传输协议,HTTP是缩写,它的全英文名是HyperText Transfer Protocol。由请求和响应两部分构成,是一个标准的客户端服务器模型。HTTP协议是建立在TCP协议之上的,是一个无状态的协议。

什么是超文本?

超文本包含有文本信息(html、css、javascript)和各种多媒体信息,例如图形、声音、图像、视频等。

HTTP应用于客户端与服务端之间的通信,client客户端向server服务端发起请求,server服务端响应client客户端的请求,所以说HTTP是基于客户端/服务端的架构模型。

c14cf815d1286b1588a971058309db3a.png

HTTP的工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器通常我们再浏览器输入一个网址并点击回车后,浏览器也就是我们所说的客户端会跟对应的Web服务器建立一个连接。(连接的过程涉及TCP的三次握手)

  2. 发送HTTP请求客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  3. 服务器处理请求并响应HTTP并返回报文Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应报文由响应行、响应头、空行和响应数据4部分组成。

  4. 断开TCP连接若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(断开连接的过程涉及TCP的四次挥手);

  5. 客户端浏览器解析HTML内容客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

  3. 服务器响应浏览器发来的请求,并把对应的响应数据发送给浏览器;

  4. 断开 TCP连接;

  5. 浏览器解析响应报文的响应体数据并显示内容;

HTTP的特点

HTTP都是由客户端发起的,由服务端响应消息的。

HTTP协议是无状态的,每个HTTP请求都是独立的,任何的两次HTTP请求之间是不存在必然联系的。

无连接,限制每次连接只处理一个请求,当一次请求处理结束后,通信会被断开,下一次发起请求又是一个新的连接,

采用这种方式可以节省传输所花费的时间。

HTTP 1.0版本的主要缺点:HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1版本同样是无状态协议,但它引入了cookie机制,更好的实现了请求的状态管理。同时它增加了长连接功能,可以在请求处理结束后继续保持连接。

e9980d21268cc6122035d20f99a5fa8d.png

39f419aeebe9ffd7e9c6e5b3b0918681.png

HTTP的构成

HTTP协议的请求报文和响应报文都由以下四部分组成

  1. 请求行

  2. 请求头

  3. 空行

  4. 消息主体

请求报文

下方是通过抓包工具抓取的请求报文信息

5e74d6269b74ea25626f92f25cedba0b.png

请求行

请求行有请求方法、URL字段、HTTP协议版本号三部分组成

请求方法共有八种:

HEAD、GET、POST (HTTP 1.0)

OPTIONS、PATCH、DELETE、PUT、TRACE、CONNECT (HTTP 1.1新增)

方法Vital Task
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
HEAD向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
GET请求指定的页面信息,并返回实体主体。
POST向指定资源提交数据进行处理请求(如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
DELETE请求服务器删除指定的页面。
PUT客户端向服务器传送的数据取代指定的文档的内容。
TRACE回显服务器收到的请求,主要用于测试或诊断。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

请求头

请求头用来向客户端解释请求信息

请求报头常见属性(这里重点解释常用的):

Accept:可接受响应类型(application/json、text/plain等)

Accept-Charest:可接收的字符集(utf-8等)

Accept-Encoding:可接受的相应内容的编码方式(gzip、deflate等)

Accept-Language:可接受的响应内容语言列表(en-US、zh-CN等)

Authorization:http认证信息(oauth认证)

Cache-Control:缓存机制控制(on-cache、on-store、max-age、public、private)

Connection:客户端优先使用的链接类型(keep-alive、upgrade)

User-Agent:浏览器的身份标识字符串

Origin:发起一个针对跨域资源共享的请求

If-Modified-Since:上一次响应的Last-Modified的值回当做If-Modified-Since的值发送给服务器

If-None-Match:上一次响应的ETag的值会当做If-None-Match的值发送给服务器

Referer:表示跳转到当期那页面的之前页面

响应报文

b3b4e276325e0f07a0aaa9dd0877c2fb.png

响应行

响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK

其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。

//常见状态码:

100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

200~299:表示成功接收请求并已完成整个处理过程。常用200

300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)

400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

500~599:服务器端出现错误,常用500

响应头

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。以下是常见的响应头信息

应答头说明
Allow服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires应该在什么时候认为文档已经过期,从而不再缓存它?
Last-Modified文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
Server服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

以上就是对HTTP基础知识的讲解,下期我会针对TCP建立、释放连接也就是面试官常问的三次握手、四次挥手展开详细的讲解。

我是小师兄,我们下期再见。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP