HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
完整的Url:模式(或称协du议)、域名(或IP,ip用来标识机器/主机/服务器)、端口、路径
https://blog.csdn.net/qq_35313994
https://blog.csdn.net:443/qq_35313994 https默认端口443
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
浏览器中的network中的Resopnse看到的是响应正文
请求头中常见报文属性
- Accept :浏览器客户端用来告诉服务端其能接受什么类型的响应。
- Accept-Charset: 支持使用的字符集
- Accept-Encoding: 支持使用的编码方式
- Accept-Language: 支持使用语言
- Cookie:客户端浏览器用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如用户名和密码,sessionId等。
- Host: 服务器地址。指定要请求的资源所在的主机和端口,通常从url里获取。这个字段是必需的
- Referer:浏览器客户端用来告诉服务器这个请求是从哪个页面链接过来的,即请求来源。
- User-Agent :告诉服务器,客户端使用的操作系统、浏览器版本和名称
- Connection: Keep-Alive :(当前tcp连接的状态)客户端和服务器保持长时间链接,Connection:close 在响应结束后关闭连接
- Content-Encoding:支持的编码
- Content-Language:支持的自然语言
- Content-Length:文本长度
- Content-Location:资源所在位置
- Content-Range:在整个资源中此实体表示的字节范围
- Content-Type:主体的对象类型 点击查看 HTTP content-type
常见的状态码
常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
缓存机制
Web 应用还可以利用客户端缓存去节省相同页面内容的生成和传输时间。分为强缓存和协商缓存
强缓存:浏览器直接从本地缓存中获取数据,不与服务器进行交互。强缓存在客户端和服务器端都会存在。
协商缓存:浏览器发送请求到服务器,服务器判定是否可使用本地缓存。
浏览器缓存主要是 HTTP 协议定义的缓存机制。HTML meta 标签,例如
<META HTTP-EQUIV="参数" CONTENT="参数值">
//使用带有 http-equiv 属性的 <meta> 标签时,服务器将把名称/值对添加到发送给浏览器的内容头部
http-equiv类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。与之对应的属性值为content,content中的内容其实就是各个参数的变量值
1.Expires(期限)
说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新传输。
语法:
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT"/>
注意:必须使用GMT的时间格式,或者直接设为0(数字表示多久后过期)
2.Pragma(cache模式)
说明:禁止浏览器从本地计算机的缓存中访问页面内容。
语法:
<meta http-equiv="Pragma" content="no-cache"/>
注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。
3.Refresh(刷新)
说明:自动刷新并指向新页面。
语法:
<meta http-equiv="Refresh" content="5,URL=http:://baidu.com"/>
// 其中的5表示5秒后自动刷新并调整到URL新页面。
http缓存流程图 :
![](https://i-blog.csdnimg.cn/blog_migrate/dddbb0a083a44ab34c7da45fcfe7b9c5.png)
协商缓存流程分析:
ETag和If-None-Match:服务器为每份资源分配的唯一标识字符串。
浏览器发现缓存过期(缓存可能还能使用,服务器资源可能仍然没有改变,所以需要与服务器协商,让服务器判断本地缓存是否还能使用)
- 浏览器请求资源,服务器会在响应报文头中加入ETag字段。资源更新时,服务器端的ETag值也随之更新,生成 ETag 值时,并没有 统一的算法规则,而仅仅是由服务器来分配。;
- 浏览器再次请求资源时,会在请求报文头中添加If-None-Match字段,它的值就是上次响应报文中的ETag的值;
- 服务器会比对ETag与If-None-Match的值是否一致,如果不一致,服务器则接受请求,返回更新后的资源;如果一致,表明资源未更新,则返回状态码为304的响应,可继续使用本地缓存,要注意的是,此时响应头会加上ETag字段,即使它没有变化。
Last-Modified和If-Modified-Since:是GMT格式的时间字符串。
- 浏览器第一次向服务器请求资源后,服务器会在响应头中加上Last-Modified字段,表明该资源最后一次的修改时间;
- 浏览器再次请求该资源时,会在请求报文头中添加If-Modified-Since字段,它的值就是上次服务器响应报文中的Last-Modified的值;
- 服务器会比对Last-Modified与If-Modified-Since的值是否一致,如果不一致,服务器则接受请求,返回更新后的资源;如果一致,表明资源未更新,则返回状态码为304的响应,可继续使用本地缓存,与ETag不同的是:此时响应头中不会再添加Last-Modified字段。
强缓存流程分析:
用户发起了一个http请求后,浏览器发现先本地已有所请求资源的缓存,便开始检查缓存是否过期。有两个http头部字段控制缓存的有效期:Expires和Cache-Control,浏览器是根据以下两步来判定缓存是否过期的:
- 查看缓存是否有Cache-Control的s-maxage或max-age指令,若有,则使用响应报文生成时间Date + s-maxage/max-age获得过期时间,再与当前时间进行对比(s-maxage适用于多用户使用的公共缓存服务器);
- 如果没有Cache-Control的s-maxage或max-age指令,则比较Expires中的过期时间与当前时间。Expires是一个绝对时间。
- 若缓存未过期,返回状态码为200,则直接从本地读取缓存,这就完成了整个强缓存过程;如果缓存过期,则进入协商缓存或服务器返回新资源过程。