Http协议详解(深入理解)
Posted java小师兄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http协议详解(深入理解)相关的知识,希望对你有一定的参考价值。
种一棵树最好的时间是十年前,其次是现在
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是基于客户端/服务端的架构模型。
HTTP的工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
客户端连接到Web服务器通常我们再浏览器输入一个网址并点击回车后,浏览器也就是我们所说的客户端会跟对应的Web服务器建立一个连接。(连接的过程涉及TCP的三次握手)
发送HTTP请求客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
服务器处理请求并响应HTTP并返回报文Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应报文由响应行、响应头、空行和响应数据4部分组成。
断开TCP连接若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(断开连接的过程涉及TCP的四次挥手);
客户端浏览器解析HTML内容客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
服务器响应浏览器发来的请求,并把对应的响应数据发送给浏览器;
断开 TCP连接;
浏览器解析响应报文的响应体数据并显示内容;
HTTP的特点
HTTP都是由客户端发起的,由服务端响应消息的。
HTTP协议是无状态的,每个HTTP请求都是独立的,任何的两次HTTP请求之间是不存在必然联系的。
无连接,限制每次连接只处理一个请求,当一次请求处理结束后,通信会被断开,下一次发起请求又是一个新的连接,
采用这种方式可以节省传输所花费的时间。
HTTP 1.0版本的主要缺点:HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1版本同样是无状态协议,但它引入了cookie机制,更好的实现了请求的状态管理。同时它增加了长连接功能,可以在请求处理结束后继续保持连接。
HTTP的构成
HTTP协议的请求报文和响应报文都由以下四部分组成
请求行
请求头
空行
消息主体
请求报文
下方是通过抓包工具抓取的请求报文信息
请求行
请求行有请求方法、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 | 回显服务器收到的请求,主要用于测试或诊断。 |
CONNECT | HTTP/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:表示跳转到当期那页面的之前页面
响应报文
响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
//常见状态码:
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
200~299:表示成功接收请求并已完成整个处理过程。常用200
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建立、释放连接也就是面试官常问的三次握手、四次挥手展开详细的讲解。
我是小师兄,我们下期再见。
以上是关于Http协议详解(深入理解)的主要内容,如果未能解决你的问题,请参考以下文章