HTTP是一个无状态的请求、响应协议,通过一个可靠的传输连接来交换信息。一个Http客户端是一个用来和服务端进行连接的程序,主要是用来发送一个或多个http请求;服务端是用来接受请求连接,响应请求并返回结果
URI(Uniform Resource Identifier)统一资源定位符,在http里面用来识别资源,对应的标准文件是[RFC3986]
通用的URI格式定义如下
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
其中scheme和path是必须的,尽管path可能为空。当authority存在时,path必须为空或者以/开头。当authority不存在时,path不能为//开关
scheme = ALPHA *( ALPHA / DIGIT / “+” / “-” / “.” )
authority = [ userinfo “@” ] host [ “:” port ]
path = path-abempty ; begins with "/" or is empty / path-absolute ; begins with "/" but not "//" / path-noscheme ; begins with a non-colon segment / path-rootless ; begins with a segment / path-empty ; zero characters
query = *( pchar / “/” / “?” )
fragment = *( pchar / “/” / “?” )
下面是一个具体的实例
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
所有HTTP/1.1 消息由一个起始行+0或多个head字段+空行+可选的消息body
HTTP 消息格式如下
HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body ]
起始行分2类:请求行和状态行
一个请求行由3部分组成
这3个部分使用空格(space)来,最后用CRLF换行表示结束。
格式如下:
request-line = method SP request-target SP HTTP-version CRLF
示例:
一个状态行(表示服务器响应ruddy)由3部分组成
和请求行类似,这3个部分使用空格(space)来,最后用CRLF换行表示结束。
格式如下:
status-line = HTTP-version SP status-code SP reason-phrase CRLF
其中状态值由3位数字组成
status-code = 3DIGIT
头部字段是key-value的形式,Key和value之间用:分隔,最后用CRLF换行表示结束,不区分大小写
头字段非常灵活,除了可以使用标准的host/connection等字段,也可以任意添加自定义头,给http协议提供了扩展可能
字段的顺序是没有意义的,可以任意排列,不影响语义
在一个HTTP/1.1请求中,请求头里面必须包含有host字段,如果没有,就是一个错误的消息。 A client MUST send a Host header field in all HTTP/1.1 request
messages
常见的请求头和响应头如下
消息体是可选的,从前面的定义可以知道,head之后,有一个空行,再然后才是消息body