HTTP协议
HTTP
http(hyper text transfer protocal) 超文本传输协议.http是一种协议,所以只要是使用http协议的设备都能访问服务器,比如手机、智能外设。
URI 统一资源标识符,相比URL来说URI是更通用的标识符,URI就是某个协议方案表示的资源的标识符,协议方案是指访问资源所使用的协议类型名称。采用HTTP协议的时候,协议方案就是http,除此之外还有ftp、mailto、file等。
URI的子集有URL和URN
URL 统一资源定位符,通过描述资源的位置来识别资源。
URN 通过描述资源的名字来识别资源。
http协议的作用
http最大的作用就是客户端发请求,服务器给出响应,客户端向服务器发请求的方法有以下几种:
GET:最常用方法,用于客户端请求服务器响应某个资源
HEAD:和get方法类似,但用head后服务器的响应没有资源内容,只有资源的头信息。主要用途:
1.在不获取资源内容的情况下获取资源的相关信息(资源类型,大小)即响应头
2.通过状态码查询资源是否存在
3.通过查看首部,确认资源是否已被修改
POST:用于向服务器发送数据,通常用来支持html表单,表单中的数据发送到服务器
PUT:用于将某个资源放入服务器,post是向服务器提交信息,put是提交资源(服务器未必)
DELETE:发送请求删除服务器上的资源(服务器未必支持)
OPTIONS:请求服务器返回服务器上可用的方法
TRACE:TRACE请求会在目的服务器端发送一个“闭环”诊断,行程最后一站服务器会弹回一条TRACE响应,并在响应主题中携带它收到的原始请求报文
http协议状态码
1~199系列 指定客户端应相应的某些动作
200~299系列 请求成功
300~399系列 重定向 为了完成请求,必须采取进一步措施
400~499系列 客户端错误 请求的语法有错误或不能满足客户端需求
500~599系列 服务端错误 服务器无法完成明显有效的请求
常用statu code
200 ok 请求已成功,请求所希望的响应头或数据体将随此响应返回。
206 服务器已经成功处理了部分GET请求。类似于迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
301 永久重定向,所请求资源永久性移动到新位置,下次如果再有这个资源的请求都应该使用本响应返回的若干个URI之一
302 临时重定向,请求的资源临时的移动到了新位置
304 内容无变化,not-modify,所请求的资源直接在本地缓存中查找
307 重定向后保持原有的数据,用在POST请求但目标位置重定向了。
403 服务器有资源但拒绝此次请求,一般是无权限访问
404 页面无法找到
500 服务器遇到意外错误,无法完成客户请求
502 服务器作为网关或代理时返回了非法应答。找不到网关
504 表示不能及时地从远程服务器获得应答。找到网关但超时了
505 服务器不支持所请求的http版本。
报文
http报文是http应用程序之间传送的数据块,数据块以文本形式的元信息开头,描述报文的内容及含义,后面跟着可选的数据部分。报文分请求报文,响应报文,每个报文都包含一条来自客户端的请求或者一条来自服务器的响应,由3个部分组成:对报文进行描述的起始行,包含属性的头部,包含数据的主体。
起始行和首部就是由行分隔的ASCII文本,主体是一个可选的数据块,可能是文本、二进制或者空。
1.请求报文:
请求起始行(请求方法get/post,请求资源路径,协议版本)get /0606/001.html HTTP/1.1
请求头key:value(要包含请求头主体长度content-length:123)
请求体(使用不同方法时,不一定有请求体内容)
2.响应报文:
响应起始行(协议版本 状态码 状态描述)
响应头key:value(要包含响应体主体长度content-length:123,content-type:xxx)
响应体
请求/响应主体长度(使用不同方法时,不一定有长度,比如使用get时没请求体所以就没主体长度)。主体长度告知浏览器/服务器接收到多少个字符算结束,与下面请求体分割开。
3.首部-通用首部定义
date 报文创建的日期
cache-control 关于浏览器缓存的最重要的设置,max-age=200; 缓存保持200秒后过期
Etag 实体唯一标签
4.请求首部定义
Referer 当浏览器向web服务器发送请求的时候,告诉服务器请求是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
Accept 客户端能处理的媒体类型
Accept-Charset 客户端能处理的字符集
Accept-Encoding 客户端能处理的编码类型
Accept-Language 客户端能处理的语言
If-None-Match 客户端发起请求时如果需要获取资源的ETag和当前文档ETag不符合,则允许获取资源。作用是减少请求。
If-Modified-Since 客户端发起请求时指明如果所请求资源是在某个时间起修改的则允许获取资源。
If-Range 允许客户端获取文档的某个范围
Cookie 客户端发起请求时附带的cookie信息,键值对。
5.响应首部定义
Server 服务器信息
Content-Encoding 响应体编码格式
Content-Language 响应体语言类型
Content-Length 响应体长度
Content-Location 响应体资源的实际位置
Content-MD5 响应体的MD5信息
Content-Type 响应体的媒体类型即MIME
Expires 响应体的过期时间
Last-Modified 响应体的最后修改时间
Etag 实体标签,用来控制客户端的缓存验证。通过hash算法得到一串唯一的数字,返回的浏览器,下次浏览器请求附带这个Etag,服务器将Etag和服务器端的Etag做比对,如果不一致则返回新内容,如果一致则返回304。
首部截图如下:
首部包括:普通首部(General)、请求首部(Request Headers)、响应首部(Response Headers)、实体首部(Entity header)。
普通首部:请求报文和响应报文两方都会使用的首部。
请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
6.MIME 多用途Internet邮件扩展类型
是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。Content-type 中会指明MIME的类型
HTTP协议工作的具体步骤
1.客户端连接到Web服务器:
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2.发送HTTP请求:
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3.服务器接受请求并返回HTTP响应:
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4.释放连接TCP连接:
Web服务器主动关闭TCP套接字,释放TCP连接;客户端被动关闭TCP套接字,释放TCP连接。
5.客户端浏览器解析HTML内容:
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
浏览器缓存原理
浏览器缓存分为强缓存和协商缓存,协商缓存是配合强缓存来使用的。
当浏览器第一次请求资源时,根据开发者的要求或者协议的默认,服务器端会在响应头中添加一些跟缓存有关的字段,最终这个资源和响应头会绑定在一起缓存到浏览器中。
当浏览器再次请求这个资源时,首先判断它是否命中了强缓存,判断依据来自于之前响应头中的Expires或Cache-Control字段:
1.Expires:来自于HTTP/1.0,描述一个绝对时间,由服务器返回,用GTM格式的字符串表示,当浏览器再次请求资源时,先从缓存中找到这个资源和跟它绑定在一起的响应头,拿出响应头中的Expires跟当前请求时间对比,如果请求时间在Expires指定的时间之内,就能命中强缓存,直接在浏览器的缓存中读取该资源,无需再向服务器请求资源了。
但是Expires描述是一个服务器的绝对时间,而客户端的时间与服务器时间存在时间差,而且客户端时间可以人为修改,这些都会影响判断结果,因此HTTP/1.1推出Cache-Control字段来更好的控制缓存。
2.Cache-Control:提供了更多的缓存设置,有一个描述相对时间max-age,单位是s,如果再次请求的时间间隔小于max-age,表示命中强缓存。Cache-Control和Expires可以同时存在,但是Cache-Control的优先级更高
如果这个资源没有命中强缓存,浏览器就会发送一个请求到服务器,验证协商缓存是否命中,如果命中,也是能够在缓存中直接读取资源了。协商缓存是依靠Last-Modified,If-Modified-Since和ETag , If-None-Match这个两队字段来控制。
3.Last-Modified,If-Modified-Since:同Expries相似,Last-Modified存在于上一次的响应头中,描述了这个资源在服务器中最后一次修改的时间,当强缓存未命中时,浏览器会发送请求给服务器,请求头中就有If-Modified-Since这个字段,这个字段等于上一次响应头中的Last-Modifie的值,服务器收到请求后,根据传过来的If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有更新,若资源更新了,则正常返回资源内容,HTTP200 。若资源没有更新,则返回HTTP304,浏览器就直接读取缓存中的资源。但是有时候Last-Modified不太可靠,比如时间只能精确到秒级,资源内容变化了但是时间没有变等,就需要ETag来处理。
4.ETag,If-None-Macth:原理与Last-Modified一样,只不过ETag是根据请求的资源生成的一个唯一标识,这个标识是一个字符串,生成规则跟服务器使用的程序有关。只要资源发生了变化,这个字符串就会发生变化,所以能够很好的补充Last-Modified的问题。Last-Modified可以与ETag一起使用,服务器会优先验证ETag,一致的情况下,再验证Last-Modified。
Catch-control结合Etag控制缓存(if-None-Match)
比如:浏览器第一次请求a.jpg 时,服务器会发送完整的文件并附带额外信息,其中Etag 是 对a.jpg文件的编码,如果a.jpg在服务端未被修改,这个值就不会变
Cache-Control: max-age=300
ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"
浏览器把a.jpg和额外信息保存到本地。假如浏览器在300秒以内再次需要获取a.jpg时,浏览器直接从缓存读取a.jpg(200, from xx cache)。假如浏览器在300秒之后再次需要获取a.jpg时,浏览器发现该缓存的文件已经不新鲜了,于是就向服务器发送请求 重新获取a.jpg, 在发送请求的时候附带刚刚保存的a.jpg的ETag ( If-None-Match:W/"e-cbxLFQW5zapn79tQwb/g6Q")
。
服务器在接收到请求后拿浏览器请求的 Etag 和当前文件重新计算后端 Etag 做个比较,如果二者相等表示文件在未修改则发送个短消息(响应头,不包含图片内容, 304),如果二者不等则发送新文件和新的 ETag,浏览器获取新文件并更新该文件的 Etag。
与 ETag 类似功能的是Last-Modified/If-Modified-Since
。当资源过期时(max-age超时),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(200);若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 ,告知浏览器继续使用所保存的cache。