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

質問編集履歴

7

2019/11/22 10:03

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
File without changes
body CHANGED
File without changes

6

結果追記

2019/11/22 10:03

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
File without changes
body CHANGED
@@ -317,6 +317,34 @@
317
317
  }
318
318
  }
319
319
  ```
320
+ 結果
321
+ ```log
322
+ Nagleオンの場合
323
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.537
324
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.584
325
+ データ送信 送信時刻 = 2019 11 22 01:05:20.584
326
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.584
327
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.631
328
+ データ送信 送信時刻 = 2019 11 22 01:05:20.631
329
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.631
330
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.678
331
+ データ送信 送信時刻 = 2019 11 22 01:05:20.678
332
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.678
333
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.724
334
+ ...
335
+ ```
336
+ ```log
337
+ Nagleオフの場合
338
+ データ受信。サイズ : 8byte. 送信時刻 = 2019 11 22 01:22:21.897
339
+ データ送信 送信時刻 = 2019 11 22 01:22:21.897
340
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.900
341
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.901
342
+ データ送信 送信時刻 = 2019 11 22 01:22:21.901
343
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.901
344
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.917
345
+ データ送信 送信時刻 = 2019 11 22 01:22:21.917
346
+ ...
347
+ ```
320
348
 
321
349
  ### 環境
322
350
  OS : win10

5

ご指摘を受けての編集コード掲載

2019/11/22 04:18

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
File without changes
body CHANGED
@@ -148,6 +148,176 @@
148
148
 
149
149
  ```
150
150
 
151
+ ### コード改修(11.22)
152
+ サーバ側
153
+ ```java
154
+ import java.io.IOException;
155
+ import java.io.InputStream;
156
+ import java.io.OutputStream;
157
+ import java.net.ServerSocket;
158
+ import java.net.Socket;
159
+ import java.text.DateFormat;
160
+ import java.text.SimpleDateFormat;
161
+ import java.util.Date;
162
+
163
+ public class Server
164
+ {
165
+ public static ServerSocket ss = null;
166
+
167
+ public static Socket soc = null;
168
+
169
+ private static InputStream is = null;
170
+
171
+ private static OutputStream os = null;
172
+
173
+ public static void main(String[] args)
174
+ {
175
+
176
+ try
177
+ {
178
+ // サーバソケット生成
179
+ ss = new ServerSocket(5000);
180
+ soc = ss.accept();
181
+ soc.setTcpNoDelay(true);
182
+ is = soc.getInputStream();
183
+ os = soc.getOutputStream();
184
+
185
+ DateFormat format = new SimpleDateFormat("yyyy MM dd hh:mm:ss.SSS");
186
+ byte sndData[] = new byte[4];
187
+ sndData[0] = 0x01;
188
+ sndData[1] = 0x02;
189
+ sndData[2] = 0x03;
190
+ sndData[3] = 0x04;
191
+
192
+ while (true)
193
+ {
194
+ byte rcvData[] = new byte[16];
195
+ int size = 0;
196
+ // データ読込み (受信するまで待つ)
197
+ for (int tmp = 0; tmp <= 1; tmp++)
198
+ {
199
+ size = is.read(rcvData);
200
+ System.out.println("データ受信。サイズ : " + size + "byte. 送信時刻 = " + format.format(new Date()));
201
+ if (size == 8)
202
+ {
203
+ break;
204
+ }
205
+ }
206
+ // clientからの送信が200ms遅延してる. ACK遅延により返答も200ms遅延
207
+ // 上記要因を踏まえて3回目以降のトリガー
208
+ os.write(sndData);
209
+ os.flush();
210
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
211
+ }
212
+ }
213
+ catch (IOException e)
214
+ {
215
+ e.printStackTrace();
216
+ }
217
+ finally
218
+ {
219
+ try
220
+ {
221
+ is.close();
222
+ os.close();
223
+ soc.close();
224
+ ss.close();
225
+ }
226
+ catch (IOException e)
227
+ {
228
+ e.printStackTrace();
229
+ }
230
+ }
231
+ }
232
+ }
233
+ ```
234
+
235
+ クライアント側
236
+ ```java
237
+ import java.io.IOException;
238
+ import java.io.InputStream;
239
+ import java.io.OutputStream;
240
+ import java.net.Socket;
241
+ import java.net.UnknownHostException;
242
+ import java.text.DateFormat;
243
+ import java.text.SimpleDateFormat;
244
+ import java.util.Date;
245
+
246
+ public class Client1 {
247
+
248
+ public static void main(String[] args) {
249
+
250
+ Thread client = new ClientThread();
251
+ client.start();
252
+ try {
253
+ //Thread.sleep(1000);
254
+ client.join();
255
+ } catch (Exception e) {
256
+ e.printStackTrace();
257
+ }
258
+ }
259
+ }
260
+
261
+ class ClientThread extends Thread{
262
+ private static Socket soc = null;
263
+ private static OutputStream os = null;
264
+ private static InputStream is = null;
265
+
266
+ public void run() {
267
+ try {
268
+ // ソケット生成
269
+ soc = new Socket("172.23.56.83", 5000);
270
+ soc.setTcpNoDelay(false);
271
+ is = soc.getInputStream();
272
+ os = soc.getOutputStream();
273
+
274
+ DateFormat format = new SimpleDateFormat("yyyy MM dd hh:mm:ss.SSS");
275
+ byte sndData[] = new byte[4];
276
+ sndData[0] = 0x04;
277
+ sndData[1] = 0x03;
278
+ sndData[2] = 0x02;
279
+ sndData[3] = 0x01;
280
+
281
+ for (int cnt = 0; cnt <10; cnt++) {
282
+ // 1回目送信(即送信される)
283
+ os.write(sndData);
284
+ os.flush();
285
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
286
+ // 0.01秒スリープ
287
+ try {
288
+ Thread.sleep(10);
289
+ } catch (Exception e) {
290
+ e.printStackTrace();
291
+ }
292
+ // 2回目送信(1回目のACKが遅延ACKにより200ms遅延)
293
+ // 加えてNagleにより送信も200ms遅延
294
+ os.write(sndData);
295
+ os.flush();
296
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
297
+
298
+ byte rcvData[] = new byte[16];
299
+ int size = 0;
300
+ // データ読込み
301
+ size = is.read(rcvData);
302
+ System.out.println("データ受信。サイズ : " + size + "byte. 送信時刻 = " + format.format(new Date()));
303
+ }
304
+ } catch (UnknownHostException e1) {
305
+ e1.printStackTrace();
306
+ } catch (IOException e1) {
307
+ e1.printStackTrace();
308
+ } finally {
309
+ try {
310
+ is.close();
311
+ os.close();
312
+ soc.close();
313
+ } catch (IOException e) {
314
+ e.printStackTrace();
315
+ }
316
+ }
317
+ }
318
+ }
319
+ ```
320
+
151
321
  ### 環境
152
322
  OS : win10
153
323
  JDK : 1.8

4

2019/11/22 04:12

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,7 @@
1
+ 初学者です。不十分な知識で僭越ながら質問させてください。よろしくお願いします。
2
+
1
3
  ### 実現したいこと
4
+
2
5
  Javaのソケット通信において, 勉強と動作確認のため, Nagleアルゴリズムによる遅延をわざと発生させたいです.
3
6
 
4
7
  現在は1sごとに4byteクライアント側から送信しており, クライアント側送信時刻とサーバ側送信時刻をコンソールで見ています.

3

2019/11/20 10:04

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
File without changes
body CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  小さいデータを送信するとNagleバッファに入り, 送信時刻と受信時刻に200ms程の差異が現れると思うのですが, 現在ほぼ時間の差異はありません.
7
7
 
8
- Nagleアルゴリズムによる遅延はどうすれば発生するのでしょうか? ご教授お願い致します.
8
+ **Nagleアルゴリズムによる遅延はどうすれば発生するのでしょうか**? ご教授お願い致します.
9
9
 
10
10
  ### 該当のソースコード
11
11
  参照元コード https://oshiete.goo.ne.jp/qa/7317690.html
@@ -143,4 +143,11 @@
143
143
  }
144
144
  }
145
145
 
146
- ```
146
+ ```
147
+
148
+ ### 環境
149
+ OS : win10
150
+ JDK : 1.8
151
+ IDE : eclipse
152
+
153
+ サーバとクラインアントは同一ホストで行なってました。

2

タイトル編集

2019/11/20 09:49

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
@@ -1,1 +1,1 @@
1
- 【ソケット通信】 Nagleアルゴリズムによる遅延を見たい
1
+ Java : Nagleアルゴリズム遅延するの?
body CHANGED
File without changes

1

修正

2019/11/20 08:36

投稿

Rai_Feit
Rai_Feit

スコア7

title CHANGED
@@ -1,1 +1,1 @@
1
- Javaソケット通信 : Nagleアルゴリズムによる遅延を確認したい
1
+ ソケット通信 Nagleアルゴリズムによる遅延をたい
body CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  小さいデータを送信するとNagleバッファに入り, 送信時刻と受信時刻に200ms程の差異が現れると思うのですが, 現在ほぼ時間の差異はありません.
7
7
 
8
- Nagleアルゴリズムによ遅延はどうすれば発生することがきますか? ご教授お願い致します.
8
+ Nagleアルゴリズムによ遅延はどうすれば発生するしょうか? ご教授お願い致します.
9
9
 
10
10
  ### 該当のソースコード
11
11
  参照元コード https://oshiete.goo.ne.jp/qa/7317690.html