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