2014-08-31 5 views
2

UDP/Java 데이터 그램 채널 작동 방식에 대해 몇 가지 상충되는 점을 읽었습니다. 나는 몇 가지를 알아야합니다java 데이터 그램 채널 데이터 유실

  • 합니까 UDP는 경우 전체 수신 패킷을 말할 수있는 상속 방법이, 순서대로,라고 .read (의 ByteBuffer 나) 전에? 나는 UDP가 inherit'ly 불완전하거나 순서가 맞지 않는 데이터를 버리는 것을 말하는 적어도 하나의 기사를 읽었습니다.

  • 데이터 그램 채널은 하나의 송신 (버퍼 ..)을 하나의 데이터 그램 패킷으로 취급합니까? 그것의 부분적인 보내는 경우에 무엇?

  • .read (..)는 명령 인수로 주어진 버퍼가 하나의 데이터 패킷을 처리하도록 설계된 경우 데이터가 삭제되는 결과를 가져올 수 있습니까?

답변

5

합니까 UDP는 .read (의 ByteBuffer의 B)하기 전에, 전체를 받았으며, 순서에 패킷이 호출하면 알 수있는 [고유] 방법이? 나는 UDP가 inherit'ly 불완전하거나 순서가 맞지 않는 데이터를 버리는 것을 말하는 적어도 하나의 기사를 읽었습니다.

어느 쪽도 맞지 않습니다. IP에는 데이터 그램의 조각이 모두 도착했는지 알 수있는 방법이 있습니다. 그런 다음 UDP에 전달하기 만하면됩니다. 리 어셈블리는 UDP가 아닌 IP 계층의 책임입니다. 프래그먼트가 도착하지 않으면 UDP는 그것을 결코 보지 못합니다. 리 어셈블리가 완료되기 전에 만료되면 IP가 버립니다.

전/후 read()은 부적합합니다.

데이터 그램 채널은 send(buffer..)을 하나의 데이터 그램 패킷으로 취급합니까?

예.

부분 전송 인 경우 어떻게해야합니까?

UDP에는 그런 것이 없습니다.

read(..)는 UDP 읽기 정확하게 반환 단 하나 개의 데이터 그램, 또는 실패

하나 개 이상의 데이터 패킷을 읽을 수 있습니다.

명령 인수로 주어진 버퍼가 데이터 패킷 하나를 처리하도록 설계된 경우 데이터가 삭제됩니다.

일어날 수 없습니다.

완전히 다른 질문에 대한 아래 주석을 작성하십시오. 절단을 감지하는 일반적인 기술은 예상되는 가장 큰 데이터 그램보다 큰 버퍼를 사용하는 것입니다. 그런 다음 크기가 데이터 그램을 얻는다면 (i) 응용 프로그램 프로토콜 오류이고 (ii) 너무 잘 렸을 수 있습니다.

+1

"일어날 수 없습니다."api에서이 라인을 읽었습니다 : 주어진 버퍼에 남아있는 것보다 데이터 그램에 더 많은 바이트가 있다면, 데이터 그램의 나머지는 조용히 버려집니다. 읽기 전에 패킷의 크기를 알 수있는 방법이 있습니까 – user1908813

+1

@ user1908813 아니요. 일반적인 기술은 가장 큰 예상 데이터 그램보다 큰 버퍼를 사용하는 것입니다. 그런 다음 크기가 데이터 그램을 얻는다면 (i) 응용 프로그램 프로토콜 오류이고 (ii) – EJP

+0

또한 IP는 누락 패킷을 설명하지만, 순서가 잘못된 패킷은 무엇입니까? – user1908813

관련 문제