[Network] 스트림과 메시지

연두비두밥·2024년 4월 1일
post-thumbnail

OSI 모델의 계층 2에서는 데이터 단위를 프레임이라 하고, 계층 3에서는 패킷이라고 한다. 네트워크나 서버 앱 개발시에는 직접 다룰 일이 흔하지 않다. 그 대신 스트림과 메시지 라는 것을 다룬다.

스트림 형식

  • 스트림(Stream)이란 데이터의 흐름이다.
    두 단말기를 연결한 후 그 연결을 끊기 전까지 한쪽에서 다른 한쪽으로 연결된 데이터 흐름 하나를 일컫는다.
    스트림은 파일 읽기, 쓰기에서 언급하는 스트림과 같다.

  • 컴퓨터 네트워크에서 스트림 개념은 송수신 횟수, 크기가 불일치 할 수 있다.

    즉, 보낸 개수와 받는 개수가 다를수 있고, 보낸 데이터의 시작과 받는 데이터의 시작이 다를 수도 있다. 하지만 결국 받은 데이터를 모두 이어 붙이면 보낸 데이터를 이어 붙인 것과 같다.
    거의 모든 인터넷 프로그램은 이러한 특징을 고려할 수 밖에 없다. TCP 프로토콜이 이러한 성질을 가지기 때문이다.
    따라서 스트림 형식으로 데이터를 송수신할 때, 데이터가 여러 부분으로 나뉘어 있다면 보낼 크기나 시작 끝을 알리는 특정 기호를 추가하는등 개별적인 정의가 필요하다.

헤더를 붙이는 방식
  • 첫 2바이트에는 보낼 데이터의 크기를 담는다.
  • 이어서 보낼 데이터를 담는다.
구분자(delimirer)을 이용하는 방식
  • 보낼 데이터를 담는다.
  • 이어서 구분자를 담는다.
구분자를 사용하는 경우 데이터에는 구분자와 같은 값이 없어야한다. 

메시지 형식

  • 스트림과 달리 메시지는 자체적으로 데이터 시작과 끝을 구별할 수 있다.
    따라서 보내는쪽에서 aaa,bbb,ccc를 보내면 받는 쪽에서는 aaa,bbb,ccc를 받는다. 보낸 개수와 받는 개수가 같으며, 보낸 데이터와 받는 데이터의 시작과 끝은 같다. 이런식으로 각 데이터가 정확히 구별되는 것을 메시지 형식이라고 한다.
    (여러 필드로 나누어서 사용)

    네트워크 게임에서는 특정 시점에서 사건을 알리는 경우가 많다. 그러다 보니 메시지 형식의 데이터 송수신이 보편적이다.

IP 패킷의 특징

  • OSI 모델 계층 3의 IP 패킷을 직접 다루는 일은 흔하지 않지만, IP 패킷의 특징 정도는 알고가자
    IP패킷에는 주고 받는 데이터, 즉 페이로드의 크기와 송신자 주소, 수신자 주소, 체크섬(checksum)등이 있다.
  • 수신자 주소 : 수신 측 단말기까지 전달할 때 라우터에서 필요한 정보
  • 송신자 주소 : 수신측 단말기까지 도착한 후 수신자 측에서 송신자를 식별하는 용도

  • IP 패킷 하나의 크기는 제한되어 있다. 크기 제한은 라우터마다 다르지만 보통 1300바이트 정도로, 작게는 600바이트부터 크게는 9000바이트까지 이른다. 이처럼 IP 패킷의 크기는 제한적이다.
    하지만 스트림이나 메시지에서는 이러한 제한이 없다!
    그 이유는 운영체제에 내장된 네트워크 모듈인 네트워크 스택에서 우리 프로그램이 보내고 받는 스트림과 메시지를 관리해주기 때문이다.

EX

매우 긴 스트림을 송신할 때

  • 운영체제는 이를 IP 패킷의 크기 제한에 맞추어 여러 조각을 낸다(단편화)
  • 각 조각은 IP 패킷 하나하나가 되어 받는 쪽에 송신한다.
  • 받는 쪽에서는 이 조각을 받아 조립한 후 스트림 형태로 복원한다.(이 과정도 운영체제 안에서 진행)
  • 마지막으로 조립된 스트림은 프로그램으로 넘어가 처리한다.
    => 해당 과정은 스트림뿐만 아니라 메시지나 데이터그램도 마찬가지

게임서버프로그래밍 교과서 참조

profile
꾸준하고 싶은 사람

0개의 댓글