HTTP 완벽 가이드 - 커넥션 관리
HTTP 애플리케이션을 개발한다면 HTTP 커넥션과 그것이 어떻게 사용되는지에 대해 잘 이해해야 한다.
TCP 커넥션
전 세계 모든 HTTP 통신은, 지구상의 컴퓨터와 네트워크 장비에서 널리 쓰이고 있는 패킷 교환 네트워크 프로토콜들의 계층화된 집합인 TCP/ IP를 통해 이루어진다. 세계 어디서든 클라이언트 애플리케이션은 서버 애플리케이션으로 TCP/IP 커넥션을 맺을 수 있다.
일단 커넥션이 맺어지면 클라이언트와 서버 컴퓨터 간에 주고받는 메시지들은 손실 혹은 손상되거나 순서가 바뀌지 않고 안전하게 전달된다.
죠의 컴퓨터 가게에서 전동공구의 최신 가격 목록을 가져온다고 해보자.
http//www.joes-hardware.com:80/power-tools.html
이 URL을 입력받은 브라우저는 다음과 같은 단계를 수행한다.
1단계 ~ 3단계에서 URL을 통해 서버의 IP 주소와 포트 번호를 가져오고, 4단계에서 웹 서버가 TCP 커넥션을 맺고 커넥션을 통해 요청 메시지가 전달된다. 6단계에서 응답을 읽고 7단계에서 커넥션이 끊어진다.
HTTP 커넥션은 몇몇 사용 규칙을 제외하고는 TCP 커넥션에 불과하다. 신속 정확하게 데이터를 보내고자 한다면 TCP의 기초적인 내용을 알아야 한다.
TCP는 HTTP에게 신뢰할 만한 통신 방식을 제공한다. TCP 커넥션의 한쪽에 있는 바이트들은 반대쪽으로 순서에 맞게 정확하게 전달된다.
TCP스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다
TCP는 IP 패킷(혹은 IP 데이터그램)이라고 불리는 작은 조각을 통해 데이터를 전송한다. HTTP가 메시지를 전송하고자 할 경우, 현재 연결되어 있는 TCP 커넥션을 통해서 메시지 데이터릐 내용을 순서대로 보낸다. TCP는 세그먼트라는 단위로 데이터 스트림을 잘게 나누고, 세그먼트를 IP 패킷라고 불리는 봉투에 담아서 인터넷을 통해 데이터를 전달한다. 이 모든 것은 TCP/IP 소프트웨어에 의해 처리되며, 그 과정은 HTTP 프로그래머에게 보이지 않는다.
각 TCP 세그먼트는 하나의 IP 주소에서 다른 IP 주소로 IP 패킷에 담겨 전달되고, 이 패킷들은 다음을 포함한다.
- IP 패킷 헤더(보통 20바이트)
- TCP 세그먼트 헤더(보통 20바이트)
- TCP 데이터 조각(0 혹은 그 이상의 바이트)
IP 헤더는 발신지와 목적지 IP 주소, 크기, 기타 플래그를 가진다.
TCP 커넥션 유지하기
컴퓨터는 항상 TCP 커넥션을 여러 개 가지고 있다. TCP는 포트 번호를 통해서 이런 여러 개의 커넥션을 유지한다. 포트 번호는 회사 직원의 내선전화와 같다. 회사의 대표 전화번호는 안내 데스크로 연결되고 내선전화는 해당 직원으로 연결되듯 IP 주소는 해당 컴퓨터에 연결되고 푸트 번호는 해당 애플리케이션으로 연결된다. TCP 커넥션은 네 가지 값으로 식별된다.
<발신지 IP 주소, 발신지 포트, 수신지 IP 주소, 수신지 포트>
위 네 가지 값으로 유일한 커넥션을 생성한다. 서로 다른 두 개의 TCP 커넥션은 네 가지 주소 구성요소의 값이 모두 같을 수 없다.
어떤 커넥션들은 같은 목적지 포트 번호를 가리킬 수 있다. 하지만 네 가지 커넥션 구성요소를 모두 똑같이 가리키는 커넥션은 있을 수 없다.
HTTP 트랜잭션 지연
HTTP 요청 과정에서 어떤 네트워크 지연이 발생하는지 살펴보자.
트랜잭션을 처리하는 시간은 TCP 커넥션을 설정하고, 요청을 전송하고, 응답 메시지를 보내느 것에 비하면 상당히 짧다는 것을 알 수 있다. 클라이언트나 서버가 너무 많은 데이터를 내려받거나 복잡하고 동적인 자원들을 실행하지 않는 한, 대부분의 HTTP 지연은 TCP 네트워크 지연 때문에 발생한다.
지연 원인
- 클라이언트는 URL에서 웹 서버의 IP 주소와 포트 번호를 알아내야 한다. 만약 URL에 기술되어 있는 호스트에 방문한 적이 최근에 없으면, DNS 이름 분석 인프라를 사용하여 URL에 있는 호스트 명을 IP 주소로 변환하는데 수십 초의 시간이 걸릴 것이다.
- 클라이언트는 TCP 커넥션 요청을 서버에게 보내고 서버가 커넥션 허가 응답을 회신하기를 기다린다. 커넥션 설정 시간은 새로운 TCP 커넥션에서 항상 발생한다. 이는 보통 1~2초의 시간이 소요되지만, 수백 개의 HTTP 트랜잭션이 만들어지면 소요시간은 크게 증가할 것이다.
- 커넥션이 맺어지면 클라이언트는 HTP 요청을 새로 생성된 TCP 파이프를 통해 전송한다. 웹 서버는 데이터가 도착하는 대로 TCP 커넥션에서 요청 메시지를 읽고 처리한다. 요청 메시지가 인터넷을 통해 전달되고 서버에 의해서 처리되는데 까지는 시간이 소요된다.
- 웹 서버가 HTTP 응답을 보내는 것 역시 시간이 소요된다.
성능 관련 중요 요소
- TCP 커넥션의 핸드셰이크 설정
- 인터넷의 혼잡을 제어하기 위한 TCP의 느린 시작
- 네이글(nagle) 알고리즘
- 확인응답 지연 알고리즘
- TIME_WAIT 지연과 포트 고갈
위에 요소는 따로 좀 더 찾아보자.