TCP 서버를 공부하기 전에...

TCP (Transmission Control Protocol)

 

연결 지향: TCP는 데이터 전송을 시작하기 전에 송신자와 수신자 간의 연결을 설정한다. 이를 통해 신뢰할 수 있는 통신이 가능하게 된다.

신뢰성: 데이터가 손실되지 않도록 보장한다. 전송된 데이터는 수신자가 확인(ACK)해야 하며, 응답이 없으면 재전송된다.

순서 보장: TCP는 데이터 패킷이 전송된 순서대로 수신되도록 보장한다. 데이터는 바이트 스트림으로 취급되어 순서가 유지된다.

흐름 제어: 수신자의 처리 능력을 초과하지 않도록 데이터 전송 속도를 조절한다.

혼잡 제어: 네트워크의 혼잡 상태를 감지하고 이에 따라 데이터 전송 속도를 조절한다.

 

UDP (User Datagram Protocol)

 

비연결형: UDP는 데이터 전송 전에 연결을 설정하지 않기 때문에 빠른 데이터 전송이 가능합니다.

신뢰성 X: 데이터의 손실이나 순서 보장을 하지 않는다. 패킷이 손실되거나 순서가 바뀌어도 애플리케이션이 이를 처리해야 한다.

순서 보장 X: 패킷이 전송된 순서와 관계없이 수신된다. 따라서 수신 측에서 패킷을 재조립할 필요가 있을 수 있다.

낮은 오버헤드: 헤더가 작고 간단하여 네트워크 자원을 적게 사용한다. 이로 인해 빠른 전송이 가능하지만, 신뢰성이 떨어지게 된다.

 

TCP / UDP

 

 

 

버퍼 (Buffer)

데이터를 일시적으로 저장하는 메모리 공간으로, 네트워크 통신에서 데이터의 송수신을 원활하게 하기 위해 사용된다. 예를 들어, TCP 소켓에서 데이터를 수신할 때, 수신 버퍼에 데이터를 저장한 후 애플리케이션이 이를 읽어들인다.

 

  • 주요 목적

속도 차이 완화: 데이터 전송 속도와 애플리케이션 처리 속도 간의 차이를 보완한다.

데이터 손실 방지: 버퍼가 가득 차기 전까지 데이터를 저장하여 손실을 방지한다.

 

스트림 (Stream)

연속적인 데이터의 흐름을 의미한다. TCP는 연결 지향 프로토콜로, 데이터를 바이트 스트림 형태로 전송한다.

 

  • 특성

 

연속성: TCP는 데이터가 순서대로 전송되도록 보장한다. 따라서 수신 측에서는 보낸 순서대로 데이터를 읽을 수 있다.

세그먼트화: 큰 데이터는 작은 세그먼트로 나누어 전송되며, 수신 측에서 이를 다시 조립한다.

신뢰성: TCP는 오류 검출 및 수정 기능을 제공하여 데이터의 무결성을 보장한다.

 

데이터 분할

세그멘테이션: 전송할 데이터는 너무 클 경우 세그먼트(조각)로 나눠야 한다. TCP에서는 이 과정을 세그멘테이션이라고 하며, 각 세그먼트에는 순서 번호가 붙여진다.

 

패킷 생성

세그먼트가 생성되면, 이를 패킷으로 감싸게 되는데, 패킷은 일반적으로 헤더(header)페이로드(payload)로 구성된다.

  • 헤더: 패킷의 메타데이터로, 데이터의 출발지 및 목적지 주소, 프로토콜 정보, 순서 번호, 오류 검출 코드 등이 포함된다. 헤더의 크기는 프로토콜에 따라 다르며, TCP, UDP, IP 각각의 헤더 형식이 존재한다.
  • 페이로드: 실제 전송할 데이터. 사용자의 요청, 응답 또는 기타 데이터를 포함한다.

 

직렬화와 역직렬화

  • 직렬화 (Serialization)

데이터 구조를 연속적인 바이트 스트림으로 변환하는 과정. 이는 데이터 전송, 저장, 또는 다른 시스템 간의 통신을 위해 필요하다. 직렬화를 통해 복잡한 데이터 구조(객체, 리스트 등)를 네트워크로 쉽게 전송할 수 있는 형태로 변환할 수 있다. 대표적으로 객체를 JSON이나 XML과 같은 형식으로 변환하는 예시가 있다 .

 

  • 역직렬화 (Deserialization)

직렬화된 데이터를 다시 원래의 데이터 구조로 변환하는 과정이다. 수신한 바이트 스트림을 해석하여, 애플리케이션에서 사용할 수 있는 형태로 변환한다. JSON 문자열을 객체로 변환하는 과정이 역직렬화다.

 

프로토콜 버퍼 (Protocol Buffers)

Google에서 개발한 데이터 직렬화 포맷. JSON이나 XML보다 더 간결하고 효율적이며, 다양한 언어에서 사용할 수 있다.

  • 주요 특징

언어 중립성: 다양한 프로그래밍 언어(C++, Java, Python 등)에서 사용 가능하다.

빠른 직렬화/역직렬화: 이진 형식으로 데이터를 저장하므로, JSON이나 XML보다 더 빠르게 처리할 수 있다.

스키마 기반: 데이터를 구조화하기 위해 스키마 파일을 정의한다. 이를 통해 데이터의 형식과 구조를 명확히 하고, 버전 관리를 용이하게 한다.

데이터 전송

 

라우팅: 패킷은 네트워크를 통해 전송되는데, 이 과정에서 여러 중간 장치(라우터 등)를 거치며, 최적의 경로를 선택해 목적지까지 이동하게 된다.

프로토콜: TCP와 UDP와 같은 프로토콜이 데이터 전송 방식에 영향을 미친다. TCP는 신뢰성과 순서 보장을 제공하지만, UDP는 더 빠른 전송을 가능하게 한다.

 

수신 측 처리

 

패킷 수신: 수신 측에서는 네트워크 인터페이스 카드(NIC)가 패킷을 감지하고 이를 OS의 네트워크 스택으로 전달한다.

패킷 조립: 패킷이 순서대로 도착하지 않을 수 있기 때문에, TCP의 경우, 순서를 보장하기 위해 순서 번호를 기반으로 패킷을 재조립한다.

오류 검출 및 수정: 패킷의 오류를 검출하기 위해 체크섬과 같은 방법이 사용된다. 오류가 발견되면 패킷 재전송을 요청한다.

애플리케이션 전달: 모든 패킷이 조립되고 검증되면, 최종적으로 애플리케이션 레이어로 전달되어 사용된다.

 

레이턴시

레이턴시(latency)는 데이터가 한 지점에서 다른 지점으로 전송되는 데 걸리는 시간을 의미한다. 보통 밀리초(ms) 단위로 측정되며, 낮은 레이턴시가 더 빠른 응답성을 의미하고  높은 레이턴시는 지연된 반응을 초래할 수 있다.  예를 들어, 온라인 게임이나 비디오 스트리밍에서는 레이턴시가 매우 중요하다. 네트워크 통신에서 레이턴시는 여러 요소에 영향을 받을 수 있으며, 일반적으로 다음과 같은 구성 요소로 나누어질 수 있다.

 

  • 전송 지연 (Transmission Delay)

데이터가 네트워크 매체를 통해 전송되는 데 걸리는 시간. 패킷의 크기와 네트워크 대역폭에 따라 달라진다.

  • 전파 지연 (Propagation Delay)

신호가 네트워크 매체를 따라 이동하는 데 걸리는 시간으로, 물리적인 거리와 신호의 전파 속도에 의존한다.

  • 처리 지연 (Processing Delay)

라우터나 스위치 등 네트워크 장비가 패킷을 처리하는 데 소요되는 시간입니다. 패킷을 수신하고, 라우팅 결정을 내리며, 큐에 넣는 과정에서 발생한다.

  • 대기 시간 (Queuing Delay)

패킷이 네트워크 장비의 큐에서 대기하는 시간입니다. 네트워크가 혼잡할 때 발생할 수 있다.

 

레이턴시 마스킹

사용자가 경험하는 지연을 숨기거나 줄이기 위해 사용하는 기술. 이 방법은 실제 작업이 완료되는 시간을 최소한으로 느끼게 하여 사용자 경험을 개선하는 데 도움을 준다.

  • 프리로드(Preloading): 필요한 데이터를 미리 로드하여 사용자가 요청할 때 즉시 제공할 수 있도록 한다.
  • UI 반응성 개선: 사용자 인터페이스(UI)에서 입력에 대한 피드백을 즉시 제공하여 사용자가 기다리고 있다는 느낌을 줄인다. 예를 들어, 버튼 클릭 시 로딩 애니메이션을 보여줄 수 있다.
  • 스레딩: 긴 작업을 별도의 스레드에서 실행하여 메인 스레드가 사용자 입력을 처리할 수 있도록 한다.
  • 비동기 요청: 네트워크 요청을 비동기적으로 처리하여 UI가 멈추지 않도록 한다. 사용자에게 다른 작업을 계속할 수 있는 여유를 제공하는 것이다.

 

성능 최적화

시스템이나 애플리케이션의 효율성을 극대화하여 더 나은 성능을 얻기 위한 다양한 기술과 방법을 말한다. 주요 목표는 응답 시간 감소, 처리량 증가, 자원 사용 최적화 등이 있다.

  • 코드 최적화: 알고리즘과 데이터 구조를 개선하여 실행 시간을 단축.
  • 캐싱: 자주 사용하는 데이터나 결과를 메모리에 저장하여 재사용함으로써 처리 시간을 줄인다.
  • 로드 밸런싱: 여러 서버에 부하를 분산시켜 성능을 향상시키고, 한 서버에 과부하가 걸리는 것을 방지.
  • 비동기 처리: I/O 작업을 비동기적으로 처리하여 애플리케이션의 블로킹을 최소화.
  • 데이터베이스 최적화: 쿼리 성능 개선, 인덱싱 등을 통해 데이터베이스 접근 시간을 줄인다.

 

 

 

 

 

'CS' 카테고리의 다른 글

프로세스(Process) / 스레드(Thread) ?  (0) 2024.11.08
면접 질문 연습하기(2)  (1) 2024.10.25
객체 지향?  (0) 2024.10.16
IOCP?  (1) 2024.10.15
메모리?  (9) 2024.10.08