TCP-IP 윈도우 소켓 프로그래밍

[TCP/IP] 5장. 데이터 전송하기

민돌v 2021. 4. 14. 14:49

응용 프로그램 프로토콜과 데이터 전송

1. 응용 프로그램 프로토콜

  • 응용프로그램 프로토콜은, 응용 프로그램 수준에서 주고받는 데이터의 형식과 의미 그리고 처리 방식을 정의한 프로토콜이다.

 

  1. TCP/IP 표준 프로토콜과 비슷하나, 응용 프로그램마다 자유롭게 정의한다는 점, 즉 표준화되어있지 않다는 점이 다르다.
  2. 응용 프로그램 프로토콜의 기본은 "주고받을 메시지 형식"을 정하는 것이다.

ex) 그림판

[주고 받아야할 정보]

1. 직선의 시작과 끝

2. 선의 두께와 색상

 

struct DrawingMessage1
{
    int type; // = LINE
    int x1, y1; // 직선의 시작점
    int x2, y2; // 직선의 끝점
    int width; // 선의 두께
    int color; // 선의 색상
};
  • type : 보내는 쪽에서 어떤 데이터를 보낸는지 알 수 있게 표시한다.

 

2. 데이터 전송

  • 데이터 전송시 고려사항

1) 경계 구분

  • TCP처럼 메시지 경계를 구분하지 않는 프로토콜을 사용할 경우에는 응용 프로그램 수준에서 메시지 경계를 구분하기 위한 추가 작업을 해야 한다.

[경계구분의 4가지 방법]

  1. [고정길이 데이터] : 송신자는 항상 고정길이 데이터를 보낸다. 수신자는 항상 고정길이 데이터를 읽는다.
    • 구현이 쉽지만, 적절한 고정길이를 정하는데 어려움
    • 낭비하는 부분이 발생할 수 있음
    • 주고 받을 데이터의 길이 변동폭이 크지않으면 편리
  2. [가변길이 데이터] : 송신자는 가변 길이 데이터를 보내고 끝 부분에 특별한 표시(EOR)를 붙인다. 수신자는 EOR이 나올 때까지 데이터를읽는다. 
    • 생성될 데이터의 길이를 미리 알 수 없을 때 사용하기 적합
    • 데이터가 생성되는 즉시 곧바로 전송, 끝이라고 판단하면 EOR 전송
    • 몇 가지 문제점이 있음
      1. 데이터 중간에 EOR과 똑같은 패턴이 들어있으면 안된다.
      2. 데이터를 효율적으로 수신하는 방식을 고안하지 않으면 성능이 떨어짐
  3. [고정 + 가변] : 송신자는 보낼 데이터를 고정 길이 데이터로 보내고, 이어서 가변 길이 데이터를 보낸다. 수신자는 고정 길이 데이터를 읽어서 뒤따라올 가변 데이터의 길이를 알아내고, 이 길이만큼 데이터를 읽는다.
    • 구현도 쉽고, 처리 효율성도 높다.
  4. [데이터 전송 후 종료] : 송신자는 가변 길이 데이터 전송 후 접속을 정상 종료한다. 수신자느 recv()함수의 리턴 값이 0(=정상종료)이 될 때까지 데이터를 읽는다.
    • 한쪽에서 다른 쪽으로 일방적으로 데이터를 보내는 경우에 적당하다.
    • 데이터를 자주 전송하는 경우 비효율적

2) 바이트 정렬

  • 서로 다른 바이트 정렬 방식을 사용하는 시스템 사이에 데이터를 교환할 때는 바이트 정렬 방식을 통일해야하 한다.

3) 구조체 멤버 맞춤

  • 구조체 멤버 맞춤은 구조체 멤버의 메모리 시작 주소를 결정하는 컴파일러의 규칙이다.
  • 예를 들면, 아래와 같은 경우 10바이트가 아닌, 16파이트가 전송된다.

 

정확히 10바이트를 보내고자 한다면, #pragma pack 지시자를 사용해야 한다.