在嵌入式系统中,经常使用TCP来模拟一个简易的HTTP Server,所以手动解析和填充HTTP包是常有的事儿。
在这里记录一下,一个简单的HTTP请求/应答报文是怎么样的。
客户端请求消息(Requst)
请求消息由以下4个部分组成:
- 请求行
- 报头
- 分割行
- 请求数据
其语法如下:
1 | <method> <request-URL> <version> |
示例:
1 | POST /get_username.cgi |
在实际收到的报文中,所有的换行都以\r\n
表示。
服务器响应消息(Response)
响应消息由以下4个部分组成:
- 状态行
- 报头
- 分割行
- 响应数据
其语法如下:
1 | <version> <status-code> <reason-phrase> |
示例:
1 | 200 OK |
version
目前的HTTP存在以下几个版本,点击链接可以跳转到各个协议版本的RFC说明:
method
HTTP/1.0:
- GET —— GET方法指定URI获取对应资源,GET 请求一般(标准)不包含主体。
- HEAD —— HEAD方法与GET相同,但服务器的返回不能包含任何实体。该方法通常用于测试超文本链接的有效性、可访问性和最近的修改。
- POST —— POST方法用于请求目标服务器接受请求中包含的实体。
HTTP/1.1:
- OPTIONS —— OPTIONS方法表示对请求URI标识的请求/响应链上可用的通信选项的请求。
- GET
- HEAD
- POST
- PUT —— PUT方法要求将所附实体存储在提供的请求URI下。
- DELETE —— DELETE方法请求源服务器删除由请求URI标识的资源。
- TRACE ——TRACE方法允许客户端查看在请求链的另一端收到的内容,并将该数据用于测试或诊断信息。TRACE请求不得包含实体。
- CONNECT —— CONNECT方法可以动态切换为隧道的代理使用(例如SSL隧道)。
headers
HTTP/1.0 Request Header Fields:
HTTP/1.0 Response Header Fields:
HTTP/1.0 Entity Header Fields:
HTTP/1.1 Request Header Fields:
- 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
HTTP/1.1 Response Header Fields:
HTTP/1.1 Entity Header Fields:
- Allow
- Content-Encoding
- Content-Language
- Content-Length
- Content-Location
- Content-MD5
- Content-Range
- Content-Type
- Expires
- Last-Modified