UDPについての解釈とは?

このQ&Aのポイント
  • UDPについての解釈について質問があります。UDPはデータを分割して送信することがあり、受信側で正しくデータを受け取れない場合もあります。その具体的な解釈について教えてください。
  • UDPはデータを順番に送信する際に、データを分割することがあります。受信側はデータを順番に受け取ることができない場合もあり、データがロストすることもあります。具体的な解釈について詳しく教えてください。
  • UDPはデータを順番に送信する際に、データを分割することがあります。この場合、受信側はデータを正しく受け取れない場合があります。また、特定のデータがロストした場合、受信側はそれを検知することができません。具体的な解釈について詳しく教えてください。
回答を見る
  • ベストアンサー

UDPについてこの解釈で合っていますか?

UDPについてよく分からなくなってしまいました。 今まで 連続したABCというデータを送信すると その時によってAB CやA B Cのように分割されて送信される。 受信側にはABCと受信することもあればCAと受信するようなこともある という解釈をしていました。 しかし、いろいろなサイトを見て回っているうちに断片的な情報から以下のような解釈なのでは、と思いましたがこちらで正しいのでしょうか?それとも上記のような解釈で正しかったのでしょうか? データA、B、Cという3種類のデータを順に送信すると ネットワーク上でA1 A2 A3、B1 B2、C1 C2 C3 C4とそれぞれ分割された。 受信側はCAという順でデータを受け取った(Bはロスト) また、もしこちらが正しいとすると、 A1 A3 A2と受信することはないのか(あってもちゃんとA1 A2 A3と並び替えられるのか) B1はロストでB2受信の場合Bは受信失敗となるのか否か こちらも教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#212058
noname#212058
回答No.1

UDP で A, B, C というデータを送信した場合、ネットワーク上で 勝手に分割されることはありません。 A1 A2 A3、B1 B2、C1 C2 C3 C4 と分割して送りたいなら、最初 から送信側で分割して送信しなくてはなりません。 なので、後者は前提 (ネットワーク上で~分割された) が誤って います。 データの信頼性・順序性・完全性を保証せずに、とにかくスピード 優先で送るのが UDP です。「さらに分割する」などの余計な処理は 一切しません。

Null0lluN
質問者

お礼

ありがとうございます。やっと理解できました

関連するQ&A

  • C# UDPで大きなサイズのファイルを送信するには

    C# UDPで大きなサイズのファイルを送信するには いつもお世話になっております。 UdpClientでの通信に挑戦しているのですが、ファイルを送信する段階になって詰まっています。 2MBほどあるファイルを送受信したいのですが、一度には送れないので分割して送信しようとしています。 ところが、分割すると上手くいきません・・・ 現在32767byteずつ送信しているのですが、32800byteなどのテキストファイルは2つに分割されて上手く送信できたのですが 実際に2MBほどあるファイルを送信してみると、送信はしてても受信ができていません。 受信できたのは2つほどで、分割されたデータのほとんどがどこかへ行ってしまったみたいです。 そこで質問です。 (1)考えられる原因、対処法はありますか? (2)UDPで大きいサイズのファイルを送受信する場合、通常どうしていますか? わかる方がいましたらお願いします。

  • UDPの信頼性について

    UDPでは、信頼性のない通信プロトコルとされていますが、あるノード内の2つのプログラム間でUDPを使用した通信(ローカル通信)をした場合も、信頼性がない通信となるのでしょうか? ここでいう信頼性とは下記を意味しています。 ・ 送信した順序で、受信側が受信する。 ・ 送信したメッセージを、1つも失うことなく受信側で受信できる。

  • UDPデータ通信中の認識方法

    はじめまして。 表題の件について教えて下さい。 機器Aと機器BでUDPデータの通信をしている場合(機器Bのファイルを機器Aに転送しているとか)に受信側の機器Aはデータを受信している最中であるとどうやって認識しているのでしょうか? TCPだと最初にコネクションを確立して最後にコネクションを切断するのでデータ受信開始、受信中、受信完了はコネクション情報で確認できると思うのですが、UDPではコネクション確立がないのでTCPでのデータ受信開始、受信中、受信完了をどうやって識別しようか迷っています。 UDPでデータを受信している最中にLANケーブルを抜かれたらエラーとしたいのです。 その為に受信中であることを知りたいのですが。。。。

  • UDPで受信スループットを測定

    Javaを使って通信のプログラムを勉強しています。 UDP通信のスループットを測定するプログラムを作成しています。 送信側で5242880バイトを128回に分割して送信して、 受信側でそれらのパケットを受信する時間を計測するプログラムを 作りたいのですが、受信側でどのタイミングで受信処理を止めるのかがわかりません。 start = System.currentTimeMillis(); for(;;){   socket.receive(RecvPacket);   if(ループを抜ける条件)     break; } stop = System.currentTimeMillis(); で受信し続けて、受信するパケットがなくなったらループを抜けるというように考えました。 UDPでは送信されたパケットがすべて届くという保証はないので、 128回受信したらループを抜けるというようにできないので、困っています。 届いたパケットの数も数えて到達率も計算したいです。 受信が終わったら、ループを抜けるというようにしたいのですが、 どうすればよいでしょうか?

    • ベストアンサー
    • Java
  • UDP通信でのポート

    javaを使ってUDP通信を行います。 映像データと音声データの2つのデータが あります。 以下のようなことは可能ですか? (図の説明)AからBへデータを送信します。 Aのポートは1500番を使って映像データを 送信します。と同時に、同じ1500番を使って 音声データは送信できますか? 同一ポートで複数データを送信できるか知りたい です。 (このままだと、いくつもポートをあけるため データのタイムラグありすぎて使い物になりません。。 ) もしくは、1つのポートでデータの送受信が できるか知りたいです。 なにかヒントになるようなことでもいいので 教えてください。よろしくお願いします。    A ------------------------> B (1500) 映像データ送信  A ------------------------> B (1500) 音声データ送信

  • WinSockを用いたUDP送受信ソケットプログラミングについて

    こんにちは。 現在、VC++.NETでWinSockを用いたUDPソケットプログラミングを行っています。以下のようなプログラムを作りたいと思っているのですがうまく動作しません。 [概要] A:送信端末 B:受信端末 1.Aから文字列"send"をB端末へ送信。 2."send"を受信した受信端末Bは、A端末へ文字列"ok"を送信。 この1と2の動作を行わせたいと思っています。この場合、A,B端末は送信と受信を行う必要があります。 [問題点(うまくいかない点)] A→Bへ"send"は送信でき、B端末で受信できるのですが、B端末からA端末へ送信できません。B端末で送信できているのか、それともA端末で受信できていないのか?が分からない状態です。 [気づいた点] ポート番号を分ける必要があるのでしょうか?例えば、A→Bへは9000番。B→Aへは9001番という意味です。 送信と受信を行うため、送信・受信で2つのUDPソケットを使用する必要があるのでしょうか?例えば、 s1 = socket(AF_INET, SOCK_DGRAM, 0);←送信に利用 s2 = socket(AF_INET, SOCK_DGRAM, 0);←受信に利用 よろしくお願いします。

  • winsockを使ったTCP及びUDP通信について

    今回winsockを使った通信プログラムを組む事になったのですが、わからない点が多々ありましたので、どなたかご教授頂けると大変ありがたいです。 1. TCP通信において、送信側が"Hoge" "Fuga"と2回sendした際、受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? (到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 2. UDP通信においては、上記のような現象は起きないと認識しているのですが、これは正しいでしょうか? (UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? 4. 2が正しい前提での話です。UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? (MTUが1500Byteの場合、UDPで2000Byteをsendすると、recvで1500,500と2回受信する?) 以上の4点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • UDPプログラム、データの送受信

    javaを使って通信の勉強をしています。 UDPを用いた通信のプログラムを作成しています。 送信側では、次のようにして送信したいバイト数を分割して送信しています。 BUF_MAX = 40960; DatagramSocket socket = new DatagramSocket(); // data分のバイトデータを分割して送信する。 int part = 5242880 / BUF_MAX; // 分割して送信する回数 send_start = System.nanoTime(); for(int i = 0;i < part;i++){   byte[] buf = new byte[BUF_MAX];   buf[0] = (byte)i;   DatagramPacket sendPacket = new DatagramPacket(buf,BUF_MAX,serverAddress,servPort);   total += BUF_MAX;   // 指定したバイト数を送信する。   try{     socket.send(sendPacket);   }catch(IOException e){     System.out.println(e);   } } System.out.println(total); このようにしています。 こうする理由は、5242880バイトのデータを128回に分割して送信して、 受信側で受信したパケットの最初の文字を見て、何個目のパケットが届いていないかを確認するためです。 受信側でこれらのデータを受信する方法を考えているのですが、どうすればよいか分かりません。 receive(packet)で受信するのは知っています。 送信された複数のデータを受信するのに、 for(int i = 0;i < 128; i++){  receive(packet); } というようにするのでしょうか?このようにすると、 このループを抜けることができません。それは、パケットが通信途中で紛失するため、128回受信しないからだとおもいます。 受信しなくなったらループを抜けるというようにすればよいとおもいますが、その方法が分かりません。 どなたかアドバイスをいただけないでしょうか?お願いします。

    • ベストアンサー
    • Java
  • Linuxでパケットのデータ部分を合成するプログラムを教えてください。

    LinuxでC言語を使用しているのですが、パケットのデータ部分を合成するプログラムのを教えてください。 具体的な例として、 端末A,B,Cがあり、AはBを中継して、CにUDPパケットを2個送信します。 中継端末のBは2個のUDPパケットをバッファリングした後、データ部分のみを1個のパケットにまとめてCに送信します。(ヘッダ部分はAが送信したときと同じにしたい) Cは2個分のデータが入ったUDPパケットを1個受信する。 この例の端末Bでのプログラムを書くとするとどのようにすればいいのでしょうか?? よろしくお願いしますm(_ _)m

  • UDPパケットの分割について

    こんにちは。 現在、クライアント&サーバの通信プログラムを作成しています。 クライアントがサーバに接続しにいく際、サーバの待ち受けポートにクライアントが UDPでブロードキャストしています。 その際、クライアントの情報もUDPに乗せて、送信しています。 ここで、問題なのですが、ネットワークモニタで通信データを見てみると、 クライアントから送信するUDPデータが1500バイト?を超えると、UDPパケットの分割が行われ、 2つめのデータが、UDPではなく、IPで送信されています。 しかも、2つめのIPのパケットがサーバ側に届くケースと届かないケースがあるように見受けられます。 (環境の違いかもしれません。) 2つめのパケット破棄は破棄が起こる環境では必ず起きます。 破棄が起きない環境では一回も起こりません。 スイッチ、NIC等で、破棄することってあるのでしょうか? ネットワーク上の問題っぽいので、OSの違い(Win2K pro,Win2k advanced server) などには関係ないですよね? どなたが、ご存知の方がおられましたらご教授願います。

専門家に質問してみよう