网络基础 HTTP协议之HTTP消息(HTTP Message)

HTTP协议之HTTP消息(HTTP Message)

by:授客 QQ1033553122

1.   消息类型(Message Type)

HTTP messages包含从客户端到服务器的请求和服务器到客户端的响应

HTTP-message   = Request | Response;

RequestResponse都采用通用消息格式来传输实体

两种类型都包含一起始行(start-line)0或更多个header, 一暗示header域结束的空行,可能还有一个消息主体

generic-message = start-line

                     message-header

空行

                    [ message-body ]

1)起始行(start-line)

start-line= Request-Line | Status-Line

 

2)消息头(Message Headers

HTTP(HTTP header), 包含通用头(general-header),请求头(request-header, 响应头(response-header)和实体头(entity-header

消息头书写形式

message-header = field-name : [ field-value ]

header域名(field-name)大小写敏感

 

通用头域(General Header Fields

通用头域为请求和响应消息都可使用,传输实体不能使用的头域

general-header = Cache-Control

           | Connection

                   | Date     

                   | Pragma   

                   | Trailer                 

                   | Transfer-Encoding      

                   | Upgrade   

                   | Via       

                   | Warning   

 

不被识别的头域被视为实体头域

 

3)消息主体(Message Body)

消息主体(如果有的话)用于运送与请求或响应相关的实体主体(entity-body)

格式

message-body = entity-body

                    |

也就是说,仅在通过传输编码对进行编码后的实体主体才与消息主体不同,否则消息主体和实体主体是相同的。

 

4)消息长度(Message Length)

消息长度指的是消息主体的长度;

 

2.   请求(Request)

1)格式

Request = Request-Line

           general-header | request-header | entity-header

空行

[ message-body ]

如图,访问http://ishouke.sohu.blog.com网址,发送的请求

 




2)请求行(Request-Line)

Request-Line   = Method Request-URI HTTP-Version

说明:

1)  Method

Method  = OPTION | GET | HEAD| POST | PUT | DELETE | TRACE |CONNECT

OPTION--请求一些选项的信息

GET--请求由Request-URI所标识的信息

HEADE--请求读取由URL所标识的信息的首部

POST--给服务器添加信息(例如,注释)

PUT--在指明的URI下存储一个文档

DELETE--删除指明的URL所标志的资源

TRACE--用来进行回环测试的请求报文

CONNECT--用于代理服务器

(方法的说明待补充)

 

3)Request-URI

统一资源标识符(Uniform Resource Identifier),标识了方法所请求的资源。

Request-URI = "*" | absoluteURI | abs_path | authority

*:代表不是请求特定资源,而是请求服务器本身,仅当method不是应用于资源时才可用.例如

OPTIONS * HTTP/1.1

说明:

absoluteURI:当向代理服务器发起请求时,必须使用绝对URI(absoluteURI)。代理服务器转发请求或通过有效缓存读取并返回响应。注意,代理服务器可能会把请求转发给另一个代理服务器或直接转发给由绝对URI指定的服务器。

为了避免循环请求,代理必须能识别所有服务器名字,包扩任意别名,本地变量和ip地址

 

请求行(Request-Line)的另一个例子:

 

 

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

 

abs_path:绝对路径

authority:仅用于CONNECT方法

 

Request-URI最常见的形式为用于标识一个在原始服务器或网关上的资源.在这种情况下,Request-URI必须使用绝对URI,并且URI的网络地址必须包含在HOST header域中被发送

例如,客户端想直接从原始服务器接收上述资源TheProject.html,将创建一个通往主机“www.w3.org”80端口的TCP连接,并发送以下请求行

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

行后接请求的剩余部分。


注意:绝对路径不能为空,如果URI中啥都没给,必须以“/”(服务器根目录)的形式给出。

代理服务器在转发请求时,不能重写从Request-URI中接收的绝对路径“abs_path”

 

4)请求头域(Request Header Fields)

Request Header Fields允许客户端传递额外关于请求和客户端自身的信息给服务器

request-header = Accept

          | Accept-Charset

                  | Accept-Encoding        

                  | Accept-Language     

                  | Authorization    

                  | Expect           

                  | From         

                  | Host              

                  | If-Match         

                  | If-Modified-Since   

                  | If-None-Match     

                  | If-Range            

                  | If-Unmodified-Since

                  | Max-Forwards        

                  | Proxy-Authorization  

                  | Range              

                  | Referer            

                  | TE                

                  | User-Agent    

 

3.   响应(Response)

1)格式

Response= Status-Line

general-header | response-header  | entity-header

空行

[ message-body ]    

 

如图,访问http://ishouke.sohu.blog.com网址,发送请求后接收到的响应

 




2)状态行(Status-Line)

Status-Line = HTTP-Version Status-Code Reason-Phrase

说明:

1Status-CodeReason-Phrase

Status-Code3个数字的整数

Reason-Phrase:对Status-Code简短的文本描述

 

Status-Code的第一个数字定义了响应的类型:

1xx: 通知信息的 - 请求收到,继续处理

2xx: 成功- 操作被成功,理解和接受

3xx: 重定向 - 为了完成请求采取进一步的操作

4xx: 客户端错误- 请求包含无法实现或者包含语法错误

5xx: 服务器错误 - 服务器无法完成合法的请求

Status-Code    =

            "100"  ; Continue

          | "101"  ; Switching Protocols

          | "200"  ; OK

          | "201"  ; Created

          | "202"  ; Accepted

          | "203"  ; Non-Authoritative Information

          | "204"  ; No Content

          | "205"  ; Reset Content

          | "206"  ; Partial Content

          | "300"  ; Multiple Choices

          | "301"  ; Moved Permanently

          | "302"  ; Found

          | "303"  ; See Other

          | "304"  ; Not Modified

          | "305"  ; Use Proxy

          | "307"  ; Temporary Redirect

          | "400"  ; Bad Request

          | "401"  ; Unauthorized

          | "402"  ; Payment Required

          | "403"  ; Forbidden

          | "404"  ; Not Found

          | "405"  ; Method Not Allowed

          | "406"  ; Not Acceptable

          | "407"  ; Proxy Authentication Required

          | "408"  ; Request Time-out

          | "409"  ; Conflict

          | "410"  ; Gone

          | "411"  ; Length Required

          | "412"  ; Precondition Failed

          | "413"  ; Request Entity Too Large

          | "414"  ; Request-URI Too Large

          | "415"  ; Unsupported Media Type

          | "416"  ; Requested range not satisfiable

          | "417"  ; Expectation Failed

          | "500"  ; Internal Server Error

          | "501"  ; Not Implemented

          | "502"  ; Bad Gateway

          | "503"  ; Service Unavailable

          | "504"  ; Gateway Time-out

          | "505"  ; HTTP Version not supported

          | extension-code

extension-code = 3DIGIT

Reason-Phrase  = *

 

3)响应头域(Response Header Fields

response-header fields允许服务器传递不能放在状态行(Status-Line)的关于响应的额外信息.这些头域给出了关于服务器和更多关于进一步获得由Request-URI标识的资源

response-header = Accept-Ranges        

                   | Age                  

                   | ETag

                   | Location

                   | Proxy-Authenticate

                   | Retry-After   

                   | Server           

                   | Vary             

                   | WWW-Authenticate   

无法识别的header域可以视为entity-header

 

4.   实体(Entity)

RequestResponse消息如果没有被请求方法或请求状态码限制,可传送一个实体

实体有实体头域(entity-header fields)和实体主体(entity-body),虽然有些response仅包含实体头域entity-header

 

1)实体头域(Entity Header Fields

实体头域定义了关于实体主体的维护信息,或者是关于请求标识的资源,如果没有主体的话.一些维护信息是可选的,一些是必须的.

entity-header  = Allow

                | Content-Encoding       

                | Content-Language       

                | Content-Length          

                | Content-Location        

                | Content-MD5             

                | Content-Range          

                | Content-Type            

                | Expires                 

                | Last-Modified          

 

2)实体主体(Entity Body)

伴随requestresponse发送的entity-body(如果有的话)

entity-body仅在消息主体出现时才出现。

 

转载于:https://www.cnblogs.com/shouke/p/10158006.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值