2011-10-28 12 views
13

cのrecvやread、javas DatagramPacketクラス、pythons SocketServerなどのほとんどのデータグラム受信関数では、受信したデータの量を調べることができます。データグラムは常に完全に受信されていますか?

C:

int amount = recv(sock, buf, n, MSG_WAITALL); 

は、Java:

int amount = datagramSocket.getLength(); 

のpython:

class MyUDPHandler(socketserver.BaseRequestHandler): 
    def handle(self): 
     amount = len (self.request[0]) 

は、これらの信頼性はありますか?あるいは、例えばパケットの断片化やネットワーク遅延のために、メッセージの一部しか受信されない可能性がありますか?
言い換えれば、udp経由で可変長のデータチャンクを送信し、それを相手側で受信すると、これらの金額は元のチャンクのサイズと正確に同じですか?

編集:
ninjaljは良い点を示しており、ここに含める必要があります。受信機能が中断された場合、例えば信号によって何が起こるか? 2つのスレッドが同時に同じソケットからの受信を試みるとどうなりますか?

+0

あなたのJavaコードには「Length」という深刻なスペルミスがあります – Necrolis

答えて

13

部分的にUDPデータグラムを配信することはできません。彼らはそのまま、またはまったく提供されません。だから、受信したデータグラムが受信者側で見たとおりに送信されたことを確認できます。

編集(すなわち、技術的に)正しいの最高の一種であるウィルのコメントを組み込む:

¹Theyは、IPレベルで断片化することができるが、受信側のネットワークスタックは、完全に組み立て直します送られてきたリスニングプロセスに渡すか、まったくデータが受信されたことを認識しません。

+8

技術的に大きなパケットは断片化される可能性がありますが、プロトコルは断片化と再アセンブリを処理しますが、完全に再アセンブリできない場合、気付かないでしょう。 – Will

+1

正しいですか。 OSのUDPスタックはフラグメンテーションを処理しますが、フラグメンテーションはIPレベルのタスクです。したがって、それはTCPとUDPの両方に等しく適用されます。つまり、UDPパケットは配信保証されていないと言われています。だから、再送はあなたのプログラムが気にする必要があります。 – nemith

+2

しかし、recv()へのバッファがパケットを保持するのに十分でない場合、切り捨てられたデータが得られます。 – nos

4

部分的なデータグラムは、UDP Liteでのみ許可されます。

関連する問題