✊ 필오의 개발일지
Back to Posts
2019년 9월 4일

커넥션 관리 - TCP 커넥션의 종류

커넥션 관리 - TCP 커넥션의 종류
  1. 병렬 커넥션, keep-alive 커넥션, 커넥션 파이프라인을 활용한 HTTP의 최적화
  2. 커넥션 관리를 위해 따라야 할 규칙들

1. 병렬 커넥션 parallel

1.1 병렬 커넥션은 페이지를 더 빠르게 내려받는다.

1.2 병렬 커넥션이 항상 더 빠르지는 않다.

1.3 병렬 커넥션은 더 빠르게 느껴질 수 있다.


2. 지속 커넥션 persistent

웹 클라는 보통 같은 사이트에 여러 개의 커넥션을 맺는다. 즉 같은 서버에 계속 요청

처리가 완료된 후에도 계속 연결된 상태로 있는 TCP 커넥션을 지속 커넥션이라고 부른다.

2.1 지속 커넥션 vs 병렬 커넥션

병렬 커넥션의 단점

  1. 각 트랜잭션마다 새로운 커넥션을 맺고 끊기 때문에 시간과 대역폭이 소요된다.
  2. 새로운 커넥션은 TCP의 느린 시작 때문에 성능이 떨어진다.
  3. 실제로 연결할 수 있는 병렬 커넥션의 수에는 제한이 있다.

지속 커넥션의 장점

  1. 커넥션을 맺기 이한 사전 작업 지연을 줄여줌
  2. 튜닝된 커넥션을 유지
  3. 커넥션의 수를 줄여준다.

지속 커넥션의 단점

  1. 계속 연결된 상태로 있는 수많은 커넥션이 쌓이게 될 것이다.

지속 커넥션 + 병렬 커넥션은 가장 효과적

  1. HTTP/1.0+ 에는 keep-alive 커넥션이 있고, HTTP/1.1에는 지속 커넥션이 있다.

2.2 HTTP/1.0+의 Keep-Alive 커넥션

2.2.1 Keep-Alive 동작

2.2.2 Keep-Alive 옵션 (헤더)

keep-alive의 동작은 Keep-Alive 헤더의 옵션들로 제어 가능하다

Keep-Alive: timeout=5, max=1000 5초 동안 1000개의 커넥션을 유지하라는 내용
  1. timeout
  1. max

mdn 참고 

2.2.3 Keep-Alive 커넥션 제한과 규칙

Connection: Keep-Alive

Content-Length과 커넥션

Connection 헤더

2.2.4 Keep-Alive와 dumb(멍충한) 프락시

Connection 헤더의 무조건 전달

  1. 웹 클라는 프락시에 Connection: Keep-Alive 헤더와 함께 메세지를 보내고, 커넥션을 유지하기를 요청한다. 클라는 커넥션을 유지하자는 요청이 받아들여졌는지 확인하기 위해 응답을 기다린다.
  2. 멍청한 프락시는 Connection 헤더를 이해하지 못해서 다음 서버에 메세지를 그대로 전달한다. Connection헤더는 홉별 헤더다.(hop-by-hop): 오직 한 개의 전송 링크에만 적용되며, 다음 서버로 전달되어서는 안 된다.
  3. Connection: Keep-Alive를 받은 웹 서버는 커넥션을 유지하자고 요청하는 것으로 잘못 판단하게 된다. 클라가 아닌 프락시와 커넥션을 유지하는 것에 동의하고 Connection: Keep-Alive 헤더를 포함하여 응답한다. 하지만 프락시는 Connection를 모른다.
  4. 프락시는 Connection: Keep-Alive 헤더를 포함하고 있는 응답메세지를 클라에게 전달한다. 클라는 이 헤더를 통해 프락시가 커넥션을 유지하는 것에 동의했다고 추정한다. 클라와 서버는 커넥션을 유지한다고 생각하지만, 정작 프락시는 모름.
  5. Connection를 모르는 프락시는 모든 데이터를 클라에게 전달하고 서버가 커넥션을 끊기를 기다린다. 하지만 서버는 커넥션을 유지하고, 프락시는 끊어지기 전까지 기다린다.
  6. 클라는 유지되고 있다고 생각되는 커넥션으로 다음 요청을 보내는데, 프락시는 예상치 못한 요청이 들어온 거라 프락시로부터 무시되고, 브라우저는 아무런 응답 없이 로드 중이라는 표시만 나온다.
  7. 브라우저는 자신이나 서버가 타임아웃이 나서 커넥션이 끊길 때까지 기다린다.

프락시와 홉별 헤더 위의 잘못된 통신을 피하려면

2.2.5 Proxy-Connection 살펴보기

  1. Connection 헤더를 모르는 프락시에게 Connection 대신에 Proxy-Connection 확장 헤더를 프락시에게 전달한다.
  2. 웹 서버는 Proxy-Connection를 무시한다.
  3. 영리한 프락시라면, 의미 없는 Proxy-Connection헤더를 Connection 헤더로 바꿈으로써 원하던 효과를 얻게 된다.

RFC 7230  Proxy-Connection vs Connection header 


2.3 HTTP/1.1의 지속 커넥션

2.3.1 지속 커넥션의 제한과 규칙


3. 파이프라인 커넥션 pipelined

3.1 파이프라인의 제약사항


4. 커넥션 끊기에 대한 미스터리

4.1 마음대로 커넥션 끊기

4.2 Content-Length와 Truncation(끊기)

4.3 커넥션 끊기의 허용, 재시도

4.4 우아한 커넥션 끊기

전체 끊기와 절반 끊기

TCP 끊기와 리셋 에러

잘 모르겠다.

우아하게 커넥션 끊기





참고자료

Previous웹 서버
Next커넥션 관리 - TCP 커넥션과 성능

Related

© 2025 Felix