HTTP1.1总结

HTTP1.1

写在前面的话:看过文档,但觉得看文档看不下去,可能有些是因为翻译的不好,更多我觉得是文档说明上过于生硬,而且知识点梳理安排的跟我学习阅读习惯大相径庭,所以下面总结的知识点更多是来自于网上和课本以及课堂上。我的方法是,去看文档目录,挑我感兴趣没了解过的点看文档,看不懂再去网上搜。另外一直还没了解透fiddler出现问题的情况怎么解决,例如有时候抓不了包,有时候不能抓Chrome只能抓ie的包,接下来有空会再继续琢磨。Charls的话个人觉得界面功能相对简洁,还没进一步深的探索,日常只是使用简单的抓包。

(老师可以使用导航窗格看目录结构)

定义

应用层协议,用于定义WEB浏览器与WEB服务器之间数据交换的过程。

Http1.01.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.csdn.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应用程序必须向报文中显示地添加一个Connectionclose首部。

HTTP1.1客户端加载在收到响应后,除非响应中包含了Connectionclose首部,不然HTTP/1.1连接就仍然维持在打开状态。但是,客户端和服务器仍然可以随时关闭空闲的连接。不发送Connectionclose并不意味这服务器承诺永远将连接保持在打开状态。

注意:

只有当连接所有的报文都有正确的、自定义报文长度时,也就是说,实体主体部分的长度都和相应的Content-Length一致,或者用分块传输编码方式编码的,连接诶才能持久保持。

2 如果客户端不想在连接上发送其他请求了,就应该在最后一条请求中发送一个Connectionclose请求首部

摘自博客https://www.cnblogs.com/chengdabelief/p/6686603.html

 

缓存

1.包含属性的首部(header)--------------------------附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header
2.包含数据的主体部分(body)-----------------------HTTP请求真正想要传输的部分

 

强制缓存及对比缓存规则

 


两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。

强制缓存 — Cache-Control字段

Cache-Control 是最重要的规则。常见的取值有privatepublicno-cachemax-ageno-store,默认为private
private:            客户端可以缓存
public:             
 客户端和代理服务器都可缓存(前端的同学,可以认为publicprivate是一样的)
max-age=xxx:   
缓存的内容将在 xxx 秒后失效
no-cache:          
需要使用对比缓存来验证缓存数据(后面介绍)
no-store:          所有内容都不会缓存,强制缓存对比缓存都不会触发(对于前端开发来说,缓存越多越好,so...基本上和它说886

 

鄙人以为,对于强制缓存有意义的字段就是max-age

 

对比缓存

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。
再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。否则发送新数据,返回200.

第一次请求有关字段Last-Modified Etag 

第二次请求有关字段:If-Modified-SinceIf-None-Match

Last-ModifiedIf-Modified-Since这对字段,服务器最后资源的修改时间。Last-Modified由服务器向浏览器响应时发送回来的数据,而If-Modified-Since是浏览器再次请求浏览器带过去的数据,值跟Last-Modified值一致。

EtagIf-None-Match这对字段,当前资源在服务器的唯一标识,发送规则与上一对一样,且优先级高于上一对。

小结

浏览器第一次请求:

 

 


浏览器再次请求时:


学习、部分摘自博客https://www.cnblogs.com/chenqf/p/6386163.html

 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值