πŸ₯¨ HTTP Connection의 관리 (TCP 지연 방지)

lnnaeΒ·2020λ…„ 5μ›” 20일
0

HTTP Connection 헀더

Connection 헀더에 ν¬ν•¨λ˜λŠ” 3가지 토큰

  • HTTP 헀더 ν•„λ“œ λͺ… : 이 컀λ„₯μ…˜μ—λ§Œ ν•΄λ‹Ήλ˜λŠ” 헀더 λ‚˜μ—΄
    • λ‹€λ₯Έ 컀λ„₯μ…˜μ— μ „λ‹¬ν•˜λ©΄ μ•ˆλœλ‹€!
    • λ©”μ‹œμ§€λ₯Ό λ‹€λ₯Έ 곳으둜 μ „λ‹¬ν•˜λŠ” μ‹œμ μ— μ‚­μ œλ˜μ–΄μ•Όν•œλ‹€.
    • hop-by-hop 헀더 λͺ…을 κΈ°μˆ ν•œλ‹€. (두 μ„œλ²„μ—λ§Œ 영ν–₯을 λ―ΈμΉ˜λŠ”)
  • μž„μ‹œμ μΈ 토큰 κ°’ : 컀λ„₯μ…˜μ— λŒ€ν•œ λΉ„ν‘œμ€€ μ˜΅μ…˜
  • close κ°’ : μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ 컀λ„₯μ…˜μ΄ μ’…λ£Œλ˜μ–΄μ•Όν•¨

Connection 헀더와 ν•¨κ»˜ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬λ°›μœΌλ©΄, μš”μ²­μ— κΈ°μˆ λ˜μ–΄ μžˆλŠ” λͺ¨λ“  μ˜΅μ…˜μ„ μ μš©ν•œλ‹€.
그리고 λ‹€μŒ μ„œλ²„μ— λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜κΈ°μœ„ν•΄ Connection 헀더, Connection 헀더에 κΈ°μˆ λ˜μ–΄ 있던 λͺ¨λ“  헀더λ₯Ό μ‚­μ œν•œλ‹€. (hop-by-hop 헀더 μ‚­μ œ)

컀λ„₯μ…˜ κ΄€λ¦¬λ‘œ μΈν•œ 지연

컀λ„₯μ…˜ 관리가 μ œλŒ€λ‘œ 이뀄지지 μ•ŠμœΌλ©΄ TCP μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 순차적으둜 νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜μ—¬ 각 νŠΈλžœμž­μ…˜λ§ˆλ‹€ 컀λ„₯μ…˜μ„ λ§ΊλŠ”λ‹€λ©΄ 컀λ„₯μ…˜ λ§ΊλŠ” μ‹œκ°„ + slow start 지연이 λ°œμƒν•  수 μžˆλ‹€.
μ΄λŸ¬ν•œ 지연을 λ°©μ§€ν•˜κΈ° μœ„ν•œ 넀가지 기술이 μžˆλ‹€.

병렬 컀λ„₯μ…˜

병렬 컀λ„₯μ…˜μ€ 컀λ„₯μ…˜μ˜ 지연 μ‹œκ°„μ„ 겹치게 ν•˜μ—¬ 총 지연 μ‹œκ°„μ„ 쀄일 수 μžˆλŠ” 컀λ„₯μ…˜ 방식이닀.
일반적으둜 더 λΉ λ₯΄κΈ΄ ν•˜μ§€λ§Œ 항상 더 λΉ λ₯Έ 것은 μ•„λ‹ˆλ‹€. (ex. λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ΄ 쒁을 λ•Œ)
λ˜ν•œ λ‹€μˆ˜μ˜ 컀λ„₯μ…˜μ„ λ§Ίμ–΄ λ©”λͺ¨λ¦¬λ₯Ό 많이 μ†Œλͺ¨ν•˜κ³  자체적인 μ„±λŠ₯ 문제λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

단점

  • 각 νŠΈλžœμž­μ…˜λ§ˆλ‹€ μƒˆλ‘œμš΄ 컀λ„₯μ…˜μ„ λ§Ίμ–΄ μ‹œκ°„κ³Ό λŒ€μ—­ν­μ΄ μ†Œλͺ¨λœλ‹€.
  • slow start둜 μΈν•œ μ§€μ—°μœΌλ‘œ μ„±λŠ₯이 떨어진닀.
  • μ‹€μ œλ‘œ μ—°κ²°ν•  수 μžˆλŠ” 병렬 컀λ„₯μ…˜μ˜ μˆ˜μ— μ œν•œμ΄ μžˆλ‹€.

지속 컀λ„₯μ…˜

μ²˜λ¦¬κ°€ μ™„λ£Œλœ 후에도 TCP 컀λ„₯μ…˜μ„ μœ μ§€ν•˜μ—¬ μ•žμœΌλ‘œμ˜ HTTP μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ μž¬μ‚¬μš©ν•˜λŠ” 컀λ„₯μ…˜ 방식이닀. λΉ„ 지속컀λ„₯μ…˜μ˜ 경우 각 μ²˜λ¦¬κ°€ 끝날 λ•Œλ§ˆλ‹€ 컀λ„₯μ…˜μ„ λŠμ§€λ§Œ, 지속 컀λ„₯μ…˜μ€ ν΄λΌμ΄μ–ΈνŠΈ or μ„œλ²„κ°€ 컀λ„₯μ…˜μ„ 끊기 μ „κΉŒμ§€ 컀λ„₯μ…˜μ„ μœ μ§€ν•œλ‹€.

μž₯점

  • 이미 맺어진 컀λ„₯μ…˜μ„ μž¬μ‚¬μš©ν•˜λ―€λ‘œ, slow start둜 μΈν•œ 지연을 ν”Όν•  수 μžˆλ‹€.
  • 컀λ„₯μ…˜μ„ λ§ΊκΈ°μœ„ν•œ μ€€λΉ„ μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€.

단점

  • 잘λͺ» 관리할 경우, μ—°κ²°μƒνƒœλ‘œ μ§€μ†λ˜λŠ” 컀λ„₯μ…˜μ΄ μŒ“μ΄κ²Œ 됨 -> λ¦¬μ†ŒμŠ€ λ‚­λΉ„!

λ‹¨μ μ˜ 보완

지속 + 병렬 컀λ„₯μ…˜μ˜ 방식

  • HTTP/1.0 --> keep-alive

    Connection 헀더에 keep-aliveλ₯Ό ν¬ν•¨μ‹œν‚¨λ‹€. μ΄λŸ¬ν•œ μš”μ²­μ„ 받은 μ„œλ²„λŠ” λ‹€μŒ μš”μ²­λ„ λ˜‘κ°™μ€ 컀λ„₯μ…˜μ— λ°›κ³ μž ν•œλ‹€λ©΄ 응닡에 keep-aliveλ₯Ό ν¬ν•¨μ‹œν‚€λ©΄ λœλ‹€. 응닡에 ν•΄λ‹Ή 헀더가 μ—†μœΌλ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” keep-aliveλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©°, 응닡이 μ „μ†‘λœ 이후 μ„œλ²„κ°€ 컀λ„₯μ…˜μ„ λŠμ„ κ²ƒμœΌλ‘œ μΆ”μ •ν•œλ‹€.
    Content_Length κ°’κ³Ό λ©€ν‹°νŒŒνŠΈ λ―Έλ””μ–΄ ν˜•μ‹μ„ κ°€μ§€κ±°λ‚˜ or 청크 전솑 μΈμ½”λ”©μœΌλ‘œ 인코딩 λ˜μ–΄μ„œ νŠΈλžœμž­μ…˜μ΄ λλ‚˜λŠ” μ‹œμ μ— κΈ°μ‘΄ λ©”μ‹œμ§€μ˜ 끝을 μ•Œ 수 μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€!

  • HTTP/1.1 --> 지속 컀λ„₯μ…˜

    HTTP/1.1μ—μ„œλŠ” keep-aliveλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” λŒ€μ‹ , κ°œμ„ λœ 지속 컀λ„₯μ…˜μ„ μ§€μ›ν•œλ‹€. HTTP/1.0의 keep-alive와 달리 별도 섀정을 ν•˜μ§€ μ•ŠλŠ” ν•œ, λͺ¨λ“  컀λ„₯μ…˜μ„ 지속 컀λ„₯μ…˜μœΌλ‘œ μ·¨κΈ‰ν•œλ‹€.
    νŠΈλžœμž­μ…˜μ„ 끊기 μœ„ν•΄μ„œλŠ” Connection:closeλ₯Ό ν¬ν•¨ν•΄μ•Όν•œλ‹€.
    μ–˜λ„ λ™μΌν•˜κ²Œ Content_Length κ°’ or 청크 전솑 μΈμ½”λ”©μœΌλ‘œ 인코딩 λ˜μ–΄μ•Όν•œλ‹€.
    HTTP/1.1 ν”„λ½μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„μ— λŒ€ν•΄ λ³„λ„μ˜ 지속 컀λ„₯μ…˜μ„ λ§Ίκ³  κ΄€λ¦¬ν•΄μ•Όν•œλ‹€.
    쀑간에 λŠμ–΄μ§€λŠ” 컀λ„₯μ…˜μ„ 볡ꡬ할 수 μžˆμ–΄μ•Όλ§Œ ν•œλ‹€.

νŒŒμ΄ν”„λΌμΈ 컀λ„₯μ…˜

HTTP/1.1은 지속 컀λ„₯μ…˜μ„ ν†΅ν•΄μ„œ μš”μ²­μ„ νŒŒμ΄ν”„ 라이닝 ν•  수 μžˆλ‹€. (싀행쀑인 λͺ…령이 λλ‚˜κΈ° 전에 λ‹€λ₯Έ λͺ…λ Ήμ˜ 싀행을 μ‹œμž‘ν•œλ‹€.)

μ œμ•½ 사항

  • HTTP ν΄λΌμ΄μ–ΈνŠΈλŠ” 컀λ„₯μ…˜μ΄ 지속 컀λ„₯μ…˜μΈμ§€ 확인 ν•˜κΈ° 전에 νŒŒμ΄ν”„λΌμΈμ„ μ΄μ–΄μ„œλŠ” μ•ˆλœλ‹€.
  • HTTP 응닡은 μš”μ²­ μˆœμ„œμ™€ κ°™κ²Œ μ™€μ•Όν•œλ‹€. (HTTP λ©”μ‹œμ§€μ— 순번이 λ§€κ²¨μ Έμžˆμ§€ μ•ŠμŒ)
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 컀λ„₯μ…˜μ΄ μ–Έμ œ λŠκΈ°λ”λΌλ„, μ™„λ£Œλ˜μ§€ μ•Šγ…‡λŠ” μš”μ²­μ΄ νŒŒμ΄ν”„λΌμΈμ— 있으면 μ–Έμ œλ“  λ‹€μ‹œ μš”μ²­μ„ 보낼 μ€€λΉ„κ°€ λ˜μ–΄μžˆμ–΄μ•Όν•œλ‹€.
  • POST μš”μ²­κ°™μ΄ λ°˜λ³΅ν•΄μ„œ 보낼 경우 λ¬Έμ œκ°€ μƒκΈ°λŠ” μš”μ²­μ€ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ 보내면 μ•ˆλœλ‹€.
    • λ©±λ“± μš”μ²­ : GET, HEAD, PUT, DELETE, TRACE, OPTIONS
  • 각 응닡은 μ •ν™•ν•œ Content-Length 헀더λ₯Ό 가지고 μžˆμ–΄μ•Όν•œλ‹€.

컀λ„₯μ…˜ 끊기

컀λ„₯μ…˜μ€ μ—λŸ¬κ°€ 없더라도 μ–Έμ œλ“ μ§€ λŠμ„ 수 μžˆλ‹€. λ˜ν•œ, μ˜ˆμƒμΉ˜ λͺ»ν•˜κ²Œ 컀λ„₯μ…˜μ΄ λŠκ²¨λ„ μ μ ˆν•œ λŒ€μ‘μ„ ν•  수 μžˆμ–΄μ•Όν•œλ‹€.

νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 쀑에 컀λ„₯μ…˜μ΄ 끊기면, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ μž¬μ‹œλ„ν•΄λ„ λ¬Έμ œκ°€ μ—†λ‹€λ©΄ 컀λ„₯μ…˜μ„ λ‹€μ‹œ λ§Ίκ³ , ν•œ 번 더 μ „μ†‘ν•œλ‹€.
=> λ¬Έμ œκ°€ μƒκΈ°λŠ” κ²½μš°λŠ” POST(λΉ„ λ©±λ“±)둜 μ „μ†‘ν–ˆμ„ 경우. λΉ„λ©±λ“± μš”μ²­μ„ λ‹€μ‹œ λ³΄λ‚΄μ•Όν•˜λ©΄, 이전 μš”μ²­μ— λŒ€ν•œ 응닡을 받을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€.

전체 끊기, 절반 끊기

TCP 컀λ„₯μ…˜μ€ μž…λ ₯ 큐, 좜λ ₯ 큐 μ–‘λ°©ν–₯으둜 μ΄λ€„μ Έμžˆλ‹€.

  • 전체 끊기 : close()λ₯Ό ν˜ΈμΆœν•˜λ©΄ μž…, 좜λ ₯ μ±„λ„μ˜ 컀λ„₯μ…˜μ΄ λͺ¨λ‘ λŠμ–΄μ§„λ‹€.
  • 절반 끊기 : shutdown()을 ν˜ΈμΆœν•œλ‹€.

λ‹¨μˆœ HTTPλŠ” 전체 λŠκΈ°λ§Œμ„ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 각 ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„, ν”„λ½μ‹œμ™€ 톡신할 λ•Œ, κ·Έλ“€κ³Ό νŒŒμ΄ν”„λΌμΈ 지속 컀λ„₯μ…˜μ„ μ‚¬μš©ν•  λ•ŒλŠ” μ˜ˆμƒμΉ˜λͺ»ν•œ μ“°κΈ° μ—λŸ¬λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ 절반 끊기λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μž…λ ₯ μ±„λ…ˆμ„ λŠλŠ” 것은 μœ„ν—˜ν•˜λ‹€.
κ·Έλž˜μ„œ, μžμ‹ μ˜ 좜λ ₯ 채널을 λ¨Όμ € 끊고, λ‹€λ₯Έ μͺ½μ— μžˆλŠ” 좜λ ₯ 채널이 λŠκΈ°λŠ” 것을 κΈ°λ‹€λ¦°λ‹€.


이 글은 HTTP μ™„λ²½ κ°€μ΄λ“œλ₯Ό 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.
μ €μž‘κΆŒ 및 기타 λ¬Έμ œκ°€ 있으면 λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ„Έμš”.
κ°μ‚¬ν•©λ‹ˆλ‹€.

profile
μ΄λ‚΄μž„λ‹ˆλ‹Ή :>

0개의 λŒ“κΈ€