문제

내 프로그램이 네트워크(UDP)를 통해 1000바이트를 전송한다고 가정해 보겠습니다.수신자가 하나의 "배치"로 1000바이트를 수신한다는 것이 보장됩니까?아니면 전체 메시지를 받을 때까지 여러 번의 "읽기"를 수행해야 할까요?후자가 사실이라면, 동일한 메시지에 대한 패킷의 순서가 "혼합"(순서대로)되지 않거나 프로토콜이 이를 보장하는지 어떻게 확인할 수 있습니까?
편집하다:즉, 내 메시지가 여러 패킷으로 분할될 가능성이 있습니까?(10000mb 메시지를 보내려고 하면 어떻게 되나요?)

도움이 되었습니까?

해결책

당신은 모든 것을 얻거나 아무것도 얻지 못할 것입니다.

그러나 패킷이 전송된 순서대로 정확히 한 번만 수신된다는 특별한 보장은 없습니다.패킷 손실, 재정렬 및 ​​(드물게) 복제가 모두 가능합니다.

최대 프레임 크기(65,507바이트)가 있으며, 더 큰 크기의 패킷을 send()하면 오류가 반환됩니다.

한 번의 호출로 전체 프레임을 수신하려면 충분한 버퍼를 제공해야 합니다.

UDP 패킷은 여러 IP 조각으로 조각화될 수 있지만 OS는 불완전한 패킷을 삭제합니다.따라서 이는 애플리케이션에 투명합니다.

다른 팁

수신기는 전체 패킷을 한 번의 호출로 얻습니다. 패킷 길이는 심지어 제한되어 있습니다 이론:

길이 전체 데이터 그램의 바이트로 길이를 지정하는 16 비트 필드 : 헤더 및 데이터. 최소 길이는 헤더의 길이이기 때문에 8 바이트입니다. 필드 크기는 UDP 데이터 그램에 대해 65,535 바이트 (8 바이트 헤더 + 65527 바이트의 데이터)의 이론적 한계를 설정합니다. 기본 IPv4 프로토콜에 의해 부과되는 데이터 길이에 대한 실제 한계는 65,507 바이트입니다.

그러나 실제 한계는 훨씬 낮으며 일반적으로 512 바이트를 가정하는 데 안전합니다. 보다 인터넷에서 가장 큰 안전한 UDP 패킷 크기는 얼마입니까?.

UDP를 사용하여 전송 된 데이터는 그룹화됩니다 패킷, 따라서 바이트의 양을 보내면 수신기가 패킷을 받으면 X 양의 바이트를 받게됩니다.

그러나 패킷이 도착하지 않거나 순서대로 도착할 수 있습니다.

TCP와 달리 UDP는 신뢰할 수있는 프로토콜이 아닙니다. 패킷이 적절한 순서로 도착하거나 전혀 도달 할 수 있도록 내장 메커니즘을 제공하지 않습니다. 즉, 패킷을 보낼 때마다 발신자가 다시 보내기 전에 ACK를 받기 위해 기다려야하는 잠금 단계 방식으로 Send/RecV 루틴을 쓸 수 있습니다. 지정된 시간 초과 후 ACK를 수신하지 않으면 패킷을 분개해야합니다. 이렇게하면 패킷이 적절한 순서로 수신되도록합니다. (자세한 내용은 참조하십시오 TFTP 프로토콜 용 RFC, 이 전략을 사용합니다.)

마지막으로 가능한 경우 TCP를 대신 사용하는 것을 고려할 수 있습니다.

와 함께 UDP 라이트 부분적으로 손상된 패킷을받을 수 있습니다. 비디오 및 VOIP 서비스에 유용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top