HTTP 구조
HTTP는 Connectionless 방식으로 , 연결을 매번 끊고 새로 생성하는 구조이다.
이는 Network 비용 측면에서 최초 연결을 하기 위해 많은 비용을 소비하는 구조다.
Keep Alive?
HTTP/1.1 부터는 이미 연결되어 있는 TCP연결을 재사용하는 Keep-Alive 라는 기능을 Default로 지원한다.
즉, Handshake 과정이 생략되므로 성능 향상을 기대할 수 있다.
keep Alive 의 유지 시간은 연결된 Socket에 I/O Access가 마지막으로 종료된 시점부터 정의된 시간까지 Access가 없더라도
세션을 유지하는 구조이다.
즉 정의된 시간내에 Access가 이루어진다면 계속 연결된 상태를 유지할 수 있게 된다.
Q . 왜 필요하지?
서버 자원은 무한정이 아니다.
그렇기 때문에 이러한 접속을 계속 유지하는 것은 Server에 손실을 발생시킨다.
즉 서버와 연결을 맺을 수 있는 Socket은 한정되어 있고, 연결이 오래 지속되면 다른 사람들이 연결을 못하게 되는 상황이 닥친다.
장점
아래의 지속 커넥션을 보게 되면 커넥션을 맺고 끊는 작업이 없어져서 시간이 단축되는 것을 볼 수 있다.
단점
정적 자원으로만 구성된 웹 서버에 Keep Alive 를 사용할 경우 약 50%의 성능 향상을 보인다고 한다.
이같은 성능 향상을 보이려면 전제는 서버가 바쁘지 않아야 한다. 하지만, 바쁜 서버 환경에서 Keep Alive 기능을 사용할 경우
모든 요청마다 연결을 유지해야 하기 때문에 프로세스 수가 기하급수적으로 늘어나 MaxClient값을 초과하게 된다.
따라서 메모리를 많이 사용하게 되고 이는 곧 성능 저하의 원인이 된다.
즉, 대량 접속 시 효율이 떨어지게 된다.
문제점
"멍청한 프록시"
일반적으로 HTTP는 클라이언트와 서버 사이에 프록시 서버, 캐시 서버 등과 같은 중개 서버가 놓이는 것을 허락한다.
1. 웹 클라이언트는 프록시에 Connection : Keep-Alive 헤더와 함께 메시지를 전송한다.
2. 클라이언트는 커넥션을 유지하자는 요청에 대한 응답을 확인하기 위해 기다린다.
3. 멍청한 프록시는 요청받은 HTTP의 Connection 헤더를 이해하지 못한다.
4. 프록시는 Keep-Alive를 모르기 때문에 다음 서버에 메시지를 그대로 전달한다.
5. Connection 헤더는 홉별 헤더였다. ( 특정 두 서버에만 영향을 끼치는 경우 )
6. 문제
7. 서로 소통이 되지 않아, 브라우저는 무한정 대기를 하다 타임아웃이 나서 커넥션이 끊기게 된다.
차선책
멍청한 프록시가 무조건 전달하는 문제를 해결하기 위해서, 개발자들은 Proxy-Connection이라는 헤더를 사용하는 차선책을 제시하였다.
브라우저에서 일반적으로 전달하는 Connection 헤더 대신에 비표준인 Proxy-Connection 확장 헤더를 프록시에 전달한다.
Keep Alive 예시
1. Image를 4개를 보여주어야 한다.
2. Client는 동시에 2개의 Image만 받아올 수 있다.
3. Image는 받아오는데 2초가 걸린다.
4. Port를 여는데 1초가 걸린다.
Keep Alive : False
처음 Server에 2개의 Port를 열고, Image 를 받고 Client Socket을 닫는다. ( 3초 )
다시 Server에 2개의 Port를 열고, Image 를 받고 Client Socket을 닫는다. ( 3초 )
총 6초
Keep Alive : True
처음 Server에 2개의 Port를 열고, Image 를 받는다. ( 3초 )
열어둔 Port로 Image 를 받아온다. ( 2초 )
총 5초
용어 정리
*프록시 : '대리'라는 의미로, 보안 분야에서는 주로 보안상의 이유로 직접 통신할 수 없는 두 점 사이에서 통신을 할 경우 그 사이의
중계기로서 대리로 통신을 수행하는 기능을 가리켜 프록시, 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
'CS > Network' 카테고리의 다른 글
HTTP와 HTTPS (0) | 2021.04.13 |
---|---|
OSI 7계층 (0) | 2021.04.13 |
HTTP Method (0) | 2021.04.13 |
URI - URL 그리고 URN (0) | 2021.04.12 |
TCP & UDP & TCP/IP (0) | 2021.04.12 |