主要梳理下简单的HTTP协议的基础知识,供大家参考
HTTP是什么
URI vs URL
uri: uniform resource identifier统一资源标识符
url: uniform resource locator统一资源定位符,是通过web浏览器访问资源的
urn: uniform resource name,统一资源命名,是通过名字来标识资源
HTTP是无状态的,如何保存状态?
url带查询参数
cookie
HTTP有哪些方法
GET: 用来请求访问已被URI识别的资源
POST: 用来传输实体的主体
PUT: 用来传输文件
HEAD: 获取报文首部,不返回报文主体部分
DELETE:删除文件
OPTIONS: 询问支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议链接代理
持久连接 keep-alive
只要任意一端没有明确提出断开连接,则保持TCP连接状态
管线化:并发请求
HTTP报文
用于HTTP协议交互的信息被称为HTTP报文
请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR[Carriage Return,回车符:16进制0x0d]+LF[Line Feed,换行符:16进制0x0a]作换行符)数据构成的字符串文本。
1,请求报文和响应报文的结构
ps:一般4种首部:通用首部、请求首部、响应首部和实体首部
常用的内容编码:
gzip(GUN zip) compress(UNIX系统的标准压缩)deflate(zlib)identity(不进行编码)
2,分割发送的分块传输编码
HTTP/1.1中存在一种称为传输编码(Transfer Coding)的机制,可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
发送多种数据的多部分对象集合(multipart)
MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展),允许邮件处理文本、图片、视频等多个不同类型的数据。
多部分对象集合包含的对象如下:
- multipart/form-data
在Web表单文件上传时使用
- multipart/byteranges
状态码206(Partial Content,部分内容)响应报文包含多个范围的内容时使用。
HTTP状态码
状态码详解
- 2XX 成功
200 OK
204 No Content 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新消息内容的情况下使用
206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX重定向
301 Moved Permanently 永久性重定向。
好处:
1,没有网址规范化问题:当有几个不同的URL指向同一个页面时,告诉搜索引擎哪个URL才是你想要
2,SEO(搜索引擎优化)中提到一点:如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的PageRank等信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。302 Found 临时性重定向。
SPAM(搜索引擎垃圾技术)303 See Other,表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。
PS:
1)当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送
2)301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。304 Not Modified
307 Temporary Redirect 会遵照浏览器标准,不会从POST变成GET。
个人理解:协议中这么多很多类似的跳转,302现在被大量使用,http1.1出现了303&307,应该是对302的细分出两个新的状态码,出发点是想让303&307替代302,但是现实是很多项目都是使用302。还有一点POST重定向的场景是否很多。4XX客户端错误:4xx的响应结果表明客户端是发生错误的原因所在
400 Bad Request
表示请求报文中存在语法错误。401 Unauthorized 表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息
403 Forbidden 表明对请求资源的访问被服务器拒绝
404 Not Found 表明服务器上无法找到请求资源
5XX服务器错误 表明服务器本身发生错误
500 Internal Server Error 表明服务器端在执行请求时发生了错误
503 Service Unavailable 表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端
PS:状态码和状况的不一致时,需要前后端把响应情况都要提前自定义好。如果是返回页面,最好做拦截,不要直接返回没有任何样式的响应。比如我们的404页面和500页面
与http协作的WEB服务器
代理、缓存代理
HTTP 首部
首部字段结构: 首部字段名: 字段值
PS:HTTP首部字段重复了,这种情况是根据浏览器内部处理逻辑的不同,结果可能并不一致。有的是优先处理第一次出现的首部字段,有的则会优先处理最后出现的首部字段。故要尽量不要重复
- 4种HTTP首部字段类型
1)通用首部字段(General Header Fields)
请求报文和响应报文两方都会使用的首部
2)请求首部字段(Request Header Fields)
从客户端向服务器端发送请求报文时使用的首部。
3)响应首部字段(Response Header Fields)
从服务器端向客户端返回响应报文时使用的首部
4)实体首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部
HTTP/1.1规范定义了如下47种首部字段
通用首部字段:请求报文和响应报文双方都会使用的首部
请求首部字段
响应首部字段
实体首部字段
主要说明下控制缓存的首部字段的区别:
1,Cache-Control
Cache-Control: private, max-age=0, no-cache
缓存请求指令
缓存响应指令
表示是否能缓存的指令:
1)public:表明其他用户也可利用缓存
2)private:响应只以特定的用户作为对象
3)no-cache:为了防止从缓存中返回过期的资源。表示客户端将不会接收缓存过的响应
4)no-store:暗示请求(和对应的响应)或响应中包含机密信息。该指令规定缓存不能在本地存储请求或响应的任一部分。
PS:从字面意思看很容易把no-cache误解成为不缓存,但事实上no-cache代表不缓存过期的资源,缓存会想服务器进行有效期确认后处理资源,也许称为do-not-server-from-cache-without-revalidation更合适。no-store才是真正地不进行缓存,注意区别
5)s-maxage:功能和max-age指令相同,不同点在于,s-maxage指令只适用于供多位用户使用的公共缓存服务器。即,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理
6)max-age:判定缓存资源的缓存时间数值比制定时间的数值更小,则客户端就接收缓存的资源。如果max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。如果同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略掉Expires首部字段,1.0版本相反。
2,Pragma是http/1.1之前版本的历史遗留字段,仅作为与http/1.0的向后兼容而定义。
Cache-Control: no-cache
Pragma: no-cache
3,ETag:告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
强ETag值,不论实体发生多么细微的变化都会改变其值
弱ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变。会在字段最开始处加W/。例:ETag: W/"usagi-1234"
配合使用首部:
If-Match
If-None-Match
If-Range
4,If-xxx这种样式的请求首部字段,称为条件请求。
If-Modified-Since
If-Unmodified-Since
If-Range:告知服务器若指定的If-Range字段值(ETag值或时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源
5,Expires:将资源失效的日期告知客户端。
6,Last-Modified