Author: Xu FC
HTTP 版本
HTTP (Hypertext Transfer Protocol, 超文本传输协议) 是常见的应用层传输协议。该协议有诸多版本,目前应用最广泛的为 HTTP/1.1 版本。
-
HTTP/0.9 和 HTTP/1.0版本,目前已很少应用,除非研究 HTTP协议发展历史,不建议多做研究。
-
HTTP/1.1:https://tools.ietf.org/html/rfc7230
HTTP/1.1 报文结构
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
-
行结束符: CRLF,或者单独的 CR,或者单独的 LF,每个报文中的分隔符需要一致,不能在同一报文中混合使用。
-
HTTP header-field 与 message-body 之间以空行分割。
-
Partial Content 的 body part 之间以空行分割。
-
HTTP/1.1 请求示例
HTTP/1.1 请求示例 -
Start-line: 红框部分为请求行,其中包括
- Request method(红字部分)
- URL(绿字部分)
- HTTP 版本(橘字部分)
-
Header-field:绿框部分为请求头部域,其中
- Header name(棕色部分)
- Header value(蓝色部分)
- Header name 与 header value 以冒号(:)分隔
- 一个 header 多个值,各值之间以逗号(,)分隔
- Header value 中的 值 与 属性 之间以分号(;)分隔
- Cookie header 中的各个 cookie 以逗号或分号(,|;)分隔
-
Message-body:黄框部分为请求主体,并不是所有请求都带 message-body, 比如 HEAD 等请求不带 body,POST 等请求带 body。
-
HTTP/1.1 应答
HTTP/1.1 应答示例 -
Start-line: 红框部分为应答行,其中包括
- HTTP 版本(橘字部分)
- 响应状态码(绿字部分): 三位数字
1xx:收到请求,请继续
2xx:收到并完成请求
3xx:重定向
4xx:客户端错误
5xx:服务器错误 - 原因短语(红字部分)
-
Header-field:绿框部分为应答头部域,结构同请求头部域
-
Message-body:黄框部分为请求主体,并不是所有应答都带 message-body, 比如 HEAD 请求的应答不带 body。
HTTP/2 报文结构(待续)
root@67:~# nghttp http://179.1.1.63:8080/ -v
[ 0.000] Connected
[ 0.000] recv SETTINGS frame <length=6, flags=0x00, stream_id=0>
(niv=1)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[ 0.000] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[ 0.000] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.000] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
(dep_stream_id=0, weight=201, exclusive=0)
[ 0.001] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
(dep_stream_id=0, weight=101, exclusive=0)
[ 0.001] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
(dep_stream_id=0, weight=1, exclusive=0)
[ 0.001] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
(dep_stream_id=7, weight=1, exclusive=0)
[ 0.001] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
(dep_stream_id=3, weight=1, exclusive=0)
[ 0.001] send HEADERS frame <length=45, flags=0x25, stream_id=13>
; END_STREAM | END_HEADERS | PRIORITY
(padlen=0, dep_stream_id=11, weight=16, exclusive=0)
; Open new stream
:method: GET
:path: /
:scheme: http
:authority: 179.1.1.63:8080
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/1.27.0-DEV
[ 0.014] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.014] recv (stream_id=13) :status: 404
[ 0.014] recv (stream_id=13) server: nghttpd nghttp2/1.27.0-DEV
[ 0.014] recv (stream_id=13) date: Fri, 23 Mar 2018 17:31:10 GMT
[ 0.014] recv (stream_id=13) content-type: text/html; charset=UTF-8
[ 0.014] recv (stream_id=13) content-length: 151
[ 0.014] recv HEADERS frame <length=71, flags=0x04, stream_id=13>
; END_HEADERS
(padlen=0)
; First response header
<html><head><title>404 Not Found</title></head><body><h1>404 Not Found</h1><hr><address>nghttpd nghttp2/1.27.0-DEV at port 8080</address></body></html>[ 0.014] recv DATA frame <length=151, flags=0x01, stream_id=13>
; END_STREAM
[ 0.015] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
网友评论