아, 그러셨군요. 님의 질문내용중 숫자 배열을 읽어 보다 보니 제가 그런 문제를 제기했었습니다. 거두절미하고 제가 주로 사용했던 유형을 간단히 소개하겠습니다.참고하시길.
1) 고정사이즈 패킷(특정 프로토콜 포맷사용, 거대 패킷도 분할및조합으로 수용토록함)
2) 특정 패턴 구분자 사용
저는 1),2)를 둘다 사용해서 프로그래밍합니다.
1)을 구지 사용하는 이유는 예전에 당해(?) 보았던 공격유형때문입니다. 예를들어, 만일 #으로 구분된 토큰리스트로 이뤄진 프로토콜을 만든다면
다음 시나리오가 예측될 수 있습니다.
서버 : #이라는 구분자를 대기
해커 : (....무지큰양...)# 을 전송
서버 : 견디거나(클라이언트 죽이기?), 죽거나.....
위처럼 버퍼오버플로우 공격에 아주 민감한 경우가 있습니다. 버퍼 오버플로우라면, 웬만한 서버는 세그멘테이션폴트 하고 죽는 경우가 많지요. 여기저기 손봐야하고 귀찮은 문제가 발생할 수 있습니다.
그래서 TCP라 할지라도 그 상위에 프로토콜을 덧입혀서 개발합니다. 또, 특정 포맷을 만들면(바이트단위라던가...) 프로토콜을 외부에서 해석하기 어려운(반면 관리자는 좋겠지요)점이 장점입니다. 또한, 코드화될것이므로 통신 전송양이 줄겠지요.
2) 특정패턴 구분자 사용
이는 프로그램의 편의상 사용하지요. 때로 1)을 확장해서 그냥 쓰기도 한답니다.
[하양] sync를 맞춰서 하는 방법이...
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);
이전에도 나온것 같은데...
이런 문제때문에 헤더를 구성해서 보통 몇 바이트를 보내겠다. 혹은 어떤 식으로 날라간다고 미리 보내고나서 fixed size 의 헤더를 읽어들인뒤 다음 몇바이트를 읽는 그런 방식을 주로 사용합니다.
그리고 무작정 안오는 데이터를 기다리는 것도 문제니까 타임아웃을 두고 너무 오랫동안 데이터가 안오면 에러처리하기도 합니다. 이런 경우는 데이터 재요청이라든지 뭐 그런식으로 하죠.
이전에 논의된 적이 있으니 한번 검색해보시요...
vmware로 돌려서 그런지 조금 느리군요. -_-)
========================================
* The truth will set you free.
답변 감사합니다.
결국 TCP쪽은 데이타 주고 받을 때
스펙에 어느 정도 의존적일수 밖에 없겠네요..
만능 Receiver 를 만들려던 꿈--;은 잠시 접어야 겠네여 ㅋ
질문이 이상하군요?
UDP를 TCP로 잘못 말씀하고 계신듯하군요.
UDP라면 님이 말씀하신 문제가 있습니다. 즉, 순서가 바뀌어 갈수 있지요.
다른하나는 메시지의 경계문제인데, 이또한 질문이 모호합니다.
다시 정리해서 질문하시지요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
의도를 잘못 파악하신 듯..
TCP 에 대해서 문의한거 맞습니다.
제가 질문에서 드린 예시는 순서가 바뀐것을 예로 들은 것이
아니라.. TCP에서의 경계의 문제
(한번에 보낸것 만큼 한번에 받는 다는 보장이 없음)
때문에 받는 쪽에서
보낸 것 만큼이 아닌 다르게 받을 수 있다는 것에 대해
예를 든겁니다......
TCP의 특징 상, 어쩔 수 없습니다. 헤더를 추가해서 보내든지, 토큰으
TCP의 특징 상, 어쩔 수 없습니다. 헤더를 추가해서 보내든지, 토큰으로 짜르든지. 특별한 방법은 없는거 같네요. 보통, 온라인 게임 같은 것들도, 구현자에 따라서 위의 두 가지 방법을 씁니다.
UDP는 특징상 보낸 데이터는 안 짤리고 한번에 갑니다. 단, 어떤 순서로 갈지 모르죠.(혹은 안 갈지도) ^^ 그럼 고운 하루...
=========================
CharSyam ^^ --- 고운 하루
=========================
저의 사례를 들어드리면
아, 그러셨군요. 님의 질문내용중 숫자 배열을 읽어 보다 보니 제가 그런 문제를 제기했었습니다. 거두절미하고 제가 주로 사용했던 유형을 간단히 소개하겠습니다.참고하시길.
1) 고정사이즈 패킷(특정 프로토콜 포맷사용, 거대 패킷도 분할및조합으로 수용토록함)
2) 특정 패턴 구분자 사용
저는 1),2)를 둘다 사용해서 프로그래밍합니다.
1)을 구지 사용하는 이유는 예전에 당해(?) 보았던 공격유형때문입니다. 예를들어, 만일 #으로 구분된 토큰리스트로 이뤄진 프로토콜을 만든다면
다음 시나리오가 예측될 수 있습니다.
서버 : #이라는 구분자를 대기
해커 : (....무지큰양...)# 을 전송
서버 : 견디거나(클라이언트 죽이기?), 죽거나.....
위처럼 버퍼오버플로우 공격에 아주 민감한 경우가 있습니다. 버퍼 오버플로우라면, 웬만한 서버는 세그멘테이션폴트 하고 죽는 경우가 많지요. 여기저기 손봐야하고 귀찮은 문제가 발생할 수 있습니다.
그래서 TCP라 할지라도 그 상위에 프로토콜을 덧입혀서 개발합니다. 또, 특정 포맷을 만들면(바이트단위라던가...) 프로토콜을 외부에서 해석하기 어려운(반면 관리자는 좋겠지요)점이 장점입니다. 또한, 코드화될것이므로 통신 전송양이 줄겠지요.
2) 특정패턴 구분자 사용
이는 프로그램의 편의상 사용하지요. 때로 1)을 확장해서 그냥 쓰기도 한답니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기