HTTP는 TCP 바로 위에 있는 계층이기 때문에 HTTP 트랜잭션의 성능은 TCP 성능의 영향을 받는다.
HTTP 트랜잭션이 처리되는 과정은
① DNS 찾기
② 연결
③ 요청
④ 처리
⑤ 응답
⑥ 종료
로 나뉘는데, 처리 과정의 경우 다른 부분에 비해 상당히 짧은 편이다. 때문에, 클라이언트/서버가 너무 많은 데이터를 내려받거나 복잡하고 동적인 자원을 실행하지 않는 이상 대부분의 HTTP 지연은 TCP 네트워크 지연에 의해 발생한다.
HTTP 트랜잭션을 지연시키는 원인
- 만약 URI에 기술된 호스트에 방문한 적이 없으면 DNS 인프라를 사용해 호스트명을 IP로 변환하는데 시간이 소요된다.
- 새로운 TCP 커넥션마다 커넥션 설정 시간이 필요해 수백개의 트랜잭션이 발생 시 소요 시간이 크게 증가한다.
- 요청 메시지가 인터넷을 통해 전달되고 서버에 의해 처리되는 시간.
- 웹 서버가 HTTP 응답을 보내는 시간
HTTP 프로그래머에게 영향을 주는 일반적인 TCP 지연
- TCP 커넥션의 핸드셰이크 설정
- 인터넷의 혼잡을 제어하기 위한 TCP의 느린 시작(SLOW-START)
- 데이터를 한 데 모아 한 번에 전송하기 위한 네이글 알고리즘(NAGLE-ALGORITHM)
- TCP의 편승(PIGGYBACK) 확인 응답(ACKNOWLEDGMENT)을 위한 확인 응답 지연 알고리즘
- TIME_WAIT 지연과 포트 고갈
TCP 커넥션 핸드셰이크 지연
어떤 데이터를 전송하는 새로운 TCP 커넥션을 열 때, TCP 소프트웨어는 커넥션을 맺기 위한 조건을 맞추기 위해 연속으로 IP패킷을 교환한다.
→ 작은 크기의 데이터 전송에 커넥션이 사용된다면 이런 패킷 교환은 HTTP 성능을 크게 저하시킬 수 있다.
TCP 커넥션의 핸드셰이크 순서
① 클라이언트는 새로운 TCP 커넥션 생성을 위해 작은 TCP 패킷을 서버에 보낸다.
→ SYN 이라는 플래그로 이 요청이 커넥션 생성 요청임을 알린다.
② 서버가 그 커넥션을 받으면 커넥션 요청이 받아들여졌음을 의미하는 SYN과 ACK 플래그를 포함한 TCP 패킷을 클라이언트로 보낸다.
③ 클라이언트에서 커넥션이 잘 맺어졌음을 알리는 확인 응답 신호를 보낸다.
→ 크기가 작은 HTTP 트랜잭션은 50% 이상의 시간을 TCP 구성에 소모한다.
확인 응답 지연
인터넷 자체가 패킷 전송을 완벽하게 보장하지는 않기 때문에 TCP는 성공적인 데이터 전송을 보장하기 위해 자체적인 확인 체계를 자긴다. 각 TCP 세그먼트는 순번과 데이터 무결성 체크섬을 가진다. 각 세그먼트의 수신자는 세그먼트를 온전히 받으면 작은 확인 응답 패킷을 송신자에게 반환한다. 만약 송신자가 특정 시간 안에 확인 응답 메시지를 받지 못하면 패킷이 파기되었거나 오류가 있는 것으로 판단하고 데이터를 다시 전송한다.
확인 응답은 크기가 작기 때문에 TCP는 같은 방향으로 송출되는 데이터 패밋에 확인 응답을 편승(PIGGYBACK) 시킨다.
확인 응답이 같은 방향으로 가는 데이터 패킷에 편승되는 경우를 늘이기 위해서 많은 TCP 스텍은 확인 응답 지연 알고리즘을 구현한다.
확인 응답 지연 알고리즘은 송출할 확인 응답을 특정 시간동안 버퍼에 저장해두고 확인 응답을 편승시키기 위한 송출 데이터 패킷을 찾는다. 만약 찾지 못하면 별도 패킷을 만들어 전송한다.
요청과 응답, 두 가지 형식으로만 이루어지는 HTTP 동작 방식은 확인 응답이 송출 데이터 패킷에 편승할 기회를 감소시킨다. 막상 편승할 패킷을 찾으려고 하면 해당 방향으로 송출될 패킷이 많지 않기 때문에 확인 응답 지연 알고리즘으로 인한 지연이 자주 발생한다.
→ 운영체제에 따라 다르지만, 확인 응답 지연 관련 기능을 수정하거나 비활성화 할 수 있다.
TCP 느린 시작(SLOW-START)
TCP 커넥션은 시간이 지나면서 자체적으로 튜닝되어서, 처음에는 커넥션의 최대 속도를 제한하고 데이터가 성공적으로 전송됨에 따라서 속도 제한을 높여간다. TCP 느린 시작은 TCP가 한 번에 전송할 수 있는 패킷의 수를 제한한다.
① 패킷이 성공적으로 전달되는 각 시점에 송신자는 추가로 2개의 패킷을 더 전송할 수 있는 권한을 얻는다.
② HTTP 트랜잭션에 전송할 데이터의 양이 많으면 모든 패킷을 한 번에 전송할 수 없다.
③ 대신 한 개의 패킷만 전송하고 확인 응답을 기다려야한다.
④ 확인 응답을 받으면 2개의 패킷을 보낼 수 있으며, 그 패킷 각각에 대한 확인 응답을 받으면 총 4개의 패킷을 보낼 수 있다.
네이글 알고리즘(NAGLE-ALGORITHM)과 TCP_NODELAY
네이글 알고리즘은 네트워크 효율을 위해서 패킷을 전송하기 위한 많은 양의 TCP 데이터를 한 개의 덩어리로 합친다.
네이글 알고리즘은 세그먼트가 최대 크기(약 1500~수백 BYTE)가 되지 않으면 전송을 하지 않는다. 다만, 다른 모든 패킷이 확인 응답을 받았을 경우에는 최대 크기보다 작은 패킷의 전송을 허락한다.
네이글 알고리즘은 HTTP 성능과 관련해 여러 문제를 발생시킨다.
① 크기가 작은 HTTP 메시지는 패킷을 채우지 못하기 때문에, 앞으로 생길지 않을지 모르는 추가적인 데이터를 기다리며 지연될 것이다.
② 확인 응답 지연과 함께 쓰일 경우 형편없이 동작한다.
- 네이글 알고리즘은 확인 응답이 도착할 때까지 데이터 전송을 멈춘다.
- 확인 응답 지연 알고리즘은 확인 응답을 100~200 밀리 초 지연시킨다.
'🚽 Deprecated > HTTP 완벽가이드' 카테고리의 다른 글
2장 : URL과 리소스 (0) | 2018.12.24 |
---|---|
1장 : HTTP 개관 (0) | 2018.12.16 |