본문 바로가기
네트워크

소켓과 HTTP

by 흰색남자 2023. 2. 22.

- 네트워크 소켓의 정의

컴퓨터 네트워크 상에서 프로세스들 간에 양방향 통신을 가능하게 해주는 소프트웨어 인터페이스
양방향 통신이 가능한 stateful한 프로토콜

 

 

- HTTP의 정의

웹 상에서 서버와 클라이언트 간에 데이터를 주고 받기 위한 프로토콜
연결 상태를 유지하지 않는 stateless한 프로토콜

 

 

TCP 소켓 연결을 하고 유지되는 정보는 다음과 같다.

  • 송신 버퍼(Transmission buffer): 전송할 데이터를 임시로 저장하는 버퍼
  • 수신 버퍼(Reception buffer): 수신한 데이터를 임시로 저장하는 버퍼
  • 시퀀스 번호(Sequence number): 전송되는 데이터의 순서를 유지하기 위한 번호
  • 확인응답 번호(Acknowledgment number): 수신한 데이터의 순서를 확인하기 위한 번호
  • 윈도우 크기(Window size): 데이터 전송 시 윈도우 크기를 설정하여 흐름 제어를 수행

 

- 소켓의 장단점

장점

  • 데이터를 직접 주고받기 때문에, HTTP와 같은 상우 프로토콜에 비해 더욱 유연하고 다양한 방식으로 데이터를 전송할 수 있다.
  • 상태 정보를 유지하기 때문에, HTTP와 같은 상위 레발 프로토콜에 비해 더욱 안정적이고 신뢰성 있는 데이터 전송이 가능하다.
  • 양방향 통신이 가능하여, 클라이언트와 서버 간에 데이터를 주고받을 수 있다.

단점

  • HTTP와 같은 상위 프로토콜보다 구현이 복잡하고, 직접적인 데이터 전송에 대한 책임이 개발자에게 있다.
  • 포트 번호를 지정하여 통신을 해야 하기 때문에, 방화벽 등의 보안 설정이 필요하다.
  • 데이터 전송 방식이 일정하지 않기 때문에, 클라이언트-서버 간의 데이터 전송 방식이 동일하지 않을 경우 데이터 전송에 실패할 수 있다.

 

- HTTP의 장단점.

장점

  • 표준화된 프로토콜이기 때문에, 개발이 비교적 쉽고 빠르게 구현할 수 있습니다.
  • HTTPS와 같은 보안 기능을 쉽게 적용할 수 있습니다.
  • 웹 브라우저를 통한 데이터 전송이 가능하여, 웹 기반의 애플리케이션에서 많이 사용됩니다.

단점

  • 요청과 응답으로 데이터 전송 방식이 정해져 있어, 이에 따른 제약이 발생할 수 있습니다.
  • 클라이언트가 요청을 보내고, 서버가 응답을 보내는 단방향 통신 방식이기 때문에, 서버에서 데이터를 보내기 위해서는 클라이언트가 요청을 보내야 합니다.
  • HTTP 헤더 등의 부가 정보가 많아, 데이터 전송 시 헤더가 차지하는 비중이 크기 때문에, 대용량 데이터 전송에 적합하지 않습니다.

 

 

 

HTTP 통신을 하기 위해서는 버전에 따라 TCP 커넥션 혹은 UDP 프로토콜을 사용하여 통신을 한다.

그렇다면 "TCP 커넥션을 사용하는 HTTP 통신에서는 무조건 신뢰성 있는 전송을 지원하는가?" 를 물어보면 그렇지 않다고 답할 수 있다. 

TCP에서는 오류 제어, 흐름 제어, 혼잡제어를 통해 신뢰성 있는 전송을 지원한다. 하지만 HTTP통신은  오류검출, 복구, 재전송 등 기능을 지원하지 않다. HTTP는 기본적으로 REQ - RES 방식으로 동작한다. 여기서 클라이언트가 보낸 REQ가 올바르지 않거나 서버에서 처리할 수 없는 경우, 서버는 오류 코드를 반환하여 클라이언트가 처리한다.

HTTP 클라이언트는 일반적으로 이러한 오류를 처리하기 위해 오류 처리 코드를 작성하고, 예외 처리를 수행한다. 또한 HTTP 헤더를 통해 클라이언트와 서버 간의 통신을 제어할 수 있으며, 이를 이용하여 오류 복구 및 재전송을 수행할 수 있다.

하지만 이러한 방식이 신뢰성 있는 데이터 전송을 보장하는 것은 아니다. 오류 발생 시 클라이언트에서 다시 요청해야하므로 이 과정에서 중복 요청이 발생할 수 있다. 따라서 HTTP를 이용한 데이터 전송에서 데이터 무결성을 보장하기 위한 메커니즘이 필요하다.

 

HTTP가 오류 검출, 복구 재전송을 지원하지 않는 이유는 다음과 같다.

HTTP 프로토콜은 기본적으로 정확성 보다는 빠른 데이터 전송, 연결의 빠른 수집과 해제를 더 중시하는 프로토콜이다. 목적에 맞게 HTTP 프로토콜은 오류 검출, 복구, 재전송을 지원하지 않는다.

HTTP 프로토콜은 각각의 요청와 응답이 독립적인 트랜잭션으로 처리되야 하므로 이전 요청, 현재 요청이나  응답 간에 연관성이 없다. 

 

HTTP에서 버전 별로 통신하는 방식이 다르다. HTTP 버전에는 1.0, 1.1, 2.0, 3.0이 있다.

1. HTTP/1.0

  • 최초의 HTTP 버전
  • 요청/응답 방식으로 동작
  • 각 요청마다 새로운 TCP 연결을 생성하여 통신
  • Connection: Keep-Alive 헤더를 이용하여 지속적인 TCP 연결 지원

2. HTTP/1.1

  • Keep-Alive 기능이 기본적으로 활성화됨
  • 파이프라인 기능 지원으로 한 번에 여러 요청 전송 가능
  • Chunked Transfer Encoding 지원으로 큰 데이터 전송 가능
  • Host 헤더 필수 지정

3. HTTP/2.0

  • 다중화(Multiplexing) 기능을 지원하여 하나의 TCP 연결로 여러 개의 요청과 응답을 처리
  • 요청/응답 방식 대신 프레임(Frame) 단위로 통신
  • 헤더 압축(Header Compression) 기능을 통해 대역폭 사용 최소화
  • Server Push 기능 지원으로 클라이언트 요청 없이 서버에서 데이터 전송 가능

4. HTTP/3.0

  • QUIC 프로토콜을 기반으로 동작
  • 다중화, 헤더 압축, 서버 푸시 기능은 HTTP/2와 유사
  • 데이터 전송 시 UDP 프로토콜 사용으로 TCP의 혼잡 제어와 대기 시간 감소 효과