teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

update

2017/01/13 03:10

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -8,4 +8,8 @@
8
8
 
9
9
  > 送信のforループの中に無意味な処理("for (int h = 0; h < 1000000; h++)")を追加して送信の間隔を空けた場合
10
10
 
11
- UDP送信処理という観点からは、上記のような微妙なタイミング制御には意味があります。データグラム欠損を極力避けるには、UDP送信側はなるべく一定間隔でのデータ送信を行うよう制御し(バースト的な送出処理は避ける)、UDP受信側は可能な限り最速でネットワークスタックからデータを取り出す(`recvfrom`とその後の解析処理を分離するなど)必要があります。
11
+ UDP送信処理という観点からは、上記のような微妙なタイミング制御には意味があります。データグラム欠損を極力避けるには、UDP送信側はなるべく一定間隔でのデータ送信を行うよう制御し(バースト的な送出処理は避ける)、UDP受信側は可能な限り最速でネットワークスタックからデータを取り出す(`recvfrom`とその後の解析処理を分離するなど)必要があります。
12
+
13
+ > しかし速度を重視してUDPを採用したので,可能であれば無意味な処理を使用せず実行したいと考えている.
14
+
15
+ (気持ちは分かりますが)UDP通信路全体でみると全くの**逆効果**です。送信側だけの都合で最速処理すると、既に説明したようなデータグラム欠損があちこちで生じてしまいます。

2

update

2017/01/13 03:10

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -4,4 +4,8 @@
4
4
 
5
5
  質問者さんが言及している通り、UDPは**あらゆるレイヤで**データグラム欠損が起きうる通信プロトコルです。実ネットワーク上でのパケット・ロス発生以外にも、NIC内部で破損検知したデータグラムを破棄したり、ネットワークスタック内部の送受信バッファ不足によりデータグラムを破棄することもあります。
6
6
 
7
- `SO_SNDBUF`や`SO_RCVBUF`により送受信バッファサイズを大きくすれば、UDPデータグラムの取りこぼしが多少は減る可能性があります。それ以外の方策としては、UDP送信側はなるべく一定間隔でのデータ送信を行うよう制御し(バースト的な送出処理は避ける)、UDP受信側は可能な限り最速でネットワークスタックからデータを取り出す(`recvfrom`とその後の解析処理を分離するなど)必要があります。
7
+ `SO_SNDBUF`や`SO_RCVBUF`により送受信バッファサイズを大きくすれば、UDPデータグラムの取りこぼしが多少は減る可能性があります。
8
+
9
+ > 送信のforループの中に無意味な処理("for (int h = 0; h < 1000000; h++)")を追加して送信の間隔を空けた場合
10
+
11
+ UDP送信処理という観点からは、上記のような微妙なタイミング制御には意味があります。データグラム欠損を極力避けるには、UDP送信側はなるべく一定間隔でのデータ送信を行うよう制御し(バースト的な送出処理は避ける)、UDP受信側は可能な限り最速でネットワークスタックからデータを取り出す(`recvfrom`とその後の解析処理を分離するなど)必要があります。

1

update

2017/01/13 03:07

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -2,6 +2,6 @@
2
2
  >
3
3
  UDPを用いているので多少の取りこぼしがあるのは許容できます.しかしWireSharkでパケットを確認すると,受信自体はできているように見えるにも関わらずrecvfrom()を実行した場合に良くても10%程のデータしか受け取ることが出来ませんでした.
4
4
 
5
- 質問者さんが言及している通り、UDPは**あらゆるレイヤで**データグラム欠損が起きうる通信プロトコルです。実際のネットワーク上でパケット・ロス発生する以外にも、NIC内部で破損検知したデータグラムを破棄したり、ネットワークスタック内部の送受信バッファ不足によりデータグラムを破棄することもあります。
5
+ 質問者さんが言及している通り、UDPは**あらゆるレイヤで**データグラム欠損が起きうる通信プロトコルです。実ネットワーク上でパケット・ロス発生以外にも、NIC内部で破損検知したデータグラムを破棄したり、ネットワークスタック内部の送受信バッファ不足によりデータグラムを破棄することもあります。
6
6
 
7
- `SO_SNDBUF`や`SO_RCVBUF`により送受信バッファサイズを大きくすれば、UDPデータグラムの取りこぼしが多少は減る可能性があります。
7
+ `SO_SNDBUF`や`SO_RCVBUF`により送受信バッファサイズを大きくすれば、UDPデータグラムの取りこぼしが多少は減る可能性があります。それ以外の方策としては、UDP送信側はなるべく一定間隔でのデータ送信を行うよう制御し(バースト的な送出処理は避ける)、UDP受信側は可能な限り最速でネットワークスタックからデータを取り出す(`recvfrom`とその後の解析処理を分離するなど)必要があります。