HTTP 协议必会必知

如果大家觉得文章有错误内容,欢迎留言或者私信讨论~

HTTP 的本质

  HTTP 是一种协议,是浏览器与服务器之间通信进行数据传输的规范。作为应用层协议,HTTP 是基于 TCP/IP 协议来传递数据的(HTML文件、突破、查询结果等),HTTP 协议不涉及数据包(Packet)传输,主要规定了客户端与服务器之间的通信格式。

  比如我们现在正在通过浏览器访问哔哩哔哩。浏览器要从远程 HTTP 服务器获取 HTML 文本,那么这个时候浏览器就做了两件事情。

  • 与服务器建立 socket 连接
  • 生成请求数据并通过 Sokcet 发送出去

  第一步比较好理解,浏览器从地址栏获取到目标服务器的地址和端口,去连接服务器,这样就能够通信了。
  重点在于第二步,这个请求数据到底长什么样呢?都请求些什么内容呢?或者换句话说,浏览器需要告诉服务端什么信息呢?

  首先最基本的是,你要让服务端知道你的意图,你是想获取内容还是提交内容;其次你需要告诉服务端你想要哪个内容。那么要把这些信息以一种什么样的格式放到请求里去呢?这就是 HTTP 协议要解决的问题。也就是说,HTTP 协议的本质就是一种浏览器与服务器之间约定好的通信格式。

HTTP 工作原理

  让我们过一遍 HTTP 协议的请求过程
在这里插入图片描述

  1. 用户通过浏览器进行了一个操作,比如在地址栏输入 url 或者点击了一个链接
  2. 浏览器向服务器发起了 TCP 请求
  3. 服务器接受了浏览器的请求,并经过 TCP 三次握手建立了链接
  4. 浏览器将请求数据打包成了一个 HTTP 协议格式的数据包
  5. 浏览器将数据包推入网络,最终送达了服务器
  6. 服务器解析 HTTP 格式的数据包,并且了解了浏览器的意图
  7. 得到客户端的意图进行处理,可能是静态文件或者调用服务端程序获取动态结果
  8. 服务器响应结果按照 HTTP 协议格式打包推入网络,最终送达浏览器
  9. 浏览器拿到数据包后按照 HTTP 协议格式解包、解析数据、展示数据

  那这时候如果服务器端是 Tomcat 又如何呢?在这个过程都做了些什么? **主要是接受连接、解析请求数据、处理请求和发送响应这几个步骤。**这里请你注意,可能有成千上万的浏览器同时请求同一个 HTTP 服务器,因此 Tomcat 和 Jetty 为了提高服务的能力和并发度,往往会将自己要做的几个事情并行化,具体来说就是使用多线程的技术,这是之后学习的一个重点。

HTTP 请求响应实例

  你有没有注意到,服务器与浏览器之间的通信通常都需要将“意图”与数据打包成 HTTP 协议格式的,那 HTTP 协议的数据包具体长什么样呢?看下图:
在这里插入图片描述

  可以看到 HTTP 请求是由 请求行、请求报头、请求正文 三部分构成的,当这个 HTTP 请求数据达到 Tomcat 后,Tomcat 会把 Request 请求数据字节流解析成为一个 Request 对象,这个 Request 对象封装了 HTTP 所有的请求信息。接着 Tomcat 把这个 Request 对象交给 Web 应用去处理,处理完后得到一个 Response 对象,Tomcat 会把这个 Response 对象转成 HTTP 格式的响应数据并发送给浏览器。

  我们再来看看 HTTP 响应的格式,HTTP 的响应也是由三部分组成,分别是状态行、响应报头、报文主体。同样,我还以极客时间登陆请求的响应为例。
在这里插入图片描述

Cookie 和 Session

  HTTP 协议有一个特点是无状态的,也就是说请求与请求之间是没有关系的,你递交了请求,但 Web 应用不知道你是谁。比如你登陆了某宝购物,在购物车添加了几件物品,但是没有登录,在你一次刷新之后,购物车被清空了,这明显是不对的。因此 HTTP 协议需要一种技术让请求与请求之间建立起联系,并且服务器需要知道这个请求来自哪个用户,于是 Cookie 技术出现了。

1. Cookie 技术

  Cookie 是 HTTP 报文的一个请求头,Web 应用可以将用户的标识信息或者其他一些信息(用户名等)存储在 Cookie 中。用户经过验证之后,每次 HTTP 请求报文中都包含 Cookie,这样服务器读取这个 Cookie 请求头就知道用户是谁了。Cookie 本质上就是一份存储在用户本地的文件,里面包含了每次请求中都需要传递的信息。

  但这样是不安全的。

2. Session

  由于 Cookie 以明文的方式存储在本地,而 Cookie 中往往带有用户信息,这样就造成了非常大的安全隐患。而 Session 的出现解决了这个问题,**Session 可以理解为服务器端开辟的存储空间,里面保存了用户的状态,用户信息以 Session 的形式存储在服务端。**当用户请求到来时,服务端可以把用户的请求和用户的 Session 对应起来。那么 Session 是怎么和请求对应起来的呢?答案是通过 Cookie,浏览器在 Cookie 中填充了一个 Session ID 之类的字段用来标识请求。

  具体工作过程是这样的:服务器在创建 Session 的同时,会为该 Session 生成唯一的 Session ID,当浏览器再次发送请求的时候,会将这个 Session ID 带上,服务器接受到请求之后就会依据 Session ID 找到相应的 Session,找到 Session 后,就可以在 Session 中获取或者添加内容了。而这些内容只会保存在服务器中,发到客户端的只有 Session ID,这样相对安全,也节省了网络流量,因为不需要在 Cookie 中存储大量用户信息。

  Session 会在服务器程序运行的过程中创建,并且 Tomcat 提供了多种方案来持久化 session,通常会采用高性能的存储方式。

猜你喜欢

转载自blog.csdn.net/qq_43654226/article/details/127062232
今日推荐