HTTP1.1总结
HTTP1.1
写在前面的话:看过文档,但觉得看文档看不下去,可能有些是因为翻译的不好,更多我觉得是文档说明上过于生硬,而且知识点梳理安排的跟我学习阅读习惯大相径庭,所以下面总结的知识点更多是来自于网上和课本以及课堂上。我的方法是,去看文档目录,挑我感兴趣没了解过的点看文档,看不懂再去网上搜。另外一直还没了解透fiddler出现问题的情况怎么解决,例如有时候抓不了包,有时候不能抓Chrome只能抓ie的包,接下来有空会再继续琢磨。Charls的话个人觉得界面功能相对简洁,还没进一步深的探索,日常只是使用简单的抓包。
(老师可以使用导航窗格看目录结构)
定义
应用层协议,用于定义WEB浏览器与WEB服务器之间数据交换的过程。
Http1.0和1.1
Http1.0:请求一次,连接自动断开。
Http1.1:一次连接,可以发起多次请求。
http1.1和2.0
多路复用:HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
数据压缩:HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
服务器推送:意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
摘自博客https://blog.****.net/linsongbin1/article/details/54980801
URI & URL
URI:What the resource is, 资源是什么
URL: how to getthe resource
eg:URI:《哈利波特》,URL:312室第28行第5个书架
URL
http_URL=“http:”“//”host [“:”port] [abs_path [“?” \n查询]]
默认访问为80端口
http消息
首先发送general-header,接着是request-header 或 response-header 域,最后是 entity-header 域。
消息类型
HTTP 消息由从客户端到服务器的请求和从服务器到客户端的响应组成。
报文组成
Request
请求行
请求行格式为:请求方式 资源URL HTTP版本号
请求方式共有7种,常用的是GET和POST及head三种,GET常用来从服务器得到信息,POST主要用来向服务器提交信息,head用于获取资源的基本信息,即检查链接的可访性及资源是否被修改,不获取加载链接数据(正文部分)
get请求内容与浏览器URL关系:GET请求提交给服务器的信息被写在URL的“?“后面,使用“&”分隔多个键值对
报头head
Accept:客户支持的数据类型,全支持是"*/*",部分支持比如"text/htmlimage"表示支持HTML和图片
Accept-Charset:客户机采用的编码方式
Accept-Language:客户机语言环境,用来提示服务器进行正确的国际化,如"zh-cn"表示中文中国地区
Accept-Encoding:客户端支持的压缩格式,服务器端可根据该信息,将响应内容压缩至该格式进行传输
Host:请求哪个主机的资源
If-Modified-Since:如果服务器端相应资源的最后修改日期比这个日期新,就发送新的相应,否则就读取客户机浏览器缓存
Referer:表明当前的请求是从哪个页面发送出来的,用来支持服务器端做防盗链工作。
User-Agent:客户机的软件环境,如浏览器品牌及版本,操作系统品牌及版本等
Cookie:Cookie信息
Connection:用来告诉服务器端,当响应完成以后连接是关闭还是保持。常用的值两个:close/Keep-Alive
Date:客户机的时间
主体body
Get主体一般为空,信息在通过URL传递,post传递信息都在主体body中
所以get请求不会改变服务器数据或状态,post会改变服务器,因此,从这层意义上讲,对服务器而言,get方式比较安全
小结
post与get发送请求的区别:
1. 参数附件的位置不同
Post将参数附加到请求报文的实体主体之中。P1 = v1 & p2 = v2…
Get将参数附加到请求报文的请求行的请求URL之后,url?p1=v1&p2=v2…
2. 发送数据大小限制不同
Post可视为无限制
Get协议本身设限制,但浏览器和OS对其自身进行了控制不能发送很大数据
3. 安全性
Get不会修改服务器数据,数据库安全,但附件参数暴露在URL中,不安全,而post与get相反
总结一个就是,编程时候,若请求不包含敏感信息,且数据量不大时,可以采用get;而例如登录注册等携带敏感信息时,则采用post方法。
Response
状态行
格式为HTTP版本号状态码 原因叙述
响应状态码分为5类
// 100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。不常见。
// 200~299:表示成功接收请求并已完成整个处理过程,常用200
// 300~399:为完成请求,客户机需要继续细化请求。例如:请求的资源已经移动到一个新地址。常用302、304和307
// 302:请求被服务器重定向到新的URL,与响应头中的Location头配合使用
// 307和304:服务器要求客户机去拿缓存
// 400~499:客户端的请求有错误。常用404、403。404表示请求的资源不存在。403表示用户没有访问该资源的权限。
// 500~599:服务器端有错误产生,常用500。
响应头
Location:客户发来的请求,服务器端告诉客户端,你要的东西我没有,你可以去找某某,这个过程术语叫做请求重定向,而Location就是这个某某。
Server:服务器的类型
Content-Encoding:数据压缩格式
Content-Length:数据长度,指的是正文的长度
Content-type:数据类型
Last-Modified:资源缓存时间
Refresh:连命令浏览器多长时间刷新一次
Content-Disposition:是否以下载的方式打开资源
Transfer-Encoding:数据传送格式
ETag:缓存内容的头
Expires:缓存过期时间
Cache-Control:no-cache是否要缓存
Pragma:no-cache是否需要缓存
主体body
就是存放的HTML文件
连接性—长连接
HTTP/1.1 服务器<可以>假设 HTTP/1.1 客户端打算维护永久连接,除非所发送请求中的Connection 头部中包括连接记号“close”。如果服务器选择在发送响应后立即关闭连接,它<应该>发送包括关闭连接记号的 Connection 头部。
HTTP/1.1 客户端<可以>希望连接保持打开,但将靠服务器的响应中是否包含有关闭连接记号的 Connection 头部来决定维持连接打开。在客户端不希望为除该它以外的更多请求维护连接的情况下,它<应该>发送 Connection 头部,包括关闭连接记号。
如果客户端或服务器两者之一在 Connection 头部中发送关闭记号,则该请求成为该连接上的最后一个。
客户端和服务器<不该>假设为 HTTP 版本号小于 1.1 的维护永久连接,除非它明确发信
号。关于与 HTTP/1.0 客户端向后兼容的更多信息见 19.6.2 节。
为了保持永久,所有在连接上的消息<必须>有自定义的消息长度(如,不是定义为连接关闭的一种),如 4.4 节中所述的。
--译文
HTTP/1.1 持久连接 Persistent Connection
HTTP/1.1逐渐停止了对keep-alive连接的支持,用一种名为持久连接的改进型设计取代了它。持久连接的目的与keep-alive连接的目的相同,但是工作机制更优些。HTTP/1.1就吃连接在默认情况下是**的,除非特别指明,否则HTTP/1.1假定所有的连接都是持久的,要在事务处理结束之后将连接关闭,HTTP/1.1应用程序必须向报文中显示地添加一个Connection:close首部。
HTTP1.1客户端加载在收到响应后,除非响应中包含了Connection:close首部,不然HTTP/1.1连接就仍然维持在打开状态。但是,客户端和服务器仍然可以随时关闭空闲的连接。不发送Connection:close并不意味这服务器承诺永远将连接保持在打开状态。
注意:
1 只有当连接所有的报文都有正确的、自定义报文长度时,也就是说,实体主体部分的长度都和相应的Content-Length一致,或者用分块传输编码方式编码的,连接诶才能持久保持。
2 如果客户端不想在连接上发送其他请求了,就应该在最后一条请求中发送一个Connection:close请求首部
缓存
1.包含属性的首部(header)--------------------------附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中
2.包含数据的主体部分(body)-----------------------HTTP请求真正想要传输的部分
强制缓存及对比缓存规则
两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。
强制缓存 — Cache-Control字段
Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发(对于前端开发来说,缓存越多越好,so...基本上和它说886)
鄙人以为,对于强制缓存有意义的字段就是max-age了
对比缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。
再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。否则发送新数据,返回200.
第一次请求有关字段Last-Modified 、Etag
第二次请求有关字段:If-Modified-Since,If-None-Match
Last-Modified、If-Modified-Since这对字段,服务器最后资源的修改时间。Last-Modified由服务器向浏览器响应时发送回来的数据,而If-Modified-Since是浏览器再次请求浏览器带过去的数据,值跟Last-Modified值一致。
Etag、If-None-Match这对字段,当前资源在服务器的唯一标识,发送规则与上一对一样,且优先级高于上一对。
小结
浏览器第一次请求:
浏览器再次请求时: