모든 HTTP 통신은 TCP/IP를 통해 이루어진다.
TCP/IP커넥션이 맺어지면 클라이언트와 서버 간에 주고받는 메시지들은 손실, 손상되거나 순서가 바뀌지 않고 안전하게 전달된다.

TCP 성능에 대한 고려
- HTTP 트랜잭션 지연
: 대부분 TCP 네트워크 지연의 원인으로 발생
하드웨어 성능, 네트워크와 서버의 전송 속도, 요청과 응답 메시지의 크기, 클라이언트 서버 간의 거리에 따라 속도가 달라진다.
- 성능 관련 중요 요소
- TCP 커넥션의 핸드셰이크 설정
- 인터넷의 혼잡을 제어하기 위한 TCP의 느린 시작
- 데이터를 한데 모아 한 번에 전송하기 위한 네이글 알고리즘
- TCP 편승 확인응답을 위한 확인응답 지연 알고리즘
- TIME_WAIT 지연과 포트 고갈
HTTP 커넥션 관리
- Connection 헤더
: HTTP 메시지는 클라이언트에서 서버까지 중개 서버들을 하나하나 거치면서 전달된다.
현재 커넥션에만 적용된 옵션을 지정해야 할 경우, HTTP connection 헤더 필드는 커넥션 토큰을 쉼표로 구분하여 가지고 있으며, 그 값들은 다른 커넥션에 전달되지 않는다.
- 순차적인 트랜잭션 처리에 의한 지연
: 순차적인 처리로 인한 지연으로 사용자는 브라우저에서 텅 빈 화면을 보게 될 것이다.
* 이러한 커넥션의 성능을 향상 시킬 수 있는 기술 네가지
- 병렬 커넥션
: 여러 개의 TCP 커넥션을 통한 동시 HTTP 요청
클라이언트가 여러 개의 커넥션을 맺어 병렬로 처리
클라이언트의 네트워크 대역폭이 좁을 때는, 제한된 대역폭 내에서 각 객체를 전송받는 것은 느리기 때문에 성능상으로 빠르지 않다.
또한, 다수의 커넥션은 메모리를 많이 소모하고 성능 문제가 발생한다.
병렬 커넥션이 실제로 더 빠르진 않지만, 화면에 여러 개의 객체가 동시에 보이면서 내려받기 때문에 빠르게 느껴질 수 있다.
- 지속 커넥션
: 커넥션을 맺고 끊는 데서 발생하는 지연을 제거하기 위한 TCP 커넥션의 재활용
처리가 완료된 후에도 TCP 커넥션을 유지하여 앞으로 있을 HTTP 요청에 재사용할 수 있다.
해당 서버에 이미 맺어진 지속 커넥션을 재사용함으로써, 커넥션을 맺기 위한 시간을 절약할 수 있다.
장점: 커넥션을 맺기 위한 사전 작업과 지연을 줄여준다. 튜닝된 커넥션을 유지하며, 커넥션 수를 줄여준다.
단점: 잘못 관리할 경우, 계속 연결된 상태로 있는 커넥션이 쌓이게 된다.
*Keep-Alive 커넥션
- 동작
: 클라이언트는 커넥션을 유지하기 위해 요청에 Connection:Keep-alive 헤더를 포함시킨다.
서버는 다음 요청도 이 커넥션을 통해 받고자 하면, 응답 메시지에 같은 헤더를 포함시켜 응답한다.
(클라이언트는 응답에 Connection: Keep-Alive헤더가 없으면 keep-alive를 지원하지 않으며, 메시지가 전송되고 나면 커넥션을 끊을 것이라 추정한다.)
- 옵션
timeout: 커넥션이 얼마간 유지될 것인지
max: 커넥션이 몇 개의 HTTP 트랜잭션을 처리할 떄까지 유지될 것인지
Keep-Alive 헤더: 진단이나 디버깅을 목적으로 하는 처리되지 않는 임의의 속성들을 지원
- 파이프라인 커넥션
: 공유 TCP 커넥션을 통한 병렬 HTTP 요청
여러 개의 요청은 응답이 도착하기 전까지 큐에 쌓인다. 첫 번째 요청이 전달되면 두 번째, 세 번째 요청이 전달 될 수 있다.
이는 왕복으로 인한 시간을 줄여서 성능을 높여준다.
*커넥션 끊기
- 마음대로 커넥션 끊기
: 어떠한 HTTP 클라이언트, 서버, 혹은 프락시든 언제든지 TCP 전송 커넥션을 끊을 수 있다.
- Content-length와 Truncation
: 각 HTTP 응답은 본문의 정확한 크기 값을 가지는 Content-Length 헤더를 가지고 있어야 한다.
- 커넥션 끊기의 허용, 재시도, 멱등성
:커넥션은 에러가 없더라도 언제든 끊을 수 있다.
한 번 혹은 여러 번 실행되었는지에 상관없이 같은 결과를 반환한다면 멱등하다고 한다. (GET, HEAD, PUT, DELETE, TRACE, OPTIONS)
비멱등인 요청을 다시 보내야 한다면, 이전 요청에 대한 응답을 받을 때까지 기다려야한다. (POST 부류의 요청들은 반복될 경우 응답이 여러 번 중복될 것이기 때문에 반복은 피해야 한다.)
* 멱등: 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미
*우아한 커넥션 끊기
: TCP 커넥션은 양방향이며, 양쪽에는 데이터를 읽거나 쓰기 위한 입력 큐와 출력 큐가 있다.
- 전체 끊기와 절반 끊기
전체 끊기: close() 호출
절반 끊기: shutdown() 호출
- TCP 끊기와 리셋 에러
만약 클라이언트에서 이미 끊긴 입력 채널에 데이터를 전송하면, 서버의 운영체제는 TCP 'connection reset by peer' 메시지를 클라이언트에 보낸다.
그리고 대부분의 운영체제는 버퍼에 저장된, 아직 읽히지 않은 데이터를 모두 삭제한다.
- 우아하게 커넥션 끊기
: 자신의 출력 채널을 먼저 끊고 다른 쪽에 있는 기기의 출력 채널이 끊기는 것을 기다리는 것
커넥션을 우아하게 끊고자 하는 애플리케이션은 출력 채널에 절반 끊기를 하고 난 후에도 데이터나 스트림의 끝을 식별하기 위해 입력 채널에 대해 상태 검사를 주기적으로 해야한다.
- 다중 커넥션
: 요청과 응답들에 대한 중재 (실험적인 기술)
'개발도서 읽기 > HTTP 완벽 가이드' 카테고리의 다른 글
[2. HTTP 아키텍처] 6장) 프락시 (0) | 2021.04.29 |
---|---|
[2. HTTP 아키텍처] 5장) 웹 서버 (0) | 2021.04.25 |
[1. HTTP: 웹의 기초] 3장) HTTP 메시지 (0) | 2021.04.18 |
[1. HTTP: 웹의 기초] 2장) URL과 리소스 (0) | 2021.04.11 |
[1. HTTP: 웹의 기초] 1장) HTTP 개관 (0) | 2021.04.10 |