質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Q&A

3回答

3678閲覧

送信者によりUDPで大きなデータを送信できない

namuyan

総合スコア76

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

0グッド

0クリップ

投稿2020/01/14 00:35

編集2020/01/15 08:50

UDPで1500を超える32k程度のデータを送信しようと考えています。

Windows10 32bit、プログラミングは趣味の範囲です。

私の理解ではMTUを超えるサイズであるので細かいパケットに分割されて
、相手に送信され、相手方で元のデータ塊に復元されると考えています。しかし、実際は送信者によって9割方届いたり、100%失敗したり結果が二分されています。

実験

3つの拠点から(家庭用PC Windows10 MTU0?, 国内VPS Ubuntu18 MTU1500, 海外VPS Ubuntu16 MTU1500)相互に送信できるか確認してみました。データは32kbです。結果としては国内からの送信のみ失敗するようです。1500以下のフラグメンテーションを起こさないサイズは問題ありません。 How to find mtu value of network through code(in python)?

  • 不成功:家庭用PC → 国内のVPS
  • 不成功:家庭用PC → 海外のVPS
  •  成功:海外のVPS → 家庭用PC
  •  成功:海外のVPS → 国内VPS
  •  成功:国内のVPS → 家庭用PC
  •  成功:国内のVPS → 海外VPS

MTU(追記)

調べていくとMTUを超える大きさのパケットを送信すると途中で破棄される(ブラックホール)仕様が存在するようです(DFフラグが有効か。参考にしようにもLinuxならばMTUが取得できるのですがWindowsでは取得すると0が返されます。

質問

上手くいかない原因は何でしょうか?どうすれば上手くいくでしょうか?
何かわかる方は回答の方をよろしくお願いします。

追記

  • 2020/1/15: UDPは到着性が保証されていない

UDPの性質については把握しています。9割方届いたり、100%失敗したりのコメントの意味は”たまに届かなくても問題ないが全く届かないのが問題”という事です。

  • 2020/1/15 家庭用PCのネット環境について

家庭用PCのみNAT内のローカルに設置されています。フレッツ光回線でIpv4を使用しています。VPSはUFWで全面保護してあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2020/01/14 21:04

国内からが失敗というよりは、Windows からの送信か家庭用のルーター経由での送信に失敗しているように見えます。 ネットワーク構成や設定が分かりませんので、ネットワーク辺りの情報を追記していただくことは可能でしょうか? また、最近の VPS 等はデフォルトでIPv6 に対応していたりしますが、IPv4 と IPv6 のどちらで通信しているのでしょうか?
guest

回答3

0

UDP は他の人も書いているように、データが届くことが保証されていません。つまり「データの順番が入れ替わったり、全く届かないこともあり得る」という前提で使うものです。
今回、MTU 以下の(1パケットであれば)届く、という検証結果が出ているようですが、これすら確実ではありません。例え1パケットでも、まったく届かない可能性はあるのです。
素直に TCP で作り直した方がよいと思います。TCP がいろいろやっているデータの順番と到着の保証を、UDP の場合はすべて自前でやる(か、諦める)必要があるのですから。

※オンラインRPG で、ステータス変化を伴う情報(攻撃したとかアイテム拾ったとか)は確実に届く TCP で、キャラクタの移動に関する情報は届かなくてもよい UDP でやりとりし、負荷を減らしていた例があったような

また、検証結果から分かるのは、「貴方の PC からの送信がすべて失敗している」であって、通信経路が国内/国外とは無関係です。この場合、家庭の PC 及びルーターのファイアーウォールで、UDP が潰されている可能性も考慮しなくてはなりません。

投稿2020/01/15 09:09

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windowsでのソケット通信のプログラミング経験はほとんどありませんが、その基礎となってるBSDソケットでのアプリならいくらか記述したことがあります。

先に回答されている方もおっしゃっているように、UDPではデータ送信/到着の保証はされていません。なので、可能であればTCPで送信するか、あるいは欠損したデータをチェックするような処理を自分で記述する必要があります。

teratailでの過去の議論では、このような議論があったようです。

googleでも、「UDP 足りない」のような簡単なキーワードで参考になりそうなヒントがたくさん出てくるようです。

最終的にどのような処理を望まれているか次第ですが、結局はTCPで実装した方が余計なことを考えずに済むことが多い気がするので、それも検討されるのが一つかとおもいます。

投稿2020/01/14 03:57

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

UDP はデータデリバリーの保証をしていません。失敗したら、送り直すとか、独自のデータハンドリングが必要です。

投稿2020/01/14 01:05

mmaeda

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問