CS/Network

애플리케이션 계층: HTTP

olsohee 2024. 3. 26. 00:20

HTTP(Hypertext Transfer Protocol)

전 세계의 웹브라우저, 서버, 웹 애플리케이션은 모두 HTTP(Hypertext Transfer Protocol)를 통해 서로 통신한다. HTTP는 전 세계의 웹 서버로부터 대량의 정보를 사람들의 PC에 설치된 웹브라우저로 옮겨준다. HTTP는 Hypertext Transfer Protocol의 약자이다. 이때 하이퍼텍스트란, 텍스트인데 링크들을 포함한 텍스트를 의미한다(ex, 이미지 참조 링크, 동영상 참조 링크). 따라서 HTTP는 여러 링크들이 포함된 하이퍼텍스트를 전송하는 프로토콜이다.

HTTP의 특징

  • TCP/IP
    • 따라서 신뢰성 있는 데이터 전송이 보장된다.
  • 클라이언트-서버 구조
    • 클라이언트는 서버에게 필요한 데이터를 요청하고, 서버는 요청에 알맞은 데이터를 찾아 응답한다. 서버는 항상 같은 장소에 있고, 클라이언트는 필요할 때마다 서버에 요청을 보낸다. 즉, 서버는 항상 같은 IP 주소를 갖는다.
  • Stateless
    • 서버가 클라이언트에 대한 정보를 유지하지 않는다.
    • Stateless한 이유는 무엇일까? 서버가 많은 양의 클라이언트를 상대할 때 일일이 기억하는 것이 아니다. 요청에 대해서만 응답하고 끝. 그렇기 때문에 많은 사용자들을 빠른 속도로 처리할 수 있는 것이다.
  • Connectionless
    • 클라이언트가 서버에 요청을 보내고, 서버가 해당 요청에 대한 응답을 보낸 후에는 TCP 연결이 종료되고(4-Way Handshake), 그 다음 요청을 보내기 위해서는 새로운 TCP 연결이 필요하다(3-Way Handshake).
    • Connectionless한 이유는 무엇일까?
      • HTTP는 불특정 다수와 통신하기 위한 목적을 가지고 있는데, 다수의 클라이언트와 연결을 계속해서 유지해야 한다면 많은 자원(ex, 소켓)을 사용하게 된다. 그렇게 때문에 연결을 유지하지 않고 끊어버리면 자원을 아낄 수 있고 더 많은 연결을 할 수 있다.
      • 만약 Connectionless하지 않다면 서버는 여러 클라이언트와 통신했던 소켓들을 그대로 열고 있을 것이다. 
      • 소켓은 운영체제 및 하드웨어 리소스에 따라 열 수 있는 개수에 제한이 있다. 
      • 따라서 Connectionless하지 않다면 소켓의 한계로 통신할 수 있는 클라이언트 수가 한정될 것이다. 
    • 그러나 Connectionless의 단점은 클라이언트의 모든 요청에 대해 매번 TCP 연결 및 연결 해제 과정을 수행해야 하는 오버헤드가 발생한다는 것이다.
    • Persistent Connection
      • 따라서 위와 같은 단점을 해결하기 위해 HTTP/1.1부터는 Keep-Alive라는 기능이 추가됐다. "Connection: keep-alive" 헤더를 사용하면 요청에 대한 응답을 완료했을 때 연결을 바로 끊지 않고 지정된 시간만큼 대기한다. 그리고 지정된 시간 내로 새로운 요청이 들어오면 계속 연결된 상태를 유지한다. 연결을 유지함으로써 TCP 연결 및 연결 해제를 위한 Handshake 발생을 줄여주어 성능 향상을 기대할 수 있다.
      • 어떤 상황에 Keep-Alive을 적용하는 것이 좋을까?
        • 웹 페이지에서 여러 개의 리소스를 요청할 때: HTTP는 하이퍼텍스트를 전송하는 프로토콜이다. 하이퍼텍스트에는 html 파일 외에도 여러 개의 링크가 포함되어 있다. 그리고 이 링크마다 요청을 보내 HTTP 통신이 이뤄진다. 따라서 html 파일에 여러 개의 링크가 있을 때 Keep-Alive를 적용하면 한 번의 연결로 효율적으로 통신이 가능하다.
        • 실시간 통신: 웹 소켓과 같은 실시간 통신 프로토콜은 Keep-Alive를 사용하여 클라이언트와 서버의 연결을 유지한다. 따라서 빠른 통신이 가능하다.
      • 반면 다음과 같은 상황에서는 Keep-Alive를 적용하지 않는 것이 좋다.
        • 일회성 요청
        • 바쁜 서버 환경: 바쁜 서버 환경에서 Keep-Alive 기능을 사용할 경우, 모든 요청마다 연결 유지해야 하기에 연결 중인 소켓의 수가 증가하여 많은 클라이언트를 수용하는데 한계가 생긴다.

Reference

'CS > Network' 카테고리의 다른 글

전송 계층: UDP, TCP  (1) 2024.03.26
소켓(Socket)  (0) 2024.03.26
애플리케이션 계층: DNS  (1) 2024.03.26
PDU, SDU  (0) 2023.12.09
네트워크의 형태(PAN, LAN, MAN, WAN), ISP  (0) 2023.11.27