1. HTTP 커넥션은 “재사용 가능한 TCP 연결”이다

HTTP 클라이언트가 keep-alive를 사용하면 다음 구조를 갖는다.

HTTP Client
   └── Connection Pool
           └── TCP Connection 1
           └── TCP Connection 2
           └── TCP Connection N

요청을 보낼 때:

  1. 커넥션 풀에서 빈 커넥션을 꺼냄
  2. 요청 전송
  3. 응답(InputStream)을 읽음
  4. 커넥션을 풀에 반환
  5. 다음 요청에서 재사용

2. HTTP 커넥션은 응답 Body(InputStream)을 전부 읽어야 반환된다

왜냐하면 HTTP/1.1 keep-alive 구조는 다음과 같다:

즉, 응답 body를 읽지 않은 상태에서 커넥션을 돌려버리면

다음 요청이 들어올 때 이전 응답의 남은 body가 들어있는 상태가 되어버린다.

예시:

응답1 바디: "HELLO WORLD...."
(여기서 절반만 읽음)

다음 요청 실행 →
서버는 응답 2 보내려고 준비
하지만 소켓에는 응답1의 남은 데이터가 남아 있음

이 상황이 발생하면 커넥션은 **손상된 상태(corrupted)**가 된다.

그래서 대부분의 HTTP 클라이언트는 다음과 같이 동작한다: