前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络基础 HTTP协议之HTTP消息(HTTP Message)

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

作者头像
授客
发布2019-09-11 10:03:29
1.5K0
发布2019-09-11 10:03:29
举报
文章被收录于专栏:授客的专栏授客的专栏

1. 消息类型(Message Type)

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

HTTP-message = Request | Response;

Request和Response都采用通用消息格式来传输实体

两种类型都包含一起始行(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

说明:

1)Status-Code和Reason-Phrase

Status-Code:3个数字的整数

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)

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

实体有实体头域(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)

伴随request或response发送的entity-body(如果有的话)

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档