Skip to content

HTTP基础知识

常见的HTTP请求方法

  • GET: 向服务器获取数据;

  • POST:将实体提交到指定的资源,通常会造成服务器资源的修改;

  • PUT:上传文件,更新数据;

  • DELETE:删除服务器上的对象;

  • HEAD:获取报文首部,与GET相比,不返回报文主体部分;

  • OPTIONS:询问支持的请求方法,用来跨域请求;

  • CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;

  • TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。

GET 与POST

本质是一样的

Post 和 Get 是 HTTP 请求的两种方法,其区别如下:

  • 应用场景: GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而 Post 不是一个幂等的请求,一般用于对服务器资源会产生影响的情景,比如注册用户这一类的操作。
  • 是否缓存: 因为两者应用场景不同,浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存。
  • 发送的报文格式: Get 请求的报文中实体部分为空,Post 请求的报文中实体部分一般为向服务器发送的数据。
  • 安全性: Get 请求可以将请求的参数放入 url 中向服务器发送,这样的做法相对于 Post 请求来说是不太安全的,因为请求的 url 会被保留在历史记录中。
  • 请求长度: 浏览器由于对 url 长度的限制,所以会影响 get 请求发送数据时的长度。这个限制是浏览器规定的,并不是 RFC 规定的。
  • 参数类型: post 的参数传递支持更多的数据类型。

以上区别都是表面上的区别,事实上GET请求有POST请求都能在body与url上携带数据,本质上只有请求头的报文格式有区别

shell
POST /url HTTP/1.1
GET /url HTTP/1.1
  • 关于安全性:无论是GET请求还是POST请求,其本质都是不安全的,因为HTTP本身就是不安全的, 由于HTTP自己本身是一个明文协议,每个HTTP请求和返回的数据在网络上都是明文传播,无论是urlheader还是body,只要在网络节点捉包,就能获取完整的数据报文,要防止泄密的唯一手段就是使用HTTPS(用SSL协议协商出的密钥加密明文HTTP数据)。

常见的HTTP请求头和响应头

HTTP Request Header 常见的请求头:

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

HTTP Responses Header 常见的响应头:

  • Date:表示消息发送的时间,时间的描述格式由rfc822定义
  • server:服务器名称(nginx)
  • Connection:浏览器与服务器之间连接的类型
  • Cache-Control:控制HTTP缓存
  • content-type:表示后面的文档属于什么MIME类型

常见的 Content-Type 属性值有以下四种:

  1. application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。该种方式提交的数据放在 body 里面,数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL转码。

  2. multipart/form-data:该种方式也是一个常见的 POST 提交方式,通常表单上传文件时使用该种方式。

  3. application/json:服务器消息主体是序列化后的 JSON 字符串。

  4. text/xml:该种方式主要用来提交 XML 格式的数据。

OPTIONS请求方法及使用场景

OPTIONS是除了GET和POST之外的其中一种 HTTP请求方法。

OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。该请求方法的响应不能缓存。

OPTIONS请求方法的主要用途有两个:

  • 获取服务器支持的所有HTTP请求方法;
  • 用来检查访问权限。例如:在进行 CORS 跨域资源共享时,对于复杂请求,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限。

对keep-alive的理解

HTTP keep-alive或HTTP连接复用

在HTTP协议中,Keep-Alive是一种持久连接(persistent connection)的机制,也称为HTTP keep-alive或HTTP连接复用。它允许在单个TCP连接上发送多个HTTP请求和响应,而不是每个请求都建立和关闭一个独立的TCP连接。通过使用Keep-Alive,可以减少因建立和关闭连接所产生的开销,提高网络性能和效率。

以下是对HTTP Keep-Alive的一些理解:

  1. 连接复用:使用Keep-Alive机制,客户端和服务器之间的TCP连接可以在发送和接收HTTP请求/响应后保持打开状态。这样,下一个请求可以重复使用现有的连接,避免了重新建立TCP连接的开销。
  2. 节省开销:建立和关闭TCP连接都会消耗计算资源和时间。通过复用连接,可以减少建立和关闭连接的次数,从而减少了网络开销,提高了性能。
  3. 并发请求:使用Keep-Alive,可以在同一连接上并发发送多个请求。在传统的非持久连接中,每个请求都需要等待连接建立和关闭,导致串行化的请求处理。而在Keep-Alive连接中,多个请求可以同时发送和处理,提高了并发性能。
  4. 超时和限制:Keep-Alive连接并不会一直保持打开状态,而是有一定的超时时间。在超过超时时间或达到连接数限制时,连接会自动关闭,需要重新建立。超时时间和连接数限制可以在服务器端进行配置。

需要注意的是,HTTP Keep-Alive并非持久连接的永久保持,它是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以根据服务器的设置进行调整。同时,客户端和服务器都需要支持Keep-Alive机制才能正常使用。

Keep-Alive是HTTP/1.1协议中的默认行为,它在一定程度上解决了HTTP/1.0中每个请求都需要建立和关闭连接的问题。而在HTTP/2协议中,持久连接是默认启用的,无需显式启用Keep-Alive。HTTP/2通过多路复用(Multiplexing)机制,允许多个请求在同一连接上并行传输,提供了更好的性能和效率。

Keep-Alive的建立过程

  1. 客户端发起请求:客户端(例如浏览器)向服务器发送HTTP请求。请求中可以包含Connection: keep-alive头部字段,用于告知服务器希望建立一个持久连接。
  2. 服务器响应:服务器接收到请求后,可以选择是否支持Keep-Alive。如果服务器支持Keep-Alive,并且响应中包含Connection: keep-alive头部字段,表示服务器同意建立持久连接。
  3. 连接保持打开:如果服务器同意建立持久连接,那么服务器在响应完成后不会立即关闭连接,而是保持连接打开状态。此时,客户端可以继续在同一连接上发送其他请求。
  4. 继续通信:客户端可以继续发送其他请求到服务器,这些请求可以使用相同的TCP连接。每个请求都按顺序发送,并在服务器端依次处理。
  5. 关闭连接:一般情况下,持久连接在一定的时间范围内保持打开,直到超过服务器设定的超时时间或达到连接数限制。一旦超过超时时间或连接数限制,服务器可以选择关闭连接,或者在响应中发送Connection: close头部字段来指示客户端关闭连接。

需要注意的是,Keep-Alive并不是持久连接的永久保持,而是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以在服务器端进行配置。客户端和服务器都需要支持Keep-Alive机制才能建立和使用持久连接。

在HTTP/1.1中,Keep-Alive是默认启用的,并且可以在请求头部中使用Connection: keep-alive字段来显式启用Keep-Alive。而在HTTP/2中,持久连接是默认启用的,无需显式启用Keep-Alive,并通过多路复用(Multiplexing)机制实现更高效的请求处理。

Keep-Alive的断开情况

  1. 客户端主动关闭连接:客户端可以通过发送一个带有Connection: close头部字段的请求,来告知服务器关闭连接。服务器在接收到这样的请求后会关闭连接,断开与客户端的持久连接。
  2. 服务器主动关闭连接:服务器可以在任何时候选择关闭持久连接,例如在超过预设的超时时间后,或达到服务器设定的连接数限制时。服务器会发送一个带有Connection: close头部字段的响应,告知客户端关闭连接。
  3. 连接超时:服务器可以设置持久连接的超时时间,如果在一定时间内没有新的请求到达服务器,服务器会关闭连接。这样可以避免连接资源被长时间占用。
  4. 网络中断或故障:如果在持久连接期间发生了网络中断或故障,连接可能会自动断开。例如,当客户端或服务器无法访问对方或网络连接中断时,持久连接可能会被终止。
  5. 非法的响应或错误处理:如果在持久连接中出现错误的响应或处理过程中发生异常,服务器或客户端可能会选择关闭连接,以确保连接的正确性和稳定性。

需要注意的是,Keep-Alive并不是持久连接的永久保持,而是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以在服务器端进行配置。当连接断开时,客户端和服务器可以根据需要重新建立连接,或在下次请求时创建新的连接。

前端知识体系 · wcrane