응용프로그램 계층의 간단한 프로토콜 설계 시 참고할만한 서적

aw2310의 이미지

응용계층의 프로토콜 설계를 하려고 하는데 참고할만한 책이나 자료에 대해서 조언을 얻을 수 있을까 싶어서 글을 올립니다.

보통 시리얼 통신이나 소켓을 이용한 통신 프로그램을 만드는 경우에 응용프로그램 계층의 간단한 프로토콜을 만들어서 사용하곤 하지요...

예를 들어 파일을 양쪽간에 전송한다고 했을때..

파일이름 먼저 전송하고, 그 다음에 파일의 각 조각을 전송하고, 또 전송받는 측에서는 각 패킷들이 에러없이 잘 왔나 검사하면서 Ack를 보내거나 하는 등의 간단한 프로토콜을 작성할 수 있을 것입니다.

그동안 그냥 간단한 시리얼 통신 프로그램을 만들때 제가 임의로 프로토콜을 정해서 이런 프로그램들을 만들어왔는데요.

한가지 의문점은 만약 데이터 중에 헤더로 사용하는 바이트열이 들어간 경우 프로그램에서 파싱하는 과정에서 에러가 생길 것입니다. 이런 경우 어떻게 처리하는지...

그동안은 일치할 확률이 적을 것이라고 생각하는 좀 긴 헤더문자열을 지정해서 썼는데... 보내는 데이터에서 그 헤더문자열이 없다는 보장을 100% 할수 없지 않습니까?

이런 사안들에 관해서, 즉 프로토콜 설계하는데 있어서 참고할 만한 자료라든가 잘 설명해 놓은 책이라든가 있는지 알고 싶습니다.

정보통신 공학과 같은데에서는 프로토콜 설계에 대해서 따로 하나의 과목으로 배운다고 들은 것 같은데요..

혹시 이에 관련해서 아시는분은 조언을 부탁드립니다.

prolinko의 이미지

미리 전송할 데이터의 싸이즈를 보내거나 터미네이션 캐릭터 시퀀스를 정해놓으면 어디가 끝인지 알수 있지요. 마지막에 체크썸을 같이 보낸다면 잘못된 데이터를 받았을 경우 알수 있고 리커버리를 할 수 있습니다.

정보통신 책들도 있겠지만 실제 프로토콜 스팩을 보는 것도 도움이 됩니다. 작성할려는 어플리케이션의 기능과 비슷한 프로토콜을 하나 보면 되죠. 간단한 걸루... 파일전송이라면 ftp나 더 간단한 tftp같은 rfc 스팩을 보시고 여기에 멀티 포트 동시 전송 같은 기능을 추가 할 수도 있겠죠.

dotri의 이미지

aw2310 wrote:
한가지 의문점은 만약 데이터 중에 헤더로 사용하는 바이트열이 들어간 경우 프로그램에서 파싱하는 과정에서 에러가 생길 것입니다. 이런 경우 어떻게 처리하는지...

그동안은 일치할 확률이 적을 것이라고 생각하는 좀 긴 헤더문자열을 지정해서 썼는데... 보내는 데이터에서 그 헤더문자열이 없다는 보장을 100% 할수 없지 않습니까?

Escape 문자를 두어서 제어하죠 보통.
대표적인 예로는, printf() 함수에서 '\' 문자나 '%' 문자가 대표적인 Escape 문자입니다. 이들은 출력하려는 데이터와는 별개로, 어떤 동작이나 행동을 지시하기 위해 사용되는데.. 출력하는 데이터에 이 문자가 들어가있으면 이게 데이터인지 지시문인지 알기가 애매하죠. 그래서 \\ 라던가 %% 라는 방법으로 데이터와 지시문을 구분하죠.

익명 사용자의 이미지

Quote:
그래서 \\ 라던가 %% 라는 방법으로 데이터와 지시문을 구분하죠

음.. 만약 그림 파일이나 실행파일 같은 바이너리 파일을 패킷으로 나눠서 보내는 경우라고 생각한다면.. 말씀하신 escape 문자열인 \\라던가 %%과 같은 바이트값들이 패킷에 포함되어 있을수 있잖습니까? escape 기호는 파일전송과 같은 경우에는 적용되기 어려울 것 같습니다.

아니면 e-mail 보낼때 uuencode하고 uudecode 하는 것과 유사하게(?) 보내기 전에 패킷데이터의 헤더와 일치하는 바이트들이 있는지를 검사해보고 있으면 특정한 다른 바이트열로 바꿔두었다가 받는 쪽에서 다시 원래대로 하는것도 한 방법일 수 있겠습니다.

그런데.. 여기서 말한 '특정한 다른 바이트열' 이라는 것과도 우연히 일치하는 바이트열이 있으면 그건 어떻게 될까요?

음.. 갈수록 복잡해지는군요.

이런 고민을 누군가는 했고, 잘 정리도 해놨을것 같은데 잘 찾기가 쉽지 않습니다.

익명 사용자의 이미지

아래의 바로가기를 참고하세요.
2013년 1월 10일 기준입니다.

내용이 많으니, 웹 브라우저의 찾기 기능으로
프로토콜
을 검색해 보시는 것이 빠를 것입니다. 주로 TCP/IP 에 대한 것들이 많은데,

Multimedia Networking: Streaming Stored Audio/Video, Real-time audio 전송 원리, 관련 프로토콜(RTSP, RTP/RTCP, SIP) 개요, DiffServ/IntServ 개념
에 대한 내용도 배운다네요, 관련교재는...제목으로는 그다지 땡기지 않는군요...

http://ice.hufs.ac.kr/w/index.php/%EA%B5%90%EA%B3%BC%EB%AA%A9_%EA%B0%9C%EC%9A%94#3-1_.EB.8D.B0.EC.9D.B4.ED.83.80.ED.86.B5.EC.8B.A0.EB.B0.8F.EC.8B.A4.ED.97.98

위의 바로가기가 댓글로 제대로 나오지 않는 관계로 아래에 여러줄로 나눠붙입니다.
한줄로 붙여서 웹브라우저 주소창에 입력해 보세요.

http://ice.hufs.ac.kr/w/index.php/%EA%B5%90%EA%B3%BC%EB%AA%A9_
%EA%B0%9C%EC%9A%94#3-1_
.EB.8D.B0.EC.9D.B4.ED.83.80.ED.86.B5.EC.8B.A0.EB.B0.8F.EC.8B.A4.ED.97.98

mach의 이미지

aw2310 wrote:

"한가지 의문점은 만약 데이터 중에 헤더로 사용하는 바이트열이 들어간 경우 프로그램에서 파싱하는 과정에서 에러가 생길 것입니다. 이런 경우 어떻게 처리하는지...
그동안은 일치할 확률이 적을 것이라고 생각하는 좀 긴 헤더문자열을 지정해서 썼는데... 보내는 데이터에서 그 헤더문자열이 없다는 보장을 100% 할수 없지 않습니까?
이런 사안들에 관해서, 즉 프로토콜 설계하는데 있어서 참고할 만한 자료라든가 잘 설명해 놓은 책이라든가 있는지 알고 싶습니다."

라고 하셨는데, 전송전 이미 데이터를 알고 있으므로, 이 데이터 전체에 대해 Byte Stuffing(위의 escape처리와 유사)를 시행(인코딩)하게 되면,
데이터는(데이터 내부에는) 이제 더이상 헤더와 같은 데이터(제어문자)를 가지지 않게 되겠지요. 또는, 인코딩될 것입니다.
이렇게 만들어진 (질문자 표현상 "헤더"와 "동일데이터 없는") 데이터에 헤더를 붙여 전송합니다.
(수신은 역순입니다.)

보다 자세히는, Byte Stuffing 또는 Bit Stuffing으로 KLDP에서 검색해보세요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

shint의 이미지

KLDP는 링크와 소스가 불편합니다.

http://ice.hufs.ac.kr/w/index.php/%EA%B5%90%EA%B3%BC%EB%AA%A9_%EA%B0%9C%EC%9A%94
http://ice.hufs.ac.kr/w/index.php/%EA%B5%90%EA%B3%BC%EB%AA%A9_%EA%B0%9C%EC%9A%94#3-1_.EC.9A.B4.EC.98.81.EC.B2.B4.EC.A0.9C

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.