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上携带数据,本质上只有请求头的报文格式有区别
shellPOST /url HTTP/1.1 GET /url HTTP/1.1
- 关于安全性:无论是
GET
请求还是POST
请求,其本质都是不安全的,因为HTTP本身就是不安全的, 由于HTTP
自己本身是一个明文协议,每个HTTP
请求和返回的数据在网络上都是明文传播,无论是url
、header
还是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 属性值有以下四种:
application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。该种方式提交的数据放在 body 里面,数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL转码。
multipart/form-data:该种方式也是一个常见的 POST 提交方式,通常表单上传文件时使用该种方式。
application/json:服务器消息主体是序列化后的 JSON 字符串。
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的一些理解:
- 连接复用:使用Keep-Alive机制,客户端和服务器之间的TCP连接可以在发送和接收HTTP请求/响应后保持打开状态。这样,下一个请求可以重复使用现有的连接,避免了重新建立TCP连接的开销。
- 节省开销:建立和关闭TCP连接都会消耗计算资源和时间。通过复用连接,可以减少建立和关闭连接的次数,从而减少了网络开销,提高了性能。
- 并发请求:使用Keep-Alive,可以在同一连接上并发发送多个请求。在传统的非持久连接中,每个请求都需要等待连接建立和关闭,导致串行化的请求处理。而在Keep-Alive连接中,多个请求可以同时发送和处理,提高了并发性能。
- 超时和限制:Keep-Alive连接并不会一直保持打开状态,而是有一定的超时时间。在超过超时时间或达到连接数限制时,连接会自动关闭,需要重新建立。超时时间和连接数限制可以在服务器端进行配置。
需要注意的是,HTTP Keep-Alive并非持久连接的永久保持,它是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以根据服务器的设置进行调整。同时,客户端和服务器都需要支持Keep-Alive机制才能正常使用。
Keep-Alive是HTTP/1.1协议中的默认行为,它在一定程度上解决了HTTP/1.0中每个请求都需要建立和关闭连接的问题。而在HTTP/2协议中,持久连接是默认启用的,无需显式启用Keep-Alive。HTTP/2通过多路复用(Multiplexing)机制,允许多个请求在同一连接上并行传输,提供了更好的性能和效率。
Keep-Alive的建立过程
- 客户端发起请求:客户端(例如浏览器)向服务器发送HTTP请求。请求中可以包含
Connection: keep-alive
头部字段,用于告知服务器希望建立一个持久连接。 - 服务器响应:服务器接收到请求后,可以选择是否支持Keep-Alive。如果服务器支持Keep-Alive,并且响应中包含
Connection: keep-alive
头部字段,表示服务器同意建立持久连接。 - 连接保持打开:如果服务器同意建立持久连接,那么服务器在响应完成后不会立即关闭连接,而是保持连接打开状态。此时,客户端可以继续在同一连接上发送其他请求。
- 继续通信:客户端可以继续发送其他请求到服务器,这些请求可以使用相同的TCP连接。每个请求都按顺序发送,并在服务器端依次处理。
- 关闭连接:一般情况下,持久连接在一定的时间范围内保持打开,直到超过服务器设定的超时时间或达到连接数限制。一旦超过超时时间或连接数限制,服务器可以选择关闭连接,或者在响应中发送
Connection: close
头部字段来指示客户端关闭连接。
需要注意的是,Keep-Alive并不是持久连接的永久保持,而是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以在服务器端进行配置。客户端和服务器都需要支持Keep-Alive机制才能建立和使用持久连接。
在HTTP/1.1中,Keep-Alive是默认启用的,并且可以在请求头部中使用Connection: keep-alive
字段来显式启用Keep-Alive。而在HTTP/2中,持久连接是默认启用的,无需显式启用Keep-Alive,并通过多路复用(Multiplexing)机制实现更高效的请求处理。
Keep-Alive的断开情况
- 客户端主动关闭连接:客户端可以通过发送一个带有
Connection: close
头部字段的请求,来告知服务器关闭连接。服务器在接收到这样的请求后会关闭连接,断开与客户端的持久连接。 - 服务器主动关闭连接:服务器可以在任何时候选择关闭持久连接,例如在超过预设的超时时间后,或达到服务器设定的连接数限制时。服务器会发送一个带有
Connection: close
头部字段的响应,告知客户端关闭连接。 - 连接超时:服务器可以设置持久连接的超时时间,如果在一定时间内没有新的请求到达服务器,服务器会关闭连接。这样可以避免连接资源被长时间占用。
- 网络中断或故障:如果在持久连接期间发生了网络中断或故障,连接可能会自动断开。例如,当客户端或服务器无法访问对方或网络连接中断时,持久连接可能会被终止。
- 非法的响应或错误处理:如果在持久连接中出现错误的响应或处理过程中发生异常,服务器或客户端可能会选择关闭连接,以确保连接的正确性和稳定性。
需要注意的是,Keep-Alive并不是持久连接的永久保持,而是在一定的时间范围内保持打开状态,以便复用连接。超时时间和连接数限制可以在服务器端进行配置。当连接断开时,客户端和服务器可以根据需要重新建立连接,或在下次请求时创建新的连接。