質問編集履歴

7

2019/11/22 10:03

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
File without changes
test CHANGED
File without changes

6

結果追記

2019/11/22 10:03

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
File without changes
test CHANGED
@@ -636,6 +636,62 @@
636
636
 
637
637
  ```
638
638
 
639
+ 結果
640
+
641
+ ```log
642
+
643
+ Nagleオンの場合
644
+
645
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.537
646
+
647
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.584
648
+
649
+ データ送信 送信時刻 = 2019 11 22 01:05:20.584
650
+
651
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.584
652
+
653
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.631
654
+
655
+ データ送信 送信時刻 = 2019 11 22 01:05:20.631
656
+
657
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.631
658
+
659
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.678
660
+
661
+ データ送信 送信時刻 = 2019 11 22 01:05:20.678
662
+
663
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.678
664
+
665
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:05:20.724
666
+
667
+ ...
668
+
669
+ ```
670
+
671
+ ```log
672
+
673
+ Nagleオフの場合
674
+
675
+ データ受信。サイズ : 8byte. 送信時刻 = 2019 11 22 01:22:21.897
676
+
677
+ データ送信 送信時刻 = 2019 11 22 01:22:21.897
678
+
679
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.900
680
+
681
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.901
682
+
683
+ データ送信 送信時刻 = 2019 11 22 01:22:21.901
684
+
685
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.901
686
+
687
+ データ受信。サイズ : 4byte. 送信時刻 = 2019 11 22 01:22:21.917
688
+
689
+ データ送信 送信時刻 = 2019 11 22 01:22:21.917
690
+
691
+ ...
692
+
693
+ ```
694
+
639
695
 
640
696
 
641
697
  ### 環境

5

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

2019/11/22 04:18

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
File without changes
test CHANGED
@@ -298,6 +298,346 @@
298
298
 
299
299
 
300
300
 
301
+ ### コード改修(11.22)
302
+
303
+ サーバ側
304
+
305
+ ```java
306
+
307
+ import java.io.IOException;
308
+
309
+ import java.io.InputStream;
310
+
311
+ import java.io.OutputStream;
312
+
313
+ import java.net.ServerSocket;
314
+
315
+ import java.net.Socket;
316
+
317
+ import java.text.DateFormat;
318
+
319
+ import java.text.SimpleDateFormat;
320
+
321
+ import java.util.Date;
322
+
323
+
324
+
325
+ public class Server
326
+
327
+ {
328
+
329
+ public static ServerSocket ss = null;
330
+
331
+
332
+
333
+ public static Socket soc = null;
334
+
335
+
336
+
337
+ private static InputStream is = null;
338
+
339
+
340
+
341
+ private static OutputStream os = null;
342
+
343
+
344
+
345
+ public static void main(String[] args)
346
+
347
+ {
348
+
349
+
350
+
351
+ try
352
+
353
+ {
354
+
355
+ // サーバソケット生成
356
+
357
+ ss = new ServerSocket(5000);
358
+
359
+ soc = ss.accept();
360
+
361
+ soc.setTcpNoDelay(true);
362
+
363
+ is = soc.getInputStream();
364
+
365
+ os = soc.getOutputStream();
366
+
367
+
368
+
369
+ DateFormat format = new SimpleDateFormat("yyyy MM dd hh:mm:ss.SSS");
370
+
371
+ byte sndData[] = new byte[4];
372
+
373
+ sndData[0] = 0x01;
374
+
375
+ sndData[1] = 0x02;
376
+
377
+ sndData[2] = 0x03;
378
+
379
+ sndData[3] = 0x04;
380
+
381
+
382
+
383
+ while (true)
384
+
385
+ {
386
+
387
+ byte rcvData[] = new byte[16];
388
+
389
+ int size = 0;
390
+
391
+ // データ読込み (受信するまで待つ)
392
+
393
+ for (int tmp = 0; tmp <= 1; tmp++)
394
+
395
+ {
396
+
397
+ size = is.read(rcvData);
398
+
399
+ System.out.println("データ受信。サイズ : " + size + "byte. 送信時刻 = " + format.format(new Date()));
400
+
401
+ if (size == 8)
402
+
403
+ {
404
+
405
+ break;
406
+
407
+ }
408
+
409
+ }
410
+
411
+ // clientからの送信が200ms遅延してる. ACK遅延により返答も200ms遅延
412
+
413
+ // 上記要因を踏まえて3回目以降のトリガー
414
+
415
+ os.write(sndData);
416
+
417
+ os.flush();
418
+
419
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
420
+
421
+ }
422
+
423
+ }
424
+
425
+ catch (IOException e)
426
+
427
+ {
428
+
429
+ e.printStackTrace();
430
+
431
+ }
432
+
433
+ finally
434
+
435
+ {
436
+
437
+ try
438
+
439
+ {
440
+
441
+ is.close();
442
+
443
+ os.close();
444
+
445
+ soc.close();
446
+
447
+ ss.close();
448
+
449
+ }
450
+
451
+ catch (IOException e)
452
+
453
+ {
454
+
455
+ e.printStackTrace();
456
+
457
+ }
458
+
459
+ }
460
+
461
+ }
462
+
463
+ }
464
+
465
+ ```
466
+
467
+
468
+
469
+ クライアント側
470
+
471
+ ```java
472
+
473
+ import java.io.IOException;
474
+
475
+ import java.io.InputStream;
476
+
477
+ import java.io.OutputStream;
478
+
479
+ import java.net.Socket;
480
+
481
+ import java.net.UnknownHostException;
482
+
483
+ import java.text.DateFormat;
484
+
485
+ import java.text.SimpleDateFormat;
486
+
487
+ import java.util.Date;
488
+
489
+
490
+
491
+ public class Client1 {
492
+
493
+
494
+
495
+ public static void main(String[] args) {
496
+
497
+
498
+
499
+ Thread client = new ClientThread();
500
+
501
+ client.start();
502
+
503
+ try {
504
+
505
+ //Thread.sleep(1000);
506
+
507
+ client.join();
508
+
509
+ } catch (Exception e) {
510
+
511
+ e.printStackTrace();
512
+
513
+ }
514
+
515
+ }
516
+
517
+ }
518
+
519
+
520
+
521
+ class ClientThread extends Thread{
522
+
523
+ private static Socket soc = null;
524
+
525
+ private static OutputStream os = null;
526
+
527
+ private static InputStream is = null;
528
+
529
+
530
+
531
+ public void run() {
532
+
533
+ try {
534
+
535
+ // ソケット生成
536
+
537
+ soc = new Socket("172.23.56.83", 5000);
538
+
539
+ soc.setTcpNoDelay(false);
540
+
541
+ is = soc.getInputStream();
542
+
543
+ os = soc.getOutputStream();
544
+
545
+
546
+
547
+ DateFormat format = new SimpleDateFormat("yyyy MM dd hh:mm:ss.SSS");
548
+
549
+ byte sndData[] = new byte[4];
550
+
551
+ sndData[0] = 0x04;
552
+
553
+ sndData[1] = 0x03;
554
+
555
+ sndData[2] = 0x02;
556
+
557
+ sndData[3] = 0x01;
558
+
559
+
560
+
561
+ for (int cnt = 0; cnt <10; cnt++) {
562
+
563
+ // 1回目送信(即送信される)
564
+
565
+ os.write(sndData);
566
+
567
+ os.flush();
568
+
569
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
570
+
571
+ // 0.01秒スリープ
572
+
573
+ try {
574
+
575
+ Thread.sleep(10);
576
+
577
+ } catch (Exception e) {
578
+
579
+ e.printStackTrace();
580
+
581
+ }
582
+
583
+ // 2回目送信(1回目のACKが遅延ACKにより200ms遅延)
584
+
585
+ // 加えてNagleにより送信も200ms遅延
586
+
587
+ os.write(sndData);
588
+
589
+ os.flush();
590
+
591
+ System.out.println("データ送信" + " 送信時刻 = " + format.format(new Date()));
592
+
593
+
594
+
595
+ byte rcvData[] = new byte[16];
596
+
597
+ int size = 0;
598
+
599
+ // データ読込み
600
+
601
+ size = is.read(rcvData);
602
+
603
+ System.out.println("データ受信。サイズ : " + size + "byte. 送信時刻 = " + format.format(new Date()));
604
+
605
+ }
606
+
607
+ } catch (UnknownHostException e1) {
608
+
609
+ e1.printStackTrace();
610
+
611
+ } catch (IOException e1) {
612
+
613
+ e1.printStackTrace();
614
+
615
+ } finally {
616
+
617
+ try {
618
+
619
+ is.close();
620
+
621
+ os.close();
622
+
623
+ soc.close();
624
+
625
+ } catch (IOException e) {
626
+
627
+ e.printStackTrace();
628
+
629
+ }
630
+
631
+ }
632
+
633
+ }
634
+
635
+ }
636
+
637
+ ```
638
+
639
+
640
+
301
641
  ### 環境
302
642
 
303
643
  OS : win10

4

2019/11/22 04:12

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,11 @@
1
+ 初学者です。不十分な知識で僭越ながら質問させてください。よろしくお願いします。
2
+
3
+
4
+
1
5
  ### 実現したいこと
2
6
 
7
+
8
+
3
9
  Javaのソケット通信において, 勉強と動作確認のため, Nagleアルゴリズムによる遅延をわざと発生させたいです.
4
10
 
5
11
 

3

2019/11/20 10:04

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
File without changes
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- Nagleアルゴリズムによる遅延はどうすれば発生するのでしょうか? ご教授お願い致します.
15
+ **Nagleアルゴリズムによる遅延はどうすれば発生するのでしょうか**? ご教授お願い致します.
16
16
 
17
17
 
18
18
 
@@ -289,3 +289,17 @@
289
289
 
290
290
 
291
291
  ```
292
+
293
+
294
+
295
+ ### 環境
296
+
297
+ OS : win10
298
+
299
+ JDK : 1.8
300
+
301
+ IDE : eclipse
302
+
303
+
304
+
305
+ サーバとクラインアントは同一ホストで行なってました。

2

タイトル編集

2019/11/20 09:49

投稿

Rai_Feit
Rai_Feit

スコア7

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

1

修正

2019/11/20 08:36

投稿

Rai_Feit
Rai_Feit

スコア7

test CHANGED
@@ -1 +1 @@
1
- Javaソケット通信 : Nagleアルゴリズムによる遅延を確認したい
1
+ ソケット通信 Nagleアルゴリズムによる遅延をたい
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- Nagleアルゴリズムによ遅延はどうすれば発生することがきますか? ご教授お願い致します.
15
+ Nagleアルゴリズムによ遅延はどうすれば発生するしょうか? ご教授お願い致します.
16
16
 
17
17
 
18
18