HTTP的前世今生

184 阅读8分钟

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协议的特点

  1. http协议支持客户端/服务端模式,也是一种请求响应模式的协议。
  2. 简单快速:客户向服务器请求服务的时候,只需要传送请求方法和路径,请求方法常用的有GET,HEAD,POST
  3. 灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。
  4. 无连接:限制每次连接只处理一个请求。服务器处理完请求,并收到客户端的应答。即断开链接。但是却不利于客户端与服务端保持会话链接。
  5. 无状态:对于事务处理没有记忆,后续需要处理前面的信息需要重新传递。

状态码

  1. 204 (无内容) 服务器成功处理了请求,但没有返回任何内容
  2. 301 (永久移动) 请求的网页已永久移动到新位置。
  3. 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  4. 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
  5. 400 (错误请求) 服务器不理解请求的语法(一般为参数错误)。
  6. 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  7. 403 (禁止) 服务器拒绝请求。(一般为客户端的用户权限不够)
  8. 404 (未找到) 服务器找不到请求的网页,可能是URL有错误
  9. 500 服务器内部发生了不可预期的错误
  10. 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缓存设置。整个过程的可以用下面的流程图表示 1642938369004.jpg

浏览器会在第一次请求完服务器后得到响应,通过适当的设置响应头信息。我们可以使用更多的缓存资源,从而提高网站的响应速度和性能,从而给用户更好的体验。