6. Connection Management

HTTP λ©”μ‹œμ§•μ€ κΈ°λ°˜μ„ μ΄λ£¨λŠ” 전솑 λ˜λŠ” μ„Έμ…˜ 계측 컀λ„₯μ…˜ ν”„λ‘œν† μ½œκ³Ό 독립적이닀. HTTPλŠ” in-order μš”μ²­ 전솑과 그에 μƒμ‘ν•˜λŠ” in-order 응닡 전솑이 μžˆλŠ” μ‹ λ’°ν•  수 μžˆλŠ” μ „μ†‘λ§Œ κ°€μ • ν•œλ‹€.

HTTP κ΅¬ν˜„μ€ ν˜„μž¬ 컀λ„₯μ…˜ μƒνƒœ μœ μ§€, μƒˆ 컀λ„₯μ…˜ μ„€μ • λ˜λŠ” κΈ°μ‘΄ 컀λ„₯μ…˜ μž¬μ‚¬μš©, 컀λ„₯μ…˜μ—μ„œ μˆ˜μ‹ λœ λ©”μ‹œμ§€ 처리, 컀λ„₯μ…˜ μ‹€νŒ¨ 탐지 및 각 컀λ„₯μ…˜μ„ λ‹«λŠ” 것을 ν¬ν•¨ν•˜λŠ” 컀λ„₯μ…˜ 관리에 μ±…μž„μ§ˆ κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€. λŒ€λΆ€λΆ„μ˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„ μ—”λ“œν¬μΈνŠΈλ‹Ή λ‘κ°œ μ΄μƒμ˜ 컀λ„₯μ…˜μ„ ν¬ν•¨ν•˜μ—¬ μ—¬λŸ¬ 컀λ„₯μ…˜μ„ λ³‘λ ¬λ‘œ μœ μ§€ν•œλ‹€.

6.1 Connection

β€œConnection” 헀더 ν•„λ“œλ₯Ό 톡해 λ°œμ‹ μžλŠ” ν˜„μž¬ 컀λ„₯μ…˜μ— λŒ€ν•΄ μ›ν•˜λŠ” μ œμ–΄ μ˜΅μ…˜μ„ ν‘œμ‹œν•  수 μžˆλ‹€.

  • λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜κΈ° 전에, ν”„λ½μ‹œ λ˜λŠ” κ²Œμ΄νŠΈμ›¨μ΄κ°€ μˆ˜μ‹ λœ 컀λ„₯μ…˜ μ˜΅μ…˜μ„ λ°˜λ“œμ‹œ μ œκ±°ν•˜κ±°λ‚˜ λ°”κΎΈμ–΄μ•Ό ν•œλ‹€. (MUST)

Connection 와 Keep-Alive 같은 μ—°κ²°-지정(Connection-specific) 헀더 ν•„λ“œλ“€μ€ HTTP/2.μ—μ„œ κΈˆμ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 크둬과 νŒŒμ΄μ–΄ν­μŠ€λŠ” HTTP/2 μ‘λ‹΅μ—μ„œ 그듀을 λ¬΄μ‹œν•˜μ§€λ§Œ, μ‚¬νŒŒλ¦¬λŠ” HTTP/2 규격 μš”κ±΄μ— 따라 ν•΄λ‹Ή ν•„λ“œκ°€ ν¬ν•¨λœ 응닡은 μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. - MDN -

  • ν˜„μž¬ 컀λ„₯μ…˜μ— λŒ€ν•œ μ œμ–΄ 정보λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ Connection μ΄μ™Έμ˜ 헀더 ν•„λ“œλ₯Ό μ‚¬μš©ν•  κ²½ 우, λ°œμ‹ μžλŠ” Connection 헀더 ν•„λ“œμ— ν•΄λ‹Ή ν•„λ“œ 이름을 λ°˜λ“œμ‹œ λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€.(MUST)

  • ν”„λ½μ‹œ λ˜λŠ” 게이트 μ›¨μ΄λŠ” λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜κΈ° 전에 μˆ˜μ‹ λœ Connection 헀더 ν•„λ“œλ₯Ό 뢄석해야 ν•˜λ©° (MUST)

이 ν•„λ“œμ˜ 각 connection-option에 λŒ€ν•΄ connection-optionκ³Ό λ™μΌν•œ 이름을 가진 λ©”μ‹œμ§€μ—μ„œ 헀더 ν•„λ“œλ₯Ό μ œκ±°ν•œ λ‹€μŒ Connection 헀더 ν•„λ“œ 자체λ₯Ό μ œκ±°ν•œλ‹€.(λ˜λŠ” μ „μ†‘λœ λ©”μ‹œμ§€λ₯Ό μœ„ν•΄ μ€‘κ°œμžμ˜ 자체 컀λ„₯μ…˜ μ˜΅μ…˜λ“€κ³Ό ν•¨κ»˜ Connection 헀더 ν•„λ“œλ₯Ό λŒ€μ²΄ν•œλ‹€)

λ”°λΌμ„œ, Connection 헀더 ν•„λ“œλŠ” 직접적인 μˆ˜μ‹ μž("hop-by-hop")λ§Œμ„ μœ„ν•œ 헀더 ν•„λ“œλ₯Ό 체 인의 λͺ¨λ“  μˆ˜μ‹ μžλ₯Ό μœ„ν•œ ν•„λ“œ("end-to-end")와 κ΅¬λΆ„ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό 자체 μ„€λͺ…ν•  수 μžˆλ‹€.

Connection option은 λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • λ°œμ‹ μžλŠ” 페이 λ‘œλ“œμ˜ λͺ¨λ“  μˆ˜μ‹ μžλ₯Ό μœ„ν•œ 헀더 ν•„λ“œμ— ν•΄λ‹Ήν•˜λŠ” 컀λ„₯μ…˜ μ˜΅μ…˜μ„ 보내면 μ•ˆλœλ‹€. (MUST NOT)

  • μ˜μ†μ  컀λ„₯μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” λͺ¨λ“  μš”μ²­ λ©”μ‹œμ§€μ—μ„œ β€œclose" 컀λ„₯μ…˜ μ˜΅μ…˜μ„ 보내야 ν•œλ‹€.(MUST)

  • μ˜μ†μ  컀λ„₯μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” μ„œλ²„λŠ” 1xx (Informational) μƒνƒœ μ½”λ“œκ°€ μ—†λŠ” λͺ¨λ“  응닡 λ©”μ‹œμ§€μ—μ„œ β€œclose" 컀λ„₯μ…˜ μ˜΅μ…˜μ„ 보내야 ν•œλ‹€.(MUST)

6.2 Establishment

λ‹€μ–‘ν•œ 전솑 λ˜λŠ” μ„Έμ…˜ 계측 ν”„λ‘œν† μ½œμ„ 톡해 컀λ„₯μ…˜μ„ μ„€μ •ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” 것은 이 규격의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚œλ‹€. 각 컀λ„₯μ…˜μ€ ν•˜λ‚˜μ˜ 전솑 λ§ν¬μ—λ§Œ μ μš©λœλ‹€.

6.3 Persistence

HTTP/1.1은 기본적으둜 β€œpersistent connections” 을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μš”μ²­κ³Ό 응닡을 단일 컀λ„₯μ…˜μ—μ„œ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•œλ‹€. β€œclose” 컀λ„₯μ…˜ μ˜΅μ…˜μ€ ν˜„μž¬ μš”μ²­/응닡 ν›„ 컀λ„₯μ…˜μ΄ μ§€μ†λ˜μ§€ μ•ŠμŒμ„ μ•Œλ¦¬λŠ” 데 μ‚¬μš©λœλ‹€.

  • HTTP κ΅¬ν˜„μ€ μ˜μ†μ  컀λ„₯μ…˜μ„ 지원해야 ν•œλ‹€. (SHOULD)

  • μ„œλ²„λŠ” 응닡을 보낸 ν›„ μš”μ²­ λ©”μ‹œμ§€ λ³Έλ¬Έ 전체λ₯Ό λ°˜λ“œμ‹œ μ½κ±°λ‚˜ λ˜λŠ” 컀λ„₯μ…˜μ„ λ‹«μ•„μ•Ό ν•œλ‹€.(MUST)

  • 후속 μš”μ²­μ— λŒ€ν•΄ λ™μΌν•œ 컀λ„₯μ…˜μ„ μž¬μ‚¬μš©ν•˜λ €κ³  ν•œλ‹€λ©΄ 응닡 λ©”μ‹œμ§€ λ³Έλ¬Έ 전체λ₯Ό 읽어야 ν•œλ‹€.(MUST)

  • ν”„λ½μ‹œ μ„œλ²„λŠ” HTTP/1.0 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ˜μ†μ  컀λ„₯μ…˜μ„ μœ μ§€ν•΄μ„œλŠ” μ•ˆ λœλ‹€.(MUST NOT)

6.3.1 Retrying Requests

컀λ„₯μ…˜μ€ μ˜λ„κ°€ μžˆκ±°λ‚˜ μ—†κ±°λ‚˜ μ–Έμ œλ“ μ§€ λ‹«νž 수 μžˆλ‹€. λΉ„λ™κΈ°μ μœΌλ‘œ λ‹«νžˆλŠ” μƒν™©μœΌλ‘œλΆ€ν„° λ³΅κ΅¬ν•˜κΈ° μœ„ν•œ μš”κ΅¬λ₯Ό λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

  • ν”„λ‘μ‹œλŠ” λΉ„λ©±λ“± μš”μ²­μ„ μžλ™μœΌλ‘œ μž¬μ‹œλ„ν•˜λ©΄ μ•ˆλœλ‹€.(MUST NOT)

6.3.2 Pipelining

μ˜μ†μ  컀λ„₯μ…˜μ„ μ§€μ›ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλ₯Ό β€œpipelineβ€μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.(MAY) (즉, 각 응닡을 기닀리지 μ•Šκ³  μ—¬λŸ¬ μš”μ²­μ„ 보낼 수 있음).

  • μ„œλ²„λŠ” μš”μ²­μ΄ μ•ˆμ „ν•œ λ©”μ„œλ“œ([RFC7231]의 Section 4.2.1)인 경우 μ—°μ†μ˜ νŒŒμ΄ν”„ 라인 μš”μ²­μ„ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆμ§€λ§Œ, λ‹€λ§Œ μš”μ²­μ„ 받은 μˆœμ„œλŒ€λ‘œ ν•΄λ‹Ή 응닡을 전솑해야 ν•œλ‹€.(MUST)

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 컀λ„₯μ…˜ 섀립 직후 νŒŒμ΄ν”„λΌμΈμ„ μ²˜λ¦¬ν•΄μ„œλŠ” μ•ˆ λœλ‹€.(MUST NOT)

HTTP/2.x 이 λ‚˜μ˜€λ©΄μ„œ λ©€ν‹°ν”Œλž™μ‹± μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ λŒ€μ²΄λλ‹€.

6.4 Concurrency

ν΄λΌμ΄μ–ΈνŠΈλŠ” 주어진 μ„œλ²„λ‘œ μœ μ§€ν•˜λŠ” λ™μ‹œμ— μ—΄λ € μžˆλŠ” 컀λ„₯μ…˜ 수λ₯Ό μ œν•œν•΄μ•Ό ν•œλ‹€.

6.5 Failures as Timeouts

6.6 Tear-down

  • β€œclose” 컀λ„₯μ…˜ μ˜΅μ…˜μ„ 보낸 ν΄λΌμ΄μ–ΈνŠΈλŠ” μΆ”κ°€ μš”μ²­μ„ 보내지 μ•Šμ•„μ•Ό ν•˜λ©°(MUST NOT),

  • (β€œclose” κ°€ ν¬ν•¨λœ 경우) 이 μš”μ²­μ— ν•΄λ‹Ήν•˜λŠ” μ΅œμ’… 응닡 λ©”μ‹œμ§€λ₯Ό 읽은 ν›„ 컀λ„₯μ…˜μ„ λ°˜λ“œμ‹œ λ‹«μ•„μ•Ό ν•œλ‹€.(MUST)

  • β€œclose” 컀λ„₯μ…˜ μ˜΅μ…˜μ„ μˆ˜μ‹ ν•œ μ„œλ²„λŠ” β€œclose”가 ν¬ν•¨λœ μš”μ²­μ— λŒ€ν•œ μ΅œμ’… 응닡을 λ°œμ†‘ν•œ ν›„ 컀λ„₯μ…˜ μ’…λ£Œλ₯Ό μ‹œμž‘ν•΄μ•Ό ν•œλ‹€.(MUST)

6.7 Upgrade

β€œUpgrade” 헀더 ν•„λ“œλŠ” HTTP/1.1μ—μ„œ λ™μΌν•œ 컀λ„₯μ…˜μ˜ λ‹€λ₯Έ ν”„λ‘œν† μ½œλ‘œ μ „ν™˜ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•˜κΈ° μœ„ν•œ 것이닀.

  • 101 (Switching Protocols) 응닡을 μ „μ†‘ν•˜λŠ” μ„œλ²„λŠ” λ°˜λ“œμ‹œ 컀λ„₯μ…˜ μ „ν™˜ λŒ€μƒμ˜ μƒˆ ν”„λ‘œν† μ½œ 을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ Upgrade 헀더 ν•„λ“œλ₯Ό 전솑해야 ν•œλ‹€.(MUST)

  • 닀쀑 ν”„λ‘œν† μ½œ 계측이 μ „ν™˜λ˜λŠ” 경우 λ°œμ‹ μžλŠ” 계측 ꡬ뢄 μˆœμ„œλ‘œ ν”„λ‘œν† μ½œμ„ λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€.(MUST)

  • μ„œλ²„λŠ” ν•΄λ‹Ή μš”μ²­μ˜ Upgrade 헀더 ν•„λ“œμ— ν΄λΌμ΄μ–ΈνŠΈμ— μ˜ν•΄ ν‘œμ‹œν•˜μ§€ μ•Šμ€ ν”„λ‘œν† μ½œλ‘œ μ „ν™˜ν•΄μ„œλŠ” μ•ˆ λœλ‹€. (MUST NOT)

  • 426(Upgrade Required) 응닡을 μ „μ†‘ν•˜λŠ” μ„œλ²„λŠ” λ‚΄λ¦Όμ°¨μˆœ κΈ°λ³Έ μ„€μ • μˆœμ„œλ‘œ ν—ˆμš©κ°€λŠ₯ν•œ ν”„λ‘œν† μ½œμ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ Upgrade 헀더 ν•„λ“œλ₯Ό 전솑해야 ν•œλ‹€.(MUST)

101(Switching Protocols) 응닡을 μ „μ†‘ν•œ 직후, μ„œλ²„λŠ” 마치 μƒˆλ‘œμš΄ ν”„λ‘œν† μ½œ λ‚΄μ—μ„œ 그에 μƒμ‘ν•˜λŠ” 것을 받은 κ²ƒμ²˜λŸΌ μ›λž˜μ˜ μš”μ²­μ— 계속 λŒ€μ‘ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€(즉, ν”„λ‘œν† μ½œ λ³€κ²½ 후에도 μ„œλ²„κ°€ μΆ©μ‘±ν•΄μ•Ό ν•  λ―Έκ²° μš”μ²­μ„ μ—¬μ „νžˆ 가지고 있으며, μš”κ΅¬ν•˜μ§€ μ•Šκ³  이λ₯Ό μˆ˜ν–‰ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€).

HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade: HTTP/2.0

[... data stream switches to HTTP/2.0 with an appropriate response (as defined by new protocol) to the "GET /hello.txt" request ...]

Upgrade 헀더 ν•„λ“œκ°€ μ „μ†‘λ˜λ©΄, λ°œμ‹ μžλŠ” λ‚˜μ—΄λœ ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλŠ” μ€‘κ°œ μžμ— μ˜ν•΄ Upgradeκ°€ μ‹€μˆ˜λ‘œ μ „λ‹¬λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ β€œupgrade” 컀λ„₯μ…˜ μ˜΅μ…˜μ΄ ν¬ν•¨λœ Connection 헀더 ν•„λ“œ(Section 6.1)도 전솑해야 ν•œλ‹€.(MUST)

  • μ„œλ²„κ°€ β€œ100-continue” μ˜ˆμƒκ³Ό Upgrade 및 Expect 헀더 ν•„λ“œ([RFC7231]의 Section 5.1.1)λ₯Ό λͺ¨λ‘ μˆ˜μ‹ ν•˜λŠ” 경우, μ„œλ²„λŠ” 101 (Switching Protocols) 응닡을 보내기 전에 λ°˜λ“œμ‹œ 100 (Continue) 응닡을 보내야 ν•œλ‹€.(MUST)

Last updated