目录
http介绍
Hypertext Transfer Protocol (HTTP)是一个无状态的应用级协议。无状态意味着可以独立理解每一个请求消息,为了重用代理的连接或者在多个服务器间进行动态负载均衡请求。因此,除非连接是安全的并且特定于该代理,否则服务器不得假定同一连接上的两个请求来自同一用户代理。
尽管HTTP独立于传输协议,但是“ http”方案特定于基于TCP的服务,因为名称委派过程依赖于TCP来建立授权。
消息格式
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
1. start-line
用来区分消息是请求还是相应,即
start-line = request-line / status-line
request-line
格式为
request-line = method SP request-target SP HTTP-version CRL
注:SP代表空格
method(RFC 7231 4.1)有:
GET
POST
POST方法要求目标资源根据资源自身的特定语义来处理请求中包含的表示形式。
HEAD
与GET相似,除了服务器必须在响应中不发送message body。
此方法可用于获取有关所选表示形式的元数据,而无需传输表示形式数据,通常用于测试超文本链接的有效性,可访问性和最新修改。
status-line
status-line = HTTP-version SP status-code SP reason-phrase CR
reason-phrase
存在reason-phrase的唯一目的是提供与数字状态码关联的文本描述,这主要是出于对交互式文本客户端更频繁使用的早期Internet应用程序协议的尊重。客户应该忽略reason-phrase的内容。
2. header-field
header-field = field-name ":" OWS field-value OWS
注:OWP为Optional WhiteSpace
字段顺序(RFC 7230 3.2.2)
header字段顺序没有要求。建议将包含控制数据的字段放前面,如请求中的Host、响应中的Date,以便implementation尽早决定何时不处理消息。
收到完整header部分后服务器端才可以运用该http请求。以免后面的header字段中有条件、身份凭证、故意误导的重复header字段,而影响请求处理。
3. message-body
请求消息体:
header中的Content-Length和Transfer-Encoding用来标记消息体。请求message与method无关,无论method没有定义使用message body。
响应消息体:
除了特殊响应没有消息体,其他响应都有。
连接管理
管道通信
支持持久化连接的客户端可能对它的请求进行管道通信,例如发送多个请求而不用等待每个请求的响应。服务端可能会并行处理一系列管道来的请求(服务端应该能对请求的处理幂等,解决高并发带来的线程安全问题)。
并发
客户端请求连接,服务端维护连接。
HTTPS
基于TLS和TCP建立授权。
header中的Cookie和Set-Cookie字段被服务器用来在客户端(user agent)存储状态(cookie)。
Cookie
语法:
cookie-header = "Cookie:" OWS cookie-string OWS
cookie-string = cookie-pair *( ";" SP cookie-pair