시작하기 전에..
- 여기서 알고 갈것 공부하고 설명할 수 있어야 한다!!
- HTTP는 어떻게 TCP 커넥션을 사용하는가?
- TCP 커넥션의 지연,병목,막힘
- 병렬 커넥션, keep-alive 커넥션,커넥션 파이프라인을 활용한 http의 최적화
- 커넥션 관리를 위해 따라야 할 규칙들
4.1 TCP 커넥션
TCP 스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다.
HTTP가 메세지를 전송하려고 할 경우 , 현재 연결되어 있는 TCP 커넥션을 통해서 메세지 데이터의 내용을 순서대로 보낸다.
컴퓨터는 항상 TCP 커넥션을 여러개 가지고 있다.
4가지 값으로 식별한다.
발신지 IP주소
발신지 포트
수신지 IP주소
수신지 포트
4.1.4 TCP 소켓 프로그래밍
- 소켓 API를 사용하면, TCP 종단 데이터 구조를 생성하고, 원격 서버의 TCP 종단에 그 종단 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다.
- 기본적인 네트워크 프로토콜의 핸드셰이킹, TCP데이터 스트림, IP패킷간의 분할 및 재조립에 대한 모든 내용을 외부로부터 숨긴다.
4.2 TCP의 성능에 대한 고려
HTTP 트랜잭션 지연 > 대부분 TCP 네트워크 지연때문에 발생한다
- 클라이언트는 URI에서 웹 서버의 IP 주소와 포트 번호를 알아내야 한다.
- 만약 호스트에 방문한 적이 없으면 DNS 인프라를 사용하여 IP 주소로 변환하는데 수십 초의 시간이 걸릴 것이다. (DNS 캐시가 없을 경우)
- 그러나 요즘엔 대부분 밀리초 단위로 DNS분석이 끝난다.
- 클라는 TCP 커넥션 요청을 서버에게 보내고, 서버가 커넥션 허가 응답을 회신하기를 기다린다.
- 커넥션 설정 시간은 새로운 TCP 커넥션에서 항상 발생한다.
- 커넥션이 맺어지면 클라는 HTTP 요청을 새로 생성한 TCP 파이프를 통해 전송한다.
- 웹 서버는 데이터가 도착하는 대로 TCP 커넥션에서 요청 메세지를 읽고 처리한다.
TCP 지연 요인
다음과 같은 요인과 그로 인한 성능상의 문제를 포함해 영향을 주는 일반적인 TCP 관련 지연들에 대해서 다룬다.
- TCP 커넥션의 핸드셰이크 설정
- TCP 편승(piggyback) 확인 응답(acknowledgment)을 위한 확인 응답 지연 알고리즘
- 인터넷의 혼잡을 제어하기 위한 TCP의 느린 시작 slow-start
- 데이터를 한데 모아 한 번에 전송하기 위한 네이글(nagle) 알고리즘
- TIME_WAIT 지연과 포트 고갈
4.2.1 TCP 핸드셰이크 지연 (3 handshake)
어떤 데이터를 전송하든, 새로운 TCP 커넥션을 열 때면,
TCP 소프트웨어는 커넥션을 맺기 위한 조건을 맞추기 위해 연속으로 IP 패킷을 교환한다.
다음은 TCP 커넥션이 핸드셰이크를 하는 순서다.
- 클라는 새로운 TCP 커넥션을 생성하기 위해
작은 TCP 패킷을 서버에게 보낸다.- 그 패킷은 SYN(synchronize sequence numbers)라는 특별한 flag를 가진다.
(TCP flags의 종류) - 커넥션 생성 요청이라는 뜻
- 그 패킷은 SYN(synchronize sequence numbers)라는 특별한 flag를 가진다.
- 서버가 그 커넥션을 받으면 몇 가지 커넥션 매개변수를 산출하고,
- 커넥션 요청이 받아들여졌음을 의미하는 SYN + ACK(acknowledgment) flag를 포함한 TCP 패킷을 클라에게 보낸다.
- 마지막으로 클라는 커넥션이 잘 맺어졌음을 알리기 위해서 서버에게 다시 확인 응답 신호를 보낸다. (ACK)
- 오늘날 TCP는 클라가 이 확인 응답 패킷과 함께 + 데이터를 보낼 수 있다.
- 실제 개발자들은 이 패킷들을 보지 못한다.
- TCP 커넥션이 생성될 때 발생하는 지연이 전부다.
- 크기가 작은 HTTP 트랜잭션은 50% 이상의 시간을 TCP를 구성하는 데 쓴다.
- TCP 구성으로 인한 지연을 제거하기 위해서 HTTP가 이미 존재하는 커넥션을 어떻게 재활용하는지 알아보자.
4.2.5 TCP의 느린 시작 (slow start)
전송속도는 커넥션이 만들어진 지 얼마나 지났는지에 따라 달라질 수 있다. 시간이 지나면서 자체적으로 튜닝되어서, 처음에는 커넥션의 최고속도를 제한하고 데이터가 성공적으로 전송됨에 따라서 속도 제한을 높여나간다.
갑작스러운 부하와 혼잡을 방지하는 데 쓰인다.
이 혼잡제어 기능 때문에, 새로운 커넥션은 이미 어느정도 데이터를 주고받은 튜닝된 커넥션보다 느리다. > "지속커넥션" : 이미 존재하는 커넥션을 재사용하는 기능
4.3.2 순차적인 트랜젝션 처리에 의한 지연
- 커넥션 관리가 제대로 이루어지지 않으면 TCP 성능이 매우 안 좋아질 수 있다.
- 만약 3개의 이미지가 있는 웹페이지에 접근한다면?
- 4개의 HTTP 트랜젝션을 만들어야 함. (html+이미지)
- 만약 각 트랜젝션이 새로운 커넥션을 필요로 한다면?
- 커넥션을 맺는데 발생하는 지연과 함께 느린 시작 지연이 발생할 것이다.
- 순차처리로 인한 지연에는 물리적인 지연뿐 아니라,
하나의 이미지를 내려받고 있는 중에는 웹페이지의 나머지 공간에 아무런 변화가 없어서 느껴지는 심리적인 지연도 있다.
HTTP 커넥션의 성능을 향상시킬 수 있는 여러 최신 기술이 있다.
- 병렬 커넥션 parallel
- 여러 개의 TCP 커넥션을 통한 동시 HTTP 요청
- 지속 커넥션 persistent
- 커넥션을 맺고 끊는 데서 발생하는 지연을 제거하기 위한 TCP 커넥션의 재활용
- 파이프라인 커넥션 pipelined
- 공유 TCP 커넥션을 통한 병렬 HTTP 요청
- 다중 커넥션 multiplexed
- 요청과 응답들에 대한 중재 (실험적인 기술이다..)
'기술서적' 카테고리의 다른 글
[HTTP 완벽가이드] 6장 - 프락시 (0) | 2022.07.15 |
---|---|
[HTTP 완벽가이드] 5장 - 웹 서버 (0) | 2022.07.14 |
[HTTP 완벽가이드] 3장 - HTTP 메세지 (0) | 2022.07.12 |
[HTTP 완벽가이드] 2장 - URL과 리소스 (0) | 2022.07.12 |
[HTTP 완벽가이드] 1장 - WEB의 기초 (0) | 2022.07.10 |