• 締切済み

パケット通信の再送制御についての質問です。

パケット通信の再送制御についての質問です。 再送制御の説明を色々なサイトで見つつ思うのですが、n番目のパケットがエラーだった時に、n番目から送り直すのは何故ですか?n+1番目、n+2番目はエラーじゃないのに破棄するのが勿体ない様に感じます。n番目のパケットだけ後から要求すれば良い様に思うのですが、何故そう出来ないのでしょうか? また、再送制御の説明で受信側と送信側を数フレーム分ずらして説明が書いてある理由は何なのでしょうか?1フレームの間に再送要求をしてしまえない物なのでしょうか? ご存知の方がいらっしゃいましたら教えて頂けませんでしょうか? 宜しくお願い致します。

  • 科学
  • 回答数5
  • ありがとう数8

みんなの回答

回答No.5

なぜかプロトコルもネットワークも指定されないままの漠然としたご質問ですので、漠然と回答してみます。 選択再送を実装するためには、少なくとも「後から要求」した再送パケットを受信するまでに送られてきたパケットの全てを蓄積するメモリを受信装置に用意する必要があります。また、パケット伝送の最大のメリットである「蓄積交換」に対して即時性が求められます。伝送されるデータが単一パケットで完結せず、データストリームの形態をとって伝送される場合には、少なくとも再送ウィンドウの範囲の伝送の成功確認信号が返送されるまでセッションあるいはコネクションリソースを確保し続ける必要があり、伝送コストが跳ね上がります。さらに、再送要求パケットの消失は伝送データの完全性を破壊する結果を引き起こすため、特別な手段で確実な伝送を行う必要があり、データ伝送リソースを食いつぶし、再送要求待ち時間分だけ実質伝送容量が低下します。 さらに、多くのノードで再送中継されるネットワークを介して伝送されるパケット網では、これら全ての性能が末端を含むノードの処理能力に依存するため、たとえば末端のノートブックパソコンに接続されているADSLの伝送レートが遅いために日米のバックボーン回線が遅くなるということを引き起こすことになります。(正確には、そうした事態を引き起こさないための設備規模が大きくなります) 世の中の多くの無線ネットワークや、波長分割技術が安価で一般的になる以前に敷設されたラインを介したネットワークを経由して伝送している場合には、伝送容量の不平衡性に適応できないため、確認パケットはデータパケットに比べて伝送遅延が極めて大きくなる場合が一般的であり、flying ackの使えない選択再送では設備の持つ伝送能力に対して実質伝送効率が極めて悪くなります。 したがって、現在のインターネットの構成では、選択再送の方が全ての面で劣っています。

Humpty-Dumpty-V
質問者

補足

追加質問して宜しいですか? >また、パケット伝送の最大のメリットである「蓄積交換」に対して即時性が求められます。伝送されるデータが単一パケットで完結せず、データストリームの形態をとって伝送される場合には、少なくとも再送ウィンドウの範囲の伝送の成功確認信号が返送されるまでセッションあるいはコネクションリソースを確保し続ける必要があり、伝送コストが跳ね上がります。 この文章の意味が良く分かりません。もう少し噛み砕いた説明があると有難いです。 >さらに、再送要求パケットの消失は伝送データの完全性を破壊する結果を引き起こすため、 プロトコル次第でこれは起きないと思います。また、もう一方の方式でも同じではないですか? >末端のノートブックパソコンに接続されているADSLの伝送レートが遅いために日米のバックボーン回線が遅くなるということを引き起こすことになります。 すみません、この論理についていけてません。もう少し噛み砕いた説明があると有難いです。 あと、ラスト1マイルの無線にだけ選択再送を用いる場合はどうでしょうか? 以上、宜しくお願い致します。

回答No.4

選択再送は一般的な技術です。何故「出来ない」という判断をされたのでしょうか。 また、単フレームACKも無線伝送などでは一般的な技術です。有線伝送でも、BSCなどで30年も前から使われています。 なお、標準化されたプロトコル(たとえば、TCP)では、選択再送や単フレームACKを使わない場合もあります。これは、「出来ない」わけではなくて、想定されるリンク(TCPならIEEE802.3上のIPなど)で最適なパフォーマンスを実現する実装をしているだけです。

Humpty-Dumpty-V
質問者

補足

一般的な内容なのですね。近くに4番目のフレームを誤ると4番目のフレームから全て送り直すプロトコルがあって、選択再送でない理由は何なんだろう?もしかして何かの課題が?と思った次第です。ちなみに、上記のプロトコルより、選択再送の方が全ての面で上に見えるんですが・・・そこの所はどう思いますか?

noname#119957
noname#119957
回答No.3

n番目のパケットがエラーだった時に、n番目から送り直すのは何故ですか?n+1番目、n+2番目はエラーじゃないのに破棄するのが勿体ない様に感じます。n番目のパケットだけ後から要求すれば良い様に思うのですが、何故そう出来ないのでしょうか? >>ネットワークアダプターのデータバッファーの制約によるものでは? プロトコルなので決まり道理にしないとまずいし。。 また、再送制御の説明で受信側と送信側を数フレーム分ずらして説明が書いてある理由は何なのでしょうか?1フレームの間に再送要求をしてしまえない物なのでしょうか? >>意味が良くわかりませんが。。 受信と送信の動作は、ハード的には独立した動作です。また、全2重なら同時に送信ができます。受け側の、リダンダンシーチェックで誤りがあった時点で初めて、再送要求がされるために、送り側では、その要求を処理するまでは、送るという動作をするように出来ているから。処理時間と伝送と伝送遅延時間などでズレるのでしょう。

Humpty-Dumpty-V
質問者

補足

>プロトコルなので決まり道理にしないとまずいし 関心事は、実現が容易である様に見えるのに、何故今の決まりになったのかです。 >処理時間と伝送と伝送遅延時間などでズレるのでしょう 処理遅延ってやはりあるんでしょうか・・・そこの所ははかって無いし何とも言えません。

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.2

>n番目から送り直すのは何故ですか?n+1番目、n+2番目はエラーじゃないのに破棄するのが勿体ない様に感じます。n番目のパケットだけ後から要求すれば良い様に思うのですが、何故そう出来ないのでしょうか? n+1番目、n+2番目の内容が「信用できない」からです。 データパケットの壊れ方によっては「n+1番目のパケットだと思って受け取った物が、実は、n番目のパケットの途中のデータだった」って事があります。 「ビットがずれて、あたかも正しそうに見えるデータになってしまった」って事が絶対に起きない、って保証はどこにもありません。 >また、再送制御の説明で受信側と送信側を数フレーム分ずらして説明が書いてある理由は何なのでしょうか?1フレームの間に再送要求をしてしまえない物なのでしょうか? 受信側が「1フレーム目を受け取った瞬間」には、もう既に送信側が「2フレーム目、3フレーム目を送り出してしまっているから」です。 「1フレーム送るごとに応答を確認する」のでは、ラグが大き過ぎて使い物になりません。 送り側は「ともかく、相手から返事が来るまで、ポンポンと放り投げ続ける」のです。 受け側が何も言ってこないうちは、送り側はどんどん投げ続けるのです。 で、受け側から「2つ目から投げ直してくれ」って言われた時だけ、送り側は2つ目から投げ直します。 送り側が最後まで投げ続けたら「これで終りだ」って言って、受け側からの応答を待ちます。 受け側は「これで終りだ」って言われたら「おけ~、全部揃ってるよ~」って一言だけ返事します。 もちろん、返事が届かない場合もあるので、ある程度の時間を待って返事が無い場合は「お~い、返事は~?」って感じで「聞き直し」をします。 送り側が無事に「おけ~、全部揃ってるよ~」って返事を貰ったら「了解した~。返事受け取った」って答えてセッションが切れます。 送り側は「返事も待たずにポンポン投げ続けてくる」のですから「1フレームの間に再送要求できる訳がない」のです。 受け取りミスしたら、相手に「ちょ、ちょっと待てって。ポンポン投げて寄越すな。4番目からやり直して」って言わないと、相手はどんどん投げ続けて来るのです。

Humpty-Dumpty-V
質問者

補足

>n+1番目のパケットだと思って受け取った物が、実は、n番目のパケットの途中のデータだった これが起きてしまう理由が解りません。時間スロットで区切られているからフレーム毎に独立しているのではないですか?フレームにユニークな識別子やインデックスがあればいいだけで、独立しているとしたら、最後に「1と3と7が足らーん!」でもいいですよね?

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.1

>n番目のパケットがエラーだった時に、n番目から送り直すのは何故ですか? 処理的に、「連続して送るだけ」と「送ったものが正しいかどうか確認しながら送る」のはどちらが難しいですか? また、パケットを受信して一つのデータにする際にはどちらが楽ですか? >n+1番目、n+2番目はエラーじゃないのに破棄するのが勿体ない様に感じます。 >n番目のパケットだけ後から要求すれば良い様に思うのですが、何故そう出来ないのでしょうか? どんなデータでも、パケットが受信バッファに入りきるのなら可能でしょう。 しかし、「n」は可変である限りどれだけのパケットを受信するかわかりませんからバッファの観点上からも問題が発生する可能性があります。 また、前述の通り「一つにまとめる」ために再送による欠損部分の把握にも限度があります。 >受信側と送信側を数フレーム分ずらして説明が書いてある理由は何なのでしょうか? 時間を表すため。 送信したデータは、送信した瞬間に受信しているわけではないため。 受信しても、受信内容の確認を氏再送要求を行う時間も必要。

Humpty-Dumpty-V
質問者

補足

分割するデータの分割度合を段階を踏めばバッファの問題は解決すると思いませんか。最小単位を1ダース集めて一塊とする。受信側は一塊の中で欠落しているフレーム番号を通知する。 一定時間あけて「足りない物はありませんか?」が理想に見えるんですが・・・。

関連するQ&A

  • WindowsXPがパケットの再送をしてくれない

    ごなたかご存知の方、ご教示下さい。 IPv6の環境でWindowsXPのPCをルータに接続しています。このPCから送信したパケットがMTU(1500byte)を超えている際、ルータから"ICMPv6 Too big"のエラーがPCに返っています。PC側はこれを自動でフラグメントし、再送してくれることを期待しているのですが、うんともすんとも言いません。 私の考え方は間違っているでしょうか?それともWindowsXPのどこかに設定があるのでしょうか? ちなみに、[スタート]-[設定]-[コントロールパネル]-[Windowsファイアウォール]-[詳細設定]-[ICMP]-[設定]で表示される「ICMP設定」のチェックボックス群 の「大きすぎるパケットの送信を許可する」にチェックを入れてみましたが、動作は変わりませんでした。 なお、PC側ではEtherealを起動し、Too bigのエラーを受信していることは確認しています。 よろしくお願いいたしますm(__)m

  • パケット通信

    C言語初心者です。 H8が乗っているコントローラとシリアル(RS232C)で繋がっている機器間で、 パケットを構成し通信したいのですが、そのパケットの快適な構成方法がわかりません。(コントローラ側のプログラムを作っています) イメージとしては構造体を使用すると快適なのかな?と思うのですが、 よくわかりません。 機器側のパケットは仕様があり、 スタートコード(2)-データ長(1)-データ長チェックサム(1)-データ(n)-データチェックサム(1) のような構成になっています。 ( )はバイト数です。 バイナリデータでの通信です。 データの先頭にコマンドコードがあり、機器の制御をするような感じです。 例えばですが、 typedef struct { unsigned char start[2];----->スタートコード(固定) unsigned char len;---------->データ長(変動) unsigned char len_cs;------->データ長チェックサム(計算) unsigned char data[SIZE];--->データの中身(変動) unsigned char data_cs;------>データチェックサム(計算) } packet; というようなやり方で、固定データや変動するデータを構造体として 使用することはできるのでしょうか? unsigned char cmd[] = {0x00,0x00,・・・・0x00} のように強引にスタートコードからデータ、チェックサムを 配列で並べて送信すると機器はちゃんと動作します。 (チェックサムの計算も電卓で計算してから書いてます) ただ、コマンドごとにこんなパケットを構成しないといけない のは手間ですし、何かブサイクに思えます。 快適なパケット作成の方法があればぜひ教えて下さい。 よろしくお願いします。

  • フロー制御について

    勉強中の初心者です 質問なのですが、連続した4つのセグメントが送られた時、 1,2,4番目のセグメントに対するACKが送信途中に破棄されたとします。 すると、3番目のセグメントに対するACKが最初に届くと思うのですが、 4番目は置いといて、5番目、6番目のセグメントを先に送信します。 その後、一定時間待っても4番目のセグメントに対するACKが返ってこないので、再送信しますよね? その後、相手側は6番目のセグメントに対するACK(7番目を要求)を送信した後、4番目が遅れて到達します。 この時、4番目のセグメントに対するACKも、7番目のセグメントを要求する と読んだのですが、この時なぜ、一度要求したセグメントと同じもの を要求するのでしょうか? ただ単に、ウインドウのサイズの更新的な意味合いからでしょうか?

  • 先頭パケットおよび最終パケットの区別について

    こんばんわ。 winsockを用いてC言語によるプログラミングを行っています。 先頭パケットおよび最終パケットの区別方法はどのように行うべきなのでしょうか? たとえば、送信端末から受信端末へパケットを100個送信するとします。送信端末において100個パケットを送信した場合、受信側にて100パケットのうちどのパケットが一番初めに受信したパケットかは分かりません。 そこで、各パケットにシーケンス番号1から100番まで各パケットに付加し送信しているのですが、シーケンス番号1番のパケットを受信側で受信できるとは限りません。 そこで、なにかよい方法はありますでしょうか? 100個すべて受信できるとは限らないため、タイマーをセットする必要性があるのでしょうか? よろしくお願いいたします。

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

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

  • インターネットのパケット通信について

    Javaを使ってインターネットにアクセスできるプログラム作成の勉強中です。(Java言語も勉強中) マイクロソフト社のネットワークモニター3.1を使って任意のホームぺージアクセス時のデータやり取り(通信)を観察していますが、それらのデータが何を意味するのか、何の為のデータなのか分かりません。 ネット上で調べてみましたが、ネットワーク通信の入門編ではHTTPとは… TCPとは…などの説明はあるものの、自機PCからサーバーに対して何を送信して、サーバーから何が返信されて…と言う詳細の説明を見つけることが出来ず、図書館で文献を漁ってみたのですが目ぼしいものが見つかりませんでした。 取り敢えずパケット通信の手順とその内容を知りたいと思っており、最終的にはインターネエクスプローラ「もどき」のプログラムが組めることを目指しています。 ネットワーク通信(パケット通信)の詳細を解説した書籍やURLなどありましたら教えて下さい。

  • RS-232Cにおける制御についての質問です。

    プラグラミングに対して、全くの初心者のものです。 DelphiでRS-232Cの制御を行おうとしているところですが、どのようにプログミングすればよいのかまったくわかりません。 一応説明書に書かれていることを記します。 (通信ポート設定) Baud Rate 9600,Stop Bit 2,Parity non,Word Length 8,Flow Control XON/XOFF RTS,DTR (通信パケット仕様) ・パケットは全て ヘッダー'#'と、ターミネータ'\r'で区切られる。 ・パケット内の数値データは、全て16進のアスキーコードで表記。 ・機能に応じて以下の4種類のパケットがある。 (1)コマンドパケット (2)リプライパケット (3)イベントパケット (4)データパケット (パケット一覧) (1)Command Packet Format : '#[FID] [P1] [P2] ..[Pn]\r'   項目   型      内容   FID short ファンクションID   Pn long n番目のパラメータ (2)Reply Packet Packet mode 0 Format Normal Reply '#0 [Reply]\r' Data Type: NUM '#0 [Reply] [Data1] [Data] ..[Data n ]\r' Data Type: STR '#0 [Reply] [Strings]\r'   項目   型    内容  Reply short リプライコード            0:正常終了 1:コマンドエラー 2:パラメータ           エラー 3:ビジーエラー 4:通信エラー            10:コマンドに依存したエラー  Data long n番目の数値データ  Strings char* 文字列データ (3)Event Packet Packet mode=1,Format '#1[Event ID][Event Data]\r7' 項目      型     内容 Event ID short イベントの種類 Event Code long イベントの内容 実際のコマンド仕様を記すのでよろしくお願いします。 1.Connect [動作]PCと装置の回線を確立する。 [引数]FID 1 P1 0:イベント出力・・・無効 1: ・・・有効 [戻り値] 0:正常終了 2:パラメーターエラー 3:ビジーエラー 2Set Data Output Interval [動作]データの出力間を設定する。 [引数]FID 7, P1 0:固定,P2 出力間隔 0,10(0xa)~100(0x64)[/10sec],P2=10の時は1秒間隔でデータを出力する,P2=0の時は出力しない。 [戻り値]0:正常終了,2:パラメータエラー 宜しければ、ちょっとした手がかりで構わないので投稿よろしくお願いします。

  • パケット通信料

    先日ドコモのN-02Aを買いました。 ほとんどが家族3人との通話しかしないので、一番安い980円のプランにしました。iモードは未契約で、インターネットはできない契約です。 でも、いろいろ触っていると、すごろくゲームとかボウリングゲームのアプリなどが入っていて、やっているのですが、お金がかかっているのでしょうか? あと、地図アプリで「位置情報を送信しました。」ってなったんですが、お金がかかっているんでしょうか?地図を見るを選択すると、パケット通信料がたくさんかかります。のような注意書きが表示されますが、恐ろしいので、同意しないにチェックして終了しました。iモード未契約なのにもし、同意した場合はできるんでしょうか? おそろしくてゲームをしていません。 詳しい方がおられましたらよろしくお願いします。

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

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

    • ベストアンサー
    • Java
  • WinsockによるUDP通信にて

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