2013-11-09 6 views
0

UDP로 Java에서 채팅을 구현했습니다. 배열 목록의 데이터를 다른 클라이언트에 보내는 스레드와 다른 클라이언트의 데이터를받는 스레드가 있습니다. 배열리스트는 메소드로 채울 수 있습니다.UDP 패킷 손실 수정

메시지를 보내려면 배열 목록에서 바이트 []가 선택되고 길이가 전송 된 다음 바이트가 전송됩니다.

이제 패킷 손실에 대해 생각하고 있습니다. 이를위한 수정을 어떻게 구현할 수 있습니까? 메시지를 다시 보내는 것은 매우 비효율적입니다. 메시지의 길이를 알고 있기 때문에 수신기가 메시지를받지 못하면 메시지를 다시 보낼 수 있습니다. 그러나 두 클라이언트 모두에서 두 번째 소켓이 필요하므로 수신기와 발신자가 두 개의 스레드가됩니다. 또 다른 문제는 데이터의 길이가 손실되고 데이터 패키지가 읽히는 패킷 길이가 길 때 발생합니다.

어떻게 구현할 수 있습니까?

는라는 TCP위한 간단하고 잘 테스트 프로토콜이 있습니다

+1

UDP 구멍 펀칭을하는 것은 TCP를 사용하지 않는 이유가 아니며 두 개의 스레드가 있다는 사실은 두 번째 소켓이 필요한 이유가 아닙니다. – EJP

답변

0

(TCP 내가 UDP 홀 펀칭을 좋아 해결책 원인입니다). TCP와 UDP의 유일한 (관련성이있는) 차이점은 TCP가 패킷 손실 (및 유사)에 대한 수정을 가지고 있고 UDP가 그렇지 못하기 때문입니다.

패킷 손실이 응용 프로그램과 관련이없는 경우 UDP를 으로 지정해야합니다. 만 사용해야합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 그건 도움이되지 않습니다. UDP 구멍 펀칭을하고 있기 때문에 UDP에 대한 해결책이 필요합니다. – Geosearchef

0

아마도 시퀀스 번호로 작업해야합니다. 새 메시지가 생성되면 시퀀스 번호와 함께 보내십시오. 다른 피어가 누락 된 일련 번호를 발견하면 다른 피어로부터 누락 된 메시지를 요청하려고 시도해야합니다. 물론 재시도를 제한하고 적절한 시간 초과를 사용하여 순차 번호가 더 이상 사용 가능하지 않거나 끊임없이 실패하는 경우에도 처리 할 수 ​​있어야합니다. 또한 다른 피어는 "시퀀스 번호를 사용할 수 없음"으로 대답 할 수 있습니다.

기본적으로 이것은 TCP가 수행하는 것과 유사합니다. 따라서 TCP가 신뢰할 수있는 패킷 전송을 처리하는 방법을 살펴보면 사용 사례에 맞는 솔루션을 찾을 수 있습니다.

단순화 된 TCP는 패킷을 버퍼에 보관하여이를 해결합니다. 다른 피어가 수신을 확인한 경우 패킷이 버퍼에서 제거됩니다. 누락 된 패킷을 발견하면 다른 피어가 버퍼 재전송을 요청할 수 있습니다. 이를 감지하기 위해 수신자는 또한 버퍼를 사용합니다. 버퍼가 가득 차면 패킷 전송이 일시 중지됩니다. 그래서 (위성 링크와 같은) 긴 지연 고속 링크의 파이프 라인을 가득 채우고 최대 처리량으로 링크를 활용하려면 더 큰 버퍼가 필요합니다. 이것이 당신이 필요로하는 것이 아니며 오직 하나의 메시지만을 처리하기 때문에 단순화 할 수 있습니다 : 버퍼는 시퀀스 카운터가 동기화되어있는 완벽한 채팅 기록이며 처리량이없고 신뢰할 수있는 전송 만 필요합니다.