HTTP是一种很简单的请求、响应式协议,客户端发送一个请求、服务器返回一个响应。HTTP 1.1 版本规范由 RFC2616 定义。

HTTP请求定义:

Request = request-Line              ; 1 请求行,必需
      *(( general-header
        | request-header
        | entity-header ) CRLF)        ; 2 三类请求头部,可选
      CRLF
        [ message-body ]                ; 3 请求数据体,可选

每个请求由请求头部、可选的请求数据体组成,由回车换行分隔

1. 请求头部由请求行、可选的三类实体头部组成, 请求行格式

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

1.1 方法Method可选值:

Method = "OPTIONS"
        | "GET"
        | "HEAD"
        | "POST"
        | "PUT"
        | "DELETE"
        | "TRACE"
        | "CONNECT"
        | extension-method
        extension-method = token

1.2 URL定义

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

1.3 HTTP版本

OPTIONS * HTTP/1.1

2. 实体头部由通用头部类型、请求头部类型、实体头部类型组成;
各节之间也使用回车换行分隔,每一节格式为 [类型名] [冒号] [空格] [类型值] [回车换行], 各类类型取值参考定义指示小节

2.1 通用头部类型

    general-header = Cache-Control
                   | Connection
                   | Date
                   | Pragma
                   | Trailer
                   | Transfer-Encoding

2.2 请求头部类型

    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

2.3 实体头部类型

    entity-header  = Allow
                   | Content-Encoding
                   | Content-Language
                   | Content-Length
                   | Content-Location
                   | Content-MD5
                   | Content-Range
                   | Content-Type
                   | Expires
                   | Last-Modified
                   | extension-header
  extension-header = message-header

3. 请求数据体定义

    message-body = entity-body
            |

HTTP响应定义:

Response      = Status-Line             ; 1 响应行,必需
            *(( general-header
              | response-header
              | entity-header ) CRLF)   ;  2 实体头,可选
              CRLF
              [ message-body ]          ;  3 响应数据体,可选

每个响应由响应头部、可选的响应体组成,由回车换行分隔

1. 响应头部由响应行、可靠的实体头部组成

响应行格式

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

1.1 状态码,主要有5类

1xx: Informational 信息提示 - Request received, continuing process
2xx: Success 成功 - The action was successfully received, understood, and accepted
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
5xx: Server Error 服务端出错 - The server failed to fulfill an apparently valid request

2. 实体头部

2.1 HTTP响应通用头部类型与HTTP请求通用头部类型相同

2.2 响应头部类型

       response-header = Accept-Ranges
                       | Age
                       | ETag
                       | Location
                       | Proxy-Authenticate
                       | Retry-After
                       | Server
                       | Vary
                       | WWW-Authenticate

2.3 HTTP响应实体头部类型与HTTP请求实体头部类型相同

3. 响应消息体

   entity-body  = *OCTET
   entity-body := Content-Encoding( Content-Type( data )

了解了 HTTP请求、响应消息在TCP数据流中的格式,很容易使用 python 纯 socket 模拟HTTP客户端、HTTP服务器发送接收数据。进而更容易使用高级模块 httplib,httplib2 编写功能更强的脚本。

标签: Request,服务器,客户端