http 请求的场景相对复杂,对应的http 协议也是各式各样的。在我们日常的开发中,经常会使用到cookie,浏览器的缓存机制。各式各样的网络连接,这些都和http有着千丝万缕的联系。
http协议是什么
http协议是超文本传输协议的缩写。他是从web服务器传输超文本标记语言到本地浏览器的传输协议。
http的原理
http是一个基于TCP/IP通信协议来传输数据的协议。传输的数据类型为HTML文件,图片文件,查询结果等。
http协议的演化
http 协议从创造开始就不断的进程着一系列的演化,从HTTP/1.0、HTTP/1.1,到http/2.0,http/3.0在保持协议简单的同时,扩展了灵活性,提供越来越快,更加可靠的传输协议。
http/1.0 到http/1.1 主要实现了对TCP连接的复用.最初在http/1.0 中每一对http请求和响应都需要单独建立一个tcp链接,这样的方式对资源消耗甚大,所以在http/1.1中引入了持久链接的概念,通过设置Connection头部为keep-alive的方式,可以让tcp连接不会关闭,这样避免了tcp重复链接,客户端可在已建立的tcp链接上,长时间的对同一个服务端发起请求。
http/1.1 到http/2 主要实现了多个请求的复用。http2 通过将http消息拆分为独立的帧,进行交错发送,实现了在同一个链接并行请求,来减少网络请求的延迟。为了实现多路复用,http2 协议对http头部进行了二进制编码,除此之外,http2 还实现了header压缩,服务器主动推动,流优先级等能力。
http2到http3,主要实现了基于UDP协议,更快地传输。http3 使用了基于UDP的QUIC协议,实现了有快有可靠的传输,由于UDP协议中没有错误检查内容,因此可以更快的实现通信,同时,QUIC协议负责合并纠错,重建丢失的数据,解决了UDP协议传输丢包的问题。
http协议的演变过程主要围绕着传输效率和速度的优化上。可以通过升级http协议来优化前段的应用。除此之外。同样可以借鉴http协议的优化手段,比如可以使用压缩资源,资源复用等技术手段来优化前段性能。
http协议的特点
- http协议支持客户端/服务端模式,也是一种请求响应模式的协议。
- 简单快速:客户向服务器请求服务的时候,只需要传送请求方法和路径,请求方法常用的有GET,HEAD,POST
- 灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。
- 无连接:限制每次连接只处理一个请求。服务器处理完请求,并收到客户端的应答。即断开链接。但是却不利于客户端与服务端保持会话链接。
- 无状态:对于事务处理没有记忆,后续需要处理前面的信息需要重新传递。
状态码
- 204 (无内容) 服务器成功处理了请求,但没有返回任何内容
- 301 (永久移动) 请求的网页已永久移动到新位置。
- 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
- 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
- 400 (错误请求) 服务器不理解请求的语法(一般为参数错误)。
- 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
- 403 (禁止) 服务器拒绝请求。(一般为客户端的用户权限不够)
- 404 (未找到) 服务器找不到请求的网页,可能是URL有错误
- 500 服务器内部发生了不可预期的错误
- 503 服务器不能处理客户端的请求,一端时间后恢复使用
http的缺点
- 请求信息明文传输,信息容易窃取
- 数据的完整性未检验,容易篡改
- 没有验证对方身份,存在冒充风险
http协议应用场景
http cookie
http 协议是无状态的,这意味着同一个tcp链接中,先后发起的请求之间没有任何的联系,这就造成了用户在同一网站中进行连续的操作,服务端无法知道这些操作来自于哪里。
使用http cookie 可以解决好这个问题,当服务端将http响应返回给客户端的时候,通过响应头里面添加set-cookie 信息,浏览器收到带set-cookie信息的响应后将cookie保存,在后面发送给服务端的每个请求汇总都会自动带上cookie信息,服务端通过cookie信息,就能取得客户端的数据信息。
由于cookie信息是被浏览器识别并自动保存的,在默认情况下,浏览器关闭之后就会被销毁。但我们可以通过指定过期时间,或者有效期,让cookie获取更长久的有效期。
需要注意的是。某个站点设置了cookie之后,所有符合条件(有效期,域名,路径,适用站点等)的请求都会被自动带上cookie,这又带来了一个安全隐患,服务端只知道请求来自于某个用户的浏览器,却并不知道请求本身是否是用户自己自愿发出的。
利用这一漏洞,攻击者可以通过一些技术手段(图片地址,超链接)等 欺骗用户浏览器访问曾经认证过的网站,并利用用户的登录进行一些操作,可能导致用户在不知情的时候发送一些消息,带来严重的影响。这便是我们常说的web安全问题之一,跨站请求伪造。
防范跨站请求伪造的有效工具就是避免浏览器自动带上Cookie信息。我们可以用其他的方式校验用户的登陆态,比如将用户的登录信息保存在浏览器的缓存中,在发送请求的时候添加用于标识用户身份的参数值,现在大多数应用也是使用Token来进行用户标识的。
Http 缓存
缓存常常被用来作为性能优化的技术方案之一,通过缓存我们可以 有效的减少资源获取的耗时,减少用户等待的时常,从而提高用户体验。
我们可以通过HTTP协议,设置浏览器对HTTP响应资源的缓存,使用浏览器缓存后,当我们在发起请求时,如果浏览器中发现请求的资源已经被存储,他会拦截请求并返回该资源的副本。不需要再去服务器端请求资源,因此减少了HTTP请求的耗时,同时也能有效地缓解服务器的压力。
一般来说,HTTP缓存只能存储GET请求的响应内容,对于这些响应内容可能还会存在两种情况。 1、不缓存内容:每次请求的时候都会从服务器端获取最新的内容 2、设置了缓存,则在有效期内会从缓存中获取。如果用户刷新或者内容过去则会去服务器端获取最新的内容。
缓存分为强制缓存和协商缓存。
1、强制缓存,是在规定的有效期内直接使用缓存。可以通过以下方式设置强制缓存。
- 服务端通过设置Expires 和Cache-Control 和客户端约定缓存内容的有效时间。
- 如符合缓存条件,浏览器响应HTTP 200 (from cache) 2、协商缓存,与服务器协商是否使用缓存。
- 服务端设置 If-Modified-Since 和 If-None-Match 和客户端约定标识协商缓存的值。
- 当有效期过后,浏览器将缓存中的Etag 和 Last-Modified 信息,分别使用 If-None-Match 和 If-Modified-Since 请求头设置,提交给服务器。
- 若符合缓存条件,服务器则响应HTTP 304,浏览器从缓存中读取数据。
若是以上缓存条件均不符合,服务器则相应200,返回更新后的数据,同时通过响应头更新HTTP缓存设置。整个过程的可以用下面的流程图表示
浏览器会在第一次请求完服务器后得到响应,通过适当的设置响应头信息。我们可以使用更多的缓存资源,从而提高网站的响应速度和性能,从而给用户更好的体验。