最近做的东西需要更深入地了解Http协议,故死磕了一下RFC2616-HTTP/1.1协议,主要是了解Http Message结构及每部分含义,在此总结一下,并打算写一个模拟发送HTTP请求的工具,明天写完再附上来:>
(注:下面如“(14.1)”表示是在RFC2616第14章第1节有更详细的介绍)
一.Http Message结构
了解Http Message先看下图:
Http Message包含3个部分:
(1).请求行/状态行
(2).消息头(Message Header),分为4类:常规头,请求头,响应头和实体头,下面会详细介绍,一个Message里可以有多个消息头。
(3).消息体(Message Body),这个是可选的。
二.Http Message分两类:
1.请求消息(Request Message)
Request Message结构如下:
(1).请求行(Request-Line)结构(5.1):
Http方法(Http Method):主要有8类:GET,POST......下面会介绍。
Request-URI:请求操作的资源。
Http-Version:Http的版本,如:Http/1.0,Http/1.1
(2).消息头:
请求消息(Request Message)不应包含响应头。
2.响应消息(Response Message)
Response Message结构如下:
(1).状态行(Status-Line)结构:
Http-Version:Http的版本,如:Http/1.0,Http/1.1
Status-Code(状态码):状态码是一个三位数字,我对状态码的理解是:对请求(request)做出响应的类型/结果。
状态码第一位数字定义了响应类型,这里分为5种:
-1XX:Informational,请求接收到了,正在进一步的处理中(Request received, continuing process)。
-2XX:Success,表示用户请求被正确接收(The action was successfully received,understood, and accepted),这里典型的是:200 OK
-3XX:Redirection,表示请求没有成功,客户必须采取进一步的动作 (Further action must be taken in order to complete the request.)
-4XX:Client Error,表示客户端提交的请求有错误(The request contains bad syntax or cannot be fulfilled),典型的有:404 Not Found
-5XX:Server Error,表示服务器不能完成对请求的处理 (The server failed to fulfill an apparently valid request),典型的是:503 Service Unavailable
(注:详细的状态码会在文章的最后列出)
(2).消息头:
响应消息(Response Message)不应包含请求头。
三.Http消息头包括4类:
Http消息头(Message Header),主要是带上一些处理HTTP消息所需的辅助信息。
Http消息头结构如下:
1.Field-Name:下面提到的,如:Cache-Control,Date...等,这些就是Field-Name,在RFC文档中Field-Name的数量是有限的,只有43个,而你自己可以增加自定义的Field-Name,但由于浏览器是按照RFC规范实施的(当然它们也有它们自定义的消息头),所以除非是自己实现服务器和客户端,否则,自定义的Field-Name一般没用。
2.Field-Vlaue:根据Field-Name的不同,会有不同的Field-Value