乐趣区

关于java:一条HTTP请求的生命周期一-HTTP11

1 Introduction

https://www.rfc-editor.org/in…

1.1 Purpose

 超文本传输协定(HTTP)是一种为分布式,单干式,多媒体信息系统服务的,面向应用层的协定

容许音讯以相似 MIME 的格局传送
性能缺失:分层代理  缓存  长久化连贯  虚拟主机

建设在 URI(URL URN)之上
申请办法
申请头
Multipurpose Internet Mail Extensions (MIME)

是一种用户代理和网关 / 代理到其余互联网服务器的通用协定。这些网络程序可能由 SMTP [16], NNTP [13], FTP [18], Gopher [2], and WAIS [10] 协定形成 

1.3 Terminology 术语

connection
     A transport layer virtual circuit established between two programs for the purpose of communication.

message
    HTTP 通信根本单元,应用字节序列通过 connection 传输

request
    An HTTP request message
    
response
    An HTTP response message
    
resource
    用 URI 标识网络数据对象和服务,资源能够有多种示意模式 (例如多种语言、数据格式、大小和分辨率)
    
entity
    申请头(metainformation 元信息)+ 申请体,section 7
    
representation 示意
    特定 response status 有多种示意
    
content negotiation 内容协商
    解决申请抉择适当的体现机制。所有响应中实体的示意都是能够协商的(包含谬误响应)section 12
    
variant 变体
    给定任何时候,一个 resource 可能对应一个或多个 representation,每种 representation 都称为 varriant
    varriant 不代表 resource 受制于 content negotiation
    
client
    为发送申请而建设连贯的程序
      
user agent 用户代理
    发动申请的客户端
    
server
    接管连贯返回响应的应用程序。每个程序都能够是 origin server, proxy, gateway, or tunnel, 基于他们每个申请的行为。origin server 源服务器
    The server on which a given resource resides or is to be created.
    特定资源创立或所在的服务器

proxy 代理器
    两头服务器,MUST 同时实现 client sever。为申请提供服务或转发(可能会转换)到其余服务器。transparent proxy:通明服务器,不批改申请和响应,用户验证和辨认除外
    non-transparent proxy:非通明服务器,批改申请和响应。为 user agent 增加一个服务,比方 group annotation services, media type transformation, protocol reduction, or anonymity filtering。除非明确申明了通明、非通明,否则 HTTP proxy requirements 同时反对这两种模式
    
gateway 网关
    网关对申请方来说就像源服务器一样

tunnel
    申请的两端敞开,隧道也不复存在

first-head
    响应间接来自 origin server,没通过 proxy。upstream/downstream 上游 上游
    Upstream and downstream 形容信息流,所有信息都是从上游流向上游。此处的信息是指申请 + 响应码?inbound/outbound
    inbound:向 origin server 挪动
    outbound:向 user agent 挪动 

1.4 Overall Operation

HTTP protocol 是 request/response 协定. 

客户端通过一条与服务端的连贯发送申请,服务端解决申请后返回响应

申请格局:request method, URI, protocol version
MIME-like message containing reques modifiers, client information, possible body content

响应格局:status line:message's protocol version, success or error code
MIME-like message containing server information, entity metainformation, possible entity-body content.

HTTP 与 MIME 的关系位于附录 19.4.

---------------------------- demo 1 ----------------------------

 connection (v)    user agent (UA)    origin server (O).

          request chain ------------------------>
       UA -------------------v------------------- O
          <----------------------- response chain


---------------------------- demo 2 ----------------------------

当 request/response chain 中存在 intermediaries 时,状况会变简单。有三种常见 intermediaries:proxy, gateway, and tunnel.
proxy:转发代理,承受相对模式的 uri 申请,重写 message,从新格式化 request 而后转发
gateway:必要时转换申请的协定。tunnel:不改写音讯,通过 intermediary(例如 firewall),或者 intermediary 无奈了解音讯时能够应用 tunnel

          request chain -------------------------------------->
       UA -----v----- A -----v----- B -----v----- C -----v----- O
          <------------------------------------- response chain

上图显示了 user agent/origin server 之间的三个中介体 (A、B 和 C),须要四个独立的连贯。这个区别很重要,某些 HTTP 通信选项别离实用于邻近节点,非隧道的邻近节点,调用链的终端,任意节点。---------------------------- demo 3 | 缓存 ----------------------------

          request chain ---------->
       UA -----v----- A -----v----- B - - - - - - C - - - - - - O
          <--------- response chain

    省略对于缓存的一千字 ......

---------------------------- ---------------------------- ----------------------------

HTTP 通信通常应用 TCP/IP connections,默认端口 TCP 80。能够应用任意 Internet 或其余协定。HTTP 假如传输是牢靠的,任意牢靠传输的协定都能够应用; HTTP1.1 申请、响应的构造到 transport data units 的映射不在本标准范畴内。HTTP1.1 连贯可复用,只管可能因各种起因敞开(see section 8.1)

2 Notational Conventions and Generic Grammar 符号习惯和个别语法

2.1 Augmented BNF 增强型 Backus-Naur Form

 本文规定的所有机制都能够用两种形式形容:散文体(prose)和相似于 RFC 822 的裁减 Backus-Naur Form(BNF)name = definition
name 代表规定的名称(不能包含 '<' '>' 字符),应用 = 将名称和定义离开,空白是定义的分隔符。根本规定用大写,例如  SP, LWS, HT, CRLF, DIGIT, ALPHA
'<' '>' 能够蕴含在定义中,用于标识规定名。literal(字面量)文本需加 '', 不辨别大小写

rule1 | rule2    rule1 或 rule2
(rule1 rule2)    () 包起来的元素视为繁多元素
*rule            反复
    * 示意 0~inf 
    <n>*<m> 示意 n 到 m 次
[rule]            [foo bar] == *1(foo bar)
N rule            <n>(element) == <n>*<n>(element)
#rule            相似于 *,将元素用 (",") 以及 (LWS) 隔开
    1#element == (*LWS element *( *LWS "," *LWS element))
    容许呈现 (element), , (element)
;                正文
implied *LWS     元素之间须要一个分隔符 

2.2 Basic Rules

US-ASCII(美国信息替换规范码)编码字符集是由 ANSI X3.4-1986 定义

OCTET          = <any 8-bit sequence of data>
CHAR           = <any US-ASCII character (octets 0 - 127)>
UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
LOALPHA        = <any US-ASCII lowercase letter "a".."z">
ALPHA          = UPALPHA | LOALPHA
DIGIT          = <any US-ASCII digit "0".."9">
CTL            = <any US-ASCII control character
                        (octets 0 - 31) and DEL (127)>
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>
<">            = <US-ASCII double-quote mark (34)>

CRLF           = CR LF
    HTTP/1.1 将 CR LF 定义为行尾标记
LWS            = [CRLF] 1*(SP | HT)与 SP 具备雷同的语义
TEXT          = <any OCTET except CTLs, but including LWS>
HEX              = "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | 
                <"> |"/"|"["|"]"|"?"|"="|"{"|"}" | SP | HT
--------------- 正文相干 ---------------
comment        = "(" *( ctext | quoted-pair | comment) ")"
ctext          = <any TEXT excluding "(" and ")">
quoted-string  = (<"> *(qdtext | quoted-pair) <"> )
qdtext         = <any TEXT except <">>

quoted-pair    = "\" CHAR

3 Protocol Parameters 协定参数

3.1 HTTP Version

 格局 <major>.<minor>
HTTP-Version   = "HTTP" "/" 1*DIGIT "." 1*DIGIT
HTTP/1.0  HTTP/1.1

网关 / 代理若收到高版本的音讯,MUST 升高申请的版本、报错、切换到 tunnel

不同版本之间,申请头会有肯定兼容性问题 

3.2 Uniform Resource Identifiers

URIs 别名:WWW addresses, Universal Document Identifiers, Universal Resource Identifiers, URL, URN
对 HTTP 来说 URL 仅仅是格式化的字符串 

3.2.2 http URL

http_URL = "http:" "//" host [":" port] [abs_path [ "?" query]]
port default 80
防止应用 IP 代替 host

3.2.3 URI Comparison

 一个一个字节比拟,并辨别大小写
非凡状况
- 端口有默认值,(见 RFC 2396)里的默认端口
- host 不分大小写
- scheme 不分大小写
- abs_path 为空等同与 "/"

除了 "保留(reserved)" 和 "不平安(unsafe)" 字符集里的字符(参见 RFC 2396)其余字符等效于他们的 "%HEXHEX" 编码

      http://abc.com:80/~smith/home.html
      http://ABC.com/%7Esmith/home.html
      http://ABC.com:/%7esmith/home.html

3.3 Date/Time Formats

3.4 Character Sets

charset = token
charset 最好合乎 IETF Policy on Character Sets and Languages(https://www.rfc-editor.org/rfc/rfc2277) 的要求

----------------- demo -----------------
Content-Type: text/plain; charset=UTF-8

3.4.1 被疏忽的字符集

 有些 HTTP 1.0 不能解决在 Content-Type 头域里明确指定的字符集参数(entity body,译注:这里翻译成“实体主体”因为 Content-Type 头是实体头,音讯头能够分为实体头,罕用头,申请头,响应头,在译文中屡次用到“头”和“头域”,如音讯头,音讯头域,其实是同一个意思,HTTP1.1 协定有时候概念并不是齐全对立的)

3.5 内容编码(Content Codings)

content-coding   = token
gzip compress Welch deflate identity(default)

3.6 传输编码(Transfer Codings)

3.6.1 块传输编码(Chunked Transfer Coding)

3.7 媒体类型(Media Type)

HTTP 在头字段 Content-Type, Accept 中应用 Internet Media Types

media-type     = type "/" subtype *(";" parameter)
type           = token
subtype        = token

Content-Type: text/html; charset=UTF-8
Media-type 必须在 IANA 注册过
未注册的媒体类型不激励应用 

3.7.1 规范化和文本缺省(Canonicalization and Text Defaults)

HTTP 应用程序 MUST 能接管 CRLF,CR 和 LF 作为文本媒体的换行符
HTTP 容许利用字符集里等价于 CR 和 LF 的字节序列来示意换行符

实体主体局部能够应用 CR 和 LF,其余不行
默认 ISO-8859-1

3.7.2 多局部类型(Multipart type)

4 HTTP Message

4.1 Message Types 音讯类型

HTTP-message = Request|Response ;HTTP/1.1

格局:generic-message = start-line
*(message-header CRLF)CRLF
[message-body]

start-line = Request-Line | Status-Line

为了健壮性,服务器应该疏忽任意申请行(Request-Line)后面的空行

某些由问题的 HTTP/1.0 实现会在申请前面加一些 CRLF
一个 HTTP/1.1 客户端 MUST NOT 在申请前和申请后加 CRLF

4.2 Message Headers

header 分类:general-header (section 4.5)
request-header (section 5.3) 
response-header (section 6.2) 
entity-header (section 7.1)

格局:message-header = field-name ":" [field-value]
field-name     = token
field-value    = *(field-content | LWS)
field-content  = <the OCTETs making up the field-value and consisting of either *TEXT or                         combinations of token, separators, and quoted-string>

 LWS 呈现在 field-content 中 MAY 会被 SP 代替
 
 头字段程序的 "good practice"
    1. general-header fields
    2. request-header or response-header fields
    3. entity-header

当一个 header 有多个值,网关代理 MUST 按原来的值程序转发。cache-control: no-cache, no-store, no-transform

4.3 Message body 音讯主体

message-body 用于承载申请和响应的 entity-body

message-body = entity-body | <entity-body encoded as per Transfer-Encoding>
Transfer-Encoding MUST 用于指定 transfer-codings
Transfer-Encoding 是音讯的属性,不是实体的属性

音讯主体是否呈现在音讯中的判断条件
1. 由 header Content-Length 或 Transfer-Encoding 来暗示。2. request Method
3. response Method or 响应状态码(1XX 204 304)

4.4 Message Length 音讯长度

message 的 transfer-length 是 message-body 的长度; 
transfer-length 由以下条件决定 (按优先级排序):
1. response message MUST NOT 包含 message-body
    such as 1xx, 204, and 304
    申请办法为 HEAD 的响应
2. Transfer-Encoding 存在,值不为 identity。transfer-length 定义在 chunked 中(section 3.6)3. Content-Length 存在,值为 entity-length 用 OCTETs 示意的十进制。若 entity-length 与 transfer-length 不相等,阐明应用了 Transfer-Encoding。同时应用 Transfer-Encoding 和 Content-Length,Content-Length 会被疏忽
4. multipart/byteranges(自定义媒体),客户端需与服务端协商好传输长度。能够应用 header:Range

HTTP1.1 存在 Transfer-Encoding 

蕴含音讯体,然而 Content-Length 不存在, 服务器 SHOULD 响应 400 (bad request) 或者 411 (length required)
MUST 接管 "chunked" 传输编码(section 3.6)同时存在 Transfer-Encoding(值不为 identity)和 Content-Length,Content-Length MUST 被疏忽 

4.5 General Header Fields 罕用头

有些 header 即实用于 申请,也实用于响应,但不实用与 实体。

general-header =  Cache-Control            ; Section 14.9
                | Connection               ; Section 14.10
                | Date                     ; Section 14.18
                | Pragma                   ; Section 14.32
                | Trailer                  ; Section 14.40
                | Transfer-Encoding        ; Section 14.41
                | Upgrade                  ; Section 14.42
                | Via                      ; Section 14.45
                | Warning                  ; Section 14.46

5 Request 申请

        Request       = Request-Line              ; Section 5.1
                        *(( general-header        ; Section 4.5
                         | request-header         ; Section 5.3
                         | entity-header ) CRLF)  ; Section 7.1
                        CRLF
                        [message-body]          ; Section 4.3

5.1 Request-Line

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

5.1.1 Method

       Method         = "OPTIONS"                ; Section 9.2
                      | "GET"                    ; Section 9.3
                      | "HEAD"                   ; Section 9.4
                      | "POST"                   ; Section 9.5
                      | "PUT"                    ; Section 9.6
                      | "DELETE"                 ; Section 9.7
                      | "TRACE"                  ; Section 9.8
                      | "CONNECT"                ; Section 9.9
                      | extension-method
       extension-method = token
       
405 (Method Not Allowed)
501 (Not Implemented)
GET and HEAD MUST be supported

5.1.2 Request-URI

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

OPTIONS  *  HTTP/1.1

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

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

5.2 申请资源 The Resource Identified by a Request

Internet request 资源标识通过 Request-URI 和 Host header field. 

1. Request-URI 是 absoluteURI,MUST 疏忽 Host
2. Request-URI 非 absoluteURI,Host 决定 host
3. 不满足 1, 2。response MUST 400(Bad Request) 

5.3 申请头 Request Header Fields

 申请的附加音讯或客户端的附加音讯
request-header = Accept                   ; Section 14.1
                | Accept-Charset           ; Section 14.2
                | Accept-Encoding          ; Section 14.3
                | Accept-Language          ; Section 14.4
                | Authorization            ; Section 14.8
                | Expect                   ; Section 14.20
                | From                     ; Section 14.22
                | Host                     ; Section 14.23
                | If-Match                 ; Section 14.24
                | If-Modified-Since        ; Section 14.25
                | If-None-Match            ; Section 14.26
                | If-Range                 ; Section 14.27
                | If-Unmodified-Since      ; Section 14.28
                | Max-Forwards             ; Section 14.31
                | Proxy-Authorization      ; Section 14.34
                | Range                    ; Section 14.35
                | Referer                  ; Section 14.36
                | TE                       ; Section 14.39
                | User-Agent               ; Section 14.43

6 Response 响应

 Response      = Status-Line               ; Section 6.1
                 *(( general-header        ; Section 4.5
                 | response-header        ; Section 6.2
                 | entity-header ) CRLF)  ; Section 7.1
                 CRLF
                 [message-body]          ; Section 7.2

6.1 Status-Line

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

6.1.1 Status Code and Reason Phrase

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
Status-Code = 
           |"200"   ; 10.2.1 节: OK
          | extension-code

extension-code =3DIGIT
Reason-Phrase = *<TEXT,excluding CR,LF>

具体 code 见原文 https://www.rfc-editor.org/rfc/rfc2616.html#section-6.1.1

6.2 Response Header Fields

 响应的附加音讯或服务端的附加音讯
response-header = Accept-Ranges           ; Section 14.5
                | Age                     ; Section 14.6
                | ETag                    ; Section 14.19
                | Location                ; Section 14.30
                | Proxy-Authenticate      ; Section 14.33
                | Retry-After             ; Section 14.37
                | Server                  ; Section 14.38
                | Vary                    ; Section 14.44
                | WWW-Authenticate        ; Section 14.47

7 Entity 实体

Request and Response messages MAY 传输实体,如果不受 request method 或 response status code 限度. 
entity = entity-header fields + entity-body

7.1 Entity Header Fields

       entity-header  = Allow                    ; Section 14.7
                      | Content-Encoding         ; Section 14.11
                      | Content-Language         ; Section 14.12
                      | Content-Length           ; Section 14.13
                      | Content-Location         ; Section 14.14
                      | Content-MD5              ; Section 14.15
                      | Content-Range            ; Section 14.16
                      | Content-Type             ; Section 14.17
                      | Expires                  ; Section 14.21
                      | Last-Modified            ; Section 14.29
                      | extension-header

       extension-header = message-header
       
接管方能够疏忽未辨认 header

7.2 Entity Body

entity-body    = *OCTET
entity-body 由 message-body 依据 Transfer-Encoding decoding 后失去 

7.2.1 Type

音讯体的数据类型由 Content-Encoding 和 Content-Type 指定

entity-body := Content-Encoding(Content-Type( data) )
Content-Type 指定数据的 media type
Content-Encoding 指定 content codings

MAY 媒体类型首先看 Content-Type,其次从数据内容或 URI 来推断,SHOULD 最初指定为 application/octec-stream

7.2.2 Entity Length

transfer-coding 之前的长度 

8 连贯 Connections

8.1 长久化连贯 Persistent Connections

8.1.1 目标 Purpose

 长久化连贯有数个劣势:1. 缩小 TCP 开启敞开次数, 节俭路由器和主机 (hosts:clients, servers, proxies, gateways, tunnels, or caches) 的 CPU time, 节俭主机上 TCP protocol control blocks 占用的内存。2. 能够在连贯上开启 Pipelining。容许客户端收回多个申请而无需期待每个响应。3. 缩小报文数量,并有足够的工夫确定网络拥塞(congestion)状态,缩小网络拥塞
4. 后续连贯,节俭了三次握手
5. 报错后无需敞开 TCP 连贯,能够乐观的尝试新个性。SHOULD 实现长久化连贯 

8.1.2 整体操作 Overall Operation

HTTP 1.1 默认长久化连贯

Persistent connections 能够应用 header Connection 来敞开 close of a TCP connection
一旦发送敞开信号, 客户端 MUST NOT 堆这条连贯发送任何申请 
8.1.2.1 协商(Negotiation)
HTTP/1.1 client 和 server 默认放弃连贯,直到申请头 Connection 携带 connection-token close
HTTP/1.0 向后兼容见 section 19.6.2 
长久化连贯所有音讯 MUST 携带 message length, 详情见 section 4.4
8.1.2.2 流水线 Pipelining
MUST:流水线必须在长久化连贯上开启
SHOULD:应用流水线时,须要应用幂等办法(see section 9.1.2)。

8.1.3 Proxy Servers

MUST:代理不能为 HTTP/1.0 的客户端建设长久化连贯 

8.1.4 最佳实际 Practical Considerations

1. 须要为非沉闷中的连贯设置一个超时工夫(time-out)。2. SHOULD:客户端服务器超时敞开时,应该按标准敞开连贯。客户端和服务器须要时刻查看对方是否敞开了连贯。3. MAY:客户端,服务器,代理能够在任何时候敞开连贯。当服务器敞开连贯时,客户端发动申请,倡议应用重试 + 幂等办法保障这次申请的胜利
4. 服务器的连接数倡议放弃在 2N,N = 同时在线用户数

以上准则都是为了升高响应工夫和防止阻塞 

8.2 音讯传送要求 Message Transmission Requirements

8.2.1 长久化连贯和流量管制 Persistent Connections and Flow Control

HTTP/1.1 服务器该当放弃继续连贯并应用 TCP 流量管制机制来解决长期过载。客户端重试会导致拥塞好转 

8.2.2 监控连贯的谬误状态

SHOULD:HTTP/1.1 (or later) client 发送 message-body 时应该监控 network connection 的状态。发现错误立刻进行音讯主体的发送。应用 chuck 传输,能够用长度为 0 的块和 empty trailer 来完结音讯。header 上有 Content-Length MUST 马上敞开连贯 

8.2.4 服务端过早敞开连贯时客户端的行为

// TODO

9 办法定义

办法有很多, 此处只关注 GET POST

9.1 平安和等幂(Idempotent)办法

9.1.1 平安办法

GET 获取资源时平安,action(执行动作)时不保障平安
POST 执行动作时平安

GET  查问平安
POST 增删改查都平安 

9.1.2 等幂办法

GET POST 都是幂等办法
除了 error or expiration 问题,雷同参数返回雷同后果 

9.3 GET

 当申请头中蕴含  If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range,GET 办法语义将改为 "conditional GET"
满足条件时响应中返回实体,否则应用缓存。GET 申请的响应是可缓存的(cacheable),详情见 section 13.

应用表单时的平安问题,见 section 15.1.3

9.5 POST

 性能如下:- 已存在的资源的正文;- 公布音讯给一个布告板,新闻组,邮件列表,或者类似的文章组。- 提供一个数据块,如提交一个表单给一个数据处理过程。- 通过追加操作来扩大数据库。响应可缓存,除非响应头中蕴含 Cache-Control 或 Expires。

10 状态码

RFC 2616:超文本传输协定 — HTTP/1.1#section-10

11 拜访认证

12 内容协商 Content Negotiation

HTTP 提供了几种内容协商的机制 -- 多种示意形式可用时,为响应抉择最佳示意形式。内容协商不是格局协商,因为 representations 可能是同样的 media type,然而利用了 media type 的不同性质,例如语言

内容协商在 HTTP 中由两种类型:服务器驱动协商和代理驱动协商。也能够联结应用 

12.1 服务器驱动协商(Server-driven Negotiation)

 通过服务器算法选择响应最好的表现形式。

12.2 代理驱动协商(Agent-driven Negotiation)

12.3 通明协商(Transparent Negotiation)

13. 缓存 Cache

14. 申请头定义

14.7 Allow

Allow   = "Allow" ":" #Method
Allow: GET, HEAD, PUT

14.10 Connection

Connection = "Connection" ":" 1#(connection-token)
connection-token  = token
Connection: close

14.13 Content-Length

Content-Length = "Content-Length" ":" 1*DIGIT
Content-Length: 3495

限度条件见 section 4.4

14.17 Content-Type

Content-Type = "Content-Type" ":" media-type
Content-Type: text/html; charset=ISO-8859-4

……

退出移动版