TCP에서..

moonzoo의 이미지

TCP 소켓 프로그래밍에서..

TCP에서는 메시지의 경계가 분명치 않은 것으로 아는데여..

예를 들어 보내는 쪽에서 100, 200, 100, 200, 100, 200등과 같이

보낸다 해도..

받는 쪽에서는 100,100,100,200등 과 같이 다르게 받을 수 있습니다.

이런 문제 때문에 메시지 않에 길이를 포함해서 보낸다던지..

구분할 만한 토큰을 넣어서 보낸다 던지 하는데여..

좀더 다른 방법은 없을까여?

서지훈의 이미지

performance에 크게 지장을 바받는게 아니라면은...
A B
send------------> read

read<------------send

위와 같은 식으로 구성을 해보시는 것도 괜찮을거 같네요.
A에서는 실제로 보낼 data를 담고.
B에서 보내는 것은 잘 받았다면 ACK packet 정도면 될것 같네요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

sunyzero의 이미지

이런 문제때문에 헤더를 구성해서 보통 몇 바이트를 보내겠다. 혹은 어떤 식으로 날라간다고 미리 보내고나서 fixed size 의 헤더를 읽어들인뒤 다음 몇바이트를 읽는 그런 방식을 주로 사용합니다.

그리고 무작정 안오는 데이터를 기다리는 것도 문제니까 타임아웃을 두고 너무 오랫동안 데이터가 안오면 에러처리하기도 합니다. 이런 경우는 데이터 재요청이라든지 뭐 그런식으로 하죠.

이전에 논의된 적이 있으니 한번 검색해보시요...
vmware로 돌려서 그런지 조금 느리군요. -_-)

========================================
* The truth will set you free.

moonzoo의 이미지

결국 TCP쪽은 데이타 주고 받을 때

스펙에 어느 정도 의존적일수 밖에 없겠네요..

만능 Receiver 를 만들려던 꿈--;은 잠시 접어야 겠네여 ㅋ

mach의 이미지

UDP를 TCP로 잘못 말씀하고 계신듯하군요.
UDP라면 님이 말씀하신 문제가 있습니다. 즉, 순서가 바뀌어 갈수 있지요.
다른하나는 메시지의 경계문제인데, 이또한 질문이 모호합니다.
다시 정리해서 질문하시지요.

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

moonzoo의 이미지

Quote:

UDP를 TCP로 잘못 말씀하고 계신듯하군요.
UDP라면 님이 말씀하신 문제가 있습니다. 즉, 순서가 바뀌어 갈수 있지요.

TCP 에 대해서 문의한거 맞습니다.

제가 질문에서 드린 예시는 순서가 바뀐것을 예로 들은 것이

아니라.. TCP에서의 경계의 문제

(한번에 보낸것 만큼 한번에 받는 다는 보장이 없음)

때문에 받는 쪽에서

보낸 것 만큼이 아닌 다르게 받을 수 있다는 것에 대해

예를 든겁니다......

charsyam의 이미지

TCP의 특징 상, 어쩔 수 없습니다. 헤더를 추가해서 보내든지, 토큰으로 짜르든지. 특별한 방법은 없는거 같네요. 보통, 온라인 게임 같은 것들도, 구현자에 따라서 위의 두 가지 방법을 씁니다.

UDP는 특징상 보낸 데이터는 안 짤리고 한번에 갑니다. 단, 어떤 순서로 갈지 모르죠.(혹은 안 갈지도) ^^ 그럼 고운 하루...

=========================
CharSyam ^^ --- 고운 하루
=========================

mach의 이미지

아, 그러셨군요. 님의 질문내용중 숫자 배열을 읽어 보다 보니 제가 그런 문제를 제기했었습니다. 거두절미하고 제가 주로 사용했던 유형을 간단히 소개하겠습니다.참고하시길.

1) 고정사이즈 패킷(특정 프로토콜 포맷사용, 거대 패킷도 분할및조합으로 수용토록함)
2) 특정 패턴 구분자 사용
저는 1),2)를 둘다 사용해서 프로그래밍합니다.

1)을 구지 사용하는 이유는 예전에 당해(?) 보았던 공격유형때문입니다. 예를들어, 만일 #으로 구분된 토큰리스트로 이뤄진 프로토콜을 만든다면
다음 시나리오가 예측될 수 있습니다.
서버 : #이라는 구분자를 대기
해커 : (....무지큰양...)# 을 전송
서버 : 견디거나(클라이언트 죽이기?), 죽거나.....
위처럼 버퍼오버플로우 공격에 아주 민감한 경우가 있습니다. 버퍼 오버플로우라면, 웬만한 서버는 세그멘테이션폴트 하고 죽는 경우가 많지요. 여기저기 손봐야하고 귀찮은 문제가 발생할 수 있습니다.
그래서 TCP라 할지라도 그 상위에 프로토콜을 덧입혀서 개발합니다. 또, 특정 포맷을 만들면(바이트단위라던가...) 프로토콜을 외부에서 해석하기 어려운(반면 관리자는 좋겠지요)점이 장점입니다. 또한, 코드화될것이므로 통신 전송양이 줄겠지요.

2) 특정패턴 구분자 사용
이는 프로그램의 편의상 사용하지요. 때로 1)을 확장해서 그냥 쓰기도 한답니다.

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.