• 締切済み

パケットロスについて

こんにちは。 自分は、アドホック通信(ワイヤレス環境)にてUDPソケットを用いて約3MByteのファイルを1024Byteずつ送信側から受信側へ送信しています。 そんなに、大きなファイルをUDPでなんて・・・とおっしゃられるかもしれませんが、まだまだ初心者なんでご了承ください。 そこで、質問させていただきます。 1024Byteのパケットを3041個送信しています。しかし、何かおかしいと思い、キャプチャリングソフトの「ethereal」を用いて、キャプチャしたところ、プログラム上では3041個送信しているはずなのに、キャプチャしてみると2800個程度しかキャプチャできませんでした。 こういうことってあるのでしょうか?経験された方はいらっしゃいますでしょうか? よろしくお願いします。

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

通信プログラムを作っているのですから、せめてTCPとUDPの簡単な違いくらいは把握してから作りましょう。 UDPはTCPと違いコネクションレス型通信なので確実に相手に届くという保証がありません。また、送信順と受信順が同じである保証もありません。 なのでUDPでファイルなどを送信する際には上位プロトコル(作っているプログラム)で何かしらの対処をする必要があります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

UDPだもの

関連するQ&A

  • Etherealを使ったUDPプロトコルのキャプチャについて

    こんばんは。 この掲示板に大変お世話になっています。 私は、簡単なUDPソケットプログラムを作って、送信側から受信側へアドホック通信(ワイヤレス環境)にて、約3MByteのmepgファイルを1024Byteずつ送信しています。使用コンパイラはVisual C++.NETです。 私は、送信側から送出したパケットをプログラム内でカウントさせ、かつ受信側でも受信したパケットをカウントし、カウント数をDOSプロンプト上に表示させています。パケット数は3041個です。 しかし、送信側で送出したパケットがきちんと送出されていないような気がして、Etherealを用いてUDPをキャプチャしてみたところ、2800個程度しか送出できていませんでした。こういう事ってあるのでしょうか? 2800個を改善するために、パケット送信間隔を開けることで改善できました。パケット送信間隔というのは、sendto関数が呼び出された後に、sleep関数を用いて1パケット送信後に、ある時間待機させるということです。 また、Ethereal(キャプチャリングソフト)を使用することが初めてなのですが、このソフトはトランスポート層レベルでのキャプチャソフトなのでしょうか? よろしくお願いします。

  • スループット計算方法について

    私は、UDPソケットプログラミングをしています。 送信側から、受信側へ1024byteずつUDPを利用してパケットを送信しています。送信側プログラムでは、配列を1025確保し、受信側でも同様に配列を1025確保しています。 スループット計算を以下に示す計算方法で計算しました。 [送信側] (送信パケット数×パケット長(1024))/送信にかかった時間 [受信側] (受信パケット数×パケット長(1024))/受信にかかった時間 送信にかかった時間=受信にかかった時間とします。 そこで、質問させていただきます。 上記計算式で、パケット長=1024ではなく、1000で計算する方が正しいのでしょうか? よろしくお願いします。

  • ソケットプログラミング(配列について)

    こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へWindows上でUDPソケットを利用し、約3MByteのmpegデータを、1024Byteずつパケットに分割し送信しています。以下に、送信側のプログラムの概要を示します。 [送信側] ・配列[1025]確保し、fread関数を用いてファイルの読み込みを行い、sendto関数で受信側へ送信。 ・1024Byteずつ送出できているかを表示。 ・送出した1024Byteのパケット数を表示。 int n; int Num_n = 0; char send_buf[1025]; while((n = fread(send_buf,1,DATA_SIZE,fp)) != 0){ Num_n++; //1024Byteずつ送出できているかを表示させています printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } //送出したパケット数を表示させています printf("%d個のパケットを送出しました\n",Num_n); <質問内容> 約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? また、私は送信側と受信側でスループットの計算を以下の式から算出しています。 送信側 (送信したパケット数×1024×8)/送信に要した時間 受信側 (受信したパケット数×1024×8)/受信に要した時間 送信したパケット数は3041個。 送信に要した時間=受信に要した時間です。 この場合、送信側での計算として・・・ (3041×1024×8)/送信に要した時間とするのか (3040×1024×8)+4/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

  • UDPソケット通信におけるデータパケット

    UDPソケット通信をする際、受信データサイズとして考慮するべきサイズはアプリサイズとUDPヘッダー(8バイト)としてソケットオプションで受信バッファサイズを増加させたのですが、予想より受信できるパケット数が少ないです。 例) 1パケットのアプリサイズを10バイトしUDPヘッダーも考慮して実際1パケットあたり18バイトとして、最大5パケット受け取れるようにソケットオプションで アプリサイズ(10バイト)× UDPヘッダー(8バイト)×パケット数(5) 上記のように設定したのですが、実際5パケットも受信できませんでした。 上記のほかにIPヘッダーなども考慮しなければならないのでしょうか? 開発環境:solaris8 C言語

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • ネットワーク上に存在しないIPアドレスにはUDPパケットが送信できない?

    はじめまして。よろしくお願いします。 Cでソケットプログラミング(WinXP,VC++6.0)を行っています。 やろうとしていることは、 ・UDPパケットを同じネットワークセグメントのIPアドレスに送信する ということです。 プログラムを作成し、本当に送信しているのかどうかをパケット キャプチャソフト(wireshark)を使って確認してみました。 すると、ネットワーク上に存在するIPアドレスにはパケットを送信 しているのですが、存在しないIP(つまり、電源を切っているPC)には パケットを送信していないことがわかりました。 ネットワーク上においてそのIPの存在に関係なく、パケット を送信することは出来ないのでしょうか? よろしくお願いします。

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

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

    • ベストアンサー
    • Java
  • 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点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • パケット到達遅延の測定にて

    Javaを使って通信のプログラムを勉強しています。 UDP通信プログラムでパケット到達遅延を測定したいと考えています。パケット到達遅延を測定するには、 送信側がパケットを送信した時間と、受信側がそのパケットを受信した時間を取得して、 求めようと考えています。 パケット到達遅延を測定するには、送信側と受信側が時刻同期させる必要があると聞きました。 その方法を教えていただきたいのですが、どなたかアドバイスをいただけないでしょうか?

    • ベストアンサー
    • Java
  • キャプチャしたパケットの流れを地図などに表示させる方法について.

    「キャプチャしたパケットの流れを地図などに表示させる方法」についての質問です. 無線LANで通信を行い,ノード(車両)間のパケットの流れ(通信状況)を地図(ex.グーグルマップ)などに表示させたいと思っています. 初心者であるため,パケットのキャプチャリングやキャプチャしたデータをどのように地図上に表示させたらよいのか分かりません. このような事をする場合,最も適しているパケットキャプチャリングソフト,キャプチャしたものをどのように地図上に表示させるのか,また,このようなことをする場合何をかったら良いのか教えてください. よろしくお願いいたします.