패킷 통신에서요, 기대했던 바이트 사이즈만큼 패킷이 수신되지 않았을 때, 그걸 알 수 있는 방법이 있나요?
패킷통신 - UDP 이용 - 프로그램을 짜 보려 하는데요 ( 일종의 채팅 프로그램입니다. )
패킷을 읽는 부분을 만드려다... 문제점이 해결되지 않아 글을 올립니다.
만일 기대했던 바이트 사이즈만큼 패킷이 수신되지 않았을 때, 그걸 알 수 있는 방법이 있나요?
일단 개념적으로는요,
1. Sender쪽에서는 패킷 맨 앞에 size를 기록한다. (이것도 1500 byte만 되나요? UDP는 MAX 1500byte인걸로 아는데요. -_-;)
2. write()를 이용, 패킷을 보낸다. 단, 패킷이 일정 길이를 넘을 경우, 자른다. ( Packet serial no 를 추가할 예정입니다만, 이건 관계없는 이야기이니 넘어가구요)
3. Receiver 쪽에선 최초 X바이트를 읽어, packet 전체 길이를 알아낸다.
4. 그 후, 알아낸 전체 길이 - X 만큼 읽어낸다.
이런 식으로 만들 생각인데요, 걱정되는건 이하의 경우입니다.
1. Sender 1이 100 Byte송신
2. 무언가의 이유로 Receiver쪽에서는 50Byte만 수신. ( 50 Byte loss )
3. 절묘한타이밍으로 Sender 2가 200Byte송신
4. Receiver는 Sender 2가 보낸 200Byte의 최초 50Byte를 Sender 1의 50Byte로 오해.
이런 현상을 막으려면, CRC같은 걸 쓰는 수 밖에 없나요? 아니면 UDP도 TCP/IP처럼 전송보장해 주나요? 그냥 전송순서만 신경쓰면 되는건가요?
개념없는 질문이어서 죄송합니다. 혹시 아시는 분 있으시면 가볍게 한 수 부탁드립니다.
그럼, 좋은 하루 되시기 바랍니다.
프로토콜 설계할때
프로토콜 설계할때 알아서 정의하셔야 합니다.
packet의 총길이를 앞에 적어 보내거나, 아님 패킷 구조를 크기가 정해지는 형태로 만들어야죠.(특정필드뒤에 특정필드가 따라오는 등)
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
ㅇㅇ
윗분 말이 맞습니다.
객체로 정한후 날리는것이 어떨까요?
멍청한 생각갖지만 저같은 경우는
자바에서 제공하는 압축형태로 압축한뒤(객체상태)
소캣을통해 날렸습니다.
다만 문제는
raw정보 -> 압축 하기 -> 보내기 -> 받기 -> 압축 풀기 -> raw 정보
좀 요상한 프로시져 -ㅅ-
---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.
http://jihwankim.co.nr
여러 프로그램 소스들이 있습니다.
필요하신분은 받아가세요.
tcp/ip와는 다르게
tcp/ip와는 다르게 udp는 오면 오고 안오면 안오고 둘중에 하나입니다.
즉.. tcp와 같이 절반씩 나뉘어서 오는게 아니라 한꺼번에 다 옵니다. 따라서 길이에 대한
체크는 하지 않으셔도 됩니다.
하지만 대신 데이터가 변조되어서 올수도 있습니다. 그리고 아예 안올수도 있습니다. 또는 보내는 측에서 보낸 순서대로 안오고 뒤죽박죽 되서 올수도 있습니다. 또한 한번에 보낼수 있는 데이터 크기가 그렇기 크지 않습니다. 전송가능한 데이터 크기는 목적지까지 가는 동안 통과하는 라우터의 능력에 따라 달라지지만 말씀하신 1500바이트 정도면 대부분의 라우터가 처리 가능합니다.
그래서 udp를 쓰는 경우에는 신뢰성이 없으므로 보내는 측에서 신뢰성을 회복할 수 있을 만큼
정상적인 데이터를 자주 보내줘야합니다.
받는 측에서는 보내온 데이터가 정상적인 데이터인지(보내는 측에서 crc같은 것을 같이 보내줘야겠죠) 체크후
정상적인 데이터라면 처리를 하고 복구가능하다면 복구하여 사용하고 아니라면 버리고 다음 데이터를 기다려야합니다.
그렇기 때문에 채팅과 같이 반드시 데이터가 전송되어야 하는 경우에는 udp는 별로 추천해드리고 싶지 않습니다.
물론 reliable udp과 같이 신뢰성 있는 udp 구현 방법도 있지만 결국은 tcp/ip를 재구현하는것과 같은 형식이므로
연구 또는 테스트 목적이 아니시라면 채팅은 그냥 tcp/ip를 사용하시길 권해드립니다. :)
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
.
udp 로 최대한 환경을 생각해준다면 1300 바이트 정도가 적당하다고 생각됩니다.
vlan 이나 vpn 등의 환경을 타다보면 꼭 잘리기 떄문에 -_-;;;
------------------------------------------------------------------------------------------------
Life is in 다즐링
------------------------------------------------------------------------------------------------
Life is in 다즐링
댓글 달기