回答編集履歴

1

追記。

2018/03/31 02:32

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -35,3 +35,71 @@
35
35
 
36
36
 
37
37
  Node.jsでウィンドウサイズを取得できるかどうかは分かりませんが、低レベルのソケット関連のAPIか、お使いのOSのカーネルのシステムコールやAPIに依存するはずです。取得できたとしても、よほどパフォーマンスのチューニングが必要でない限り、意識する必要は無いはずです。言い換えると、一般的なソケットプログラミングのアプリケーションでは、TCPのウィンドウサイズなどと、低レベルな部分を意識して作るべきではありません。(知っていて損はありませんが)
38
+
39
+
40
+
41
+ -----
42
+
43
+ **追記しました**:2018/03/31 11:31
44
+
45
+
46
+
47
+ そもそものご質問が「**TCPウィンドウサイズを取得するには**」と、手段を問うものでもあったと思いますので、個人的興味もあり、少し調べてみました。補足させていただきます。
48
+
49
+
50
+
51
+ > Node.jsでウィンドウサイズを取得できるかどうかは分かりませんが、
52
+
53
+
54
+
55
+ ※我ながら「分からないなら回答するな。」と自分で思ってしまったのも大きいですが。
56
+
57
+
58
+
59
+ github の[nodejs/node](https://github.com/nodejs/node)のリポジトリからソースをcloneし、軽く見てみました。読み込みが足りないかもしれませんが、ソケットに関する低レベルな設定を行っている部分は見当たりませんでした。そこで、Linuxのカーネルの方に視点を向けてみます。
60
+
61
+
62
+
63
+ こと、Linuxに限って言えばTCPのウィンドウサイズは`/proc`ファイルシステム中に現れる`tcp_rmem`ファイルで参考となる情報を得られると思います。Ubuntu 17.04(x86)で試した例です。
64
+
65
+ ```
66
+
67
+ $ uname -a
68
+
69
+ Linux vmubuntu17 4.10.0-38-generic #42-Ubuntu SMP Tue Oct 10 13:24:28 UTC 2017 i686 i686 i686 GNU/Linux
70
+
71
+
72
+
73
+ $ cat /proc/sys/net/ipv4/tcp_rmem
74
+
75
+ 4096 87380 6183360
76
+
77
+ ```
78
+
79
+
80
+
81
+ `tcp_rmem` の内容は、[Man page of TCP](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/tcp.7.html)の`tcp_rmem`によると、並びが`min default max` とあります。このファイルをNodeのプログラムにおいてネイティブコールで読み出せば、参考程度にはなります。しかしながらTCPウィンドウサイズは常に一定と言うわけではなく、OSによって動的に変わるもののようなので、そもそもリアルタイムに取得することは難しい(あるいは不可能)とも取れます。リアルタイムに現在の値を取得できないと言うことは、「TCPウィンドウサイズを意識したプログラミング自体、不可能」という結論にも繋がるかと思います。
82
+
83
+
84
+
85
+ 参考ですが、Nodeのソケットは[net.Socket](https://nodejs.org/api/net.html#net_class_net_socket)のメンバーである`fd`がネイティブのソケットのディスクリプターに対応していると推察します(未確認です)
86
+
87
+ `net.Socket`からは逸脱しますが、この`fd`の値を引数としてネイティブのsocket関連のシステムコールを使えば、ソケットを介して低レベルな情報のやり取りもやってできないことはなさそうです。
88
+
89
+
90
+
91
+ [ヒント 3. 帯域幅遅延積に対して TCP ウィンドウを調整する](https://www.ibm.com/developerworks/jp/linux/library/l-hisock/index.html)
92
+
93
+
94
+
95
+ 更に参考として、Windows。レジストリに書き込むことでTCPウィンドウサイズの範囲を変えられるようです。が、デフォルトでは存在しないのでここから取得することは確実性が低いと言えます。
96
+
97
+ [TcpWindowSize](https://technet.microsoft.com/en-us/library/cc938219.aspx)
98
+
99
+ [WindowsVista/7のウインドウサイズ](http://unixservermemo.web.fc2.com/bangai/win7-rwin.htm)
100
+
101
+
102
+
103
+ Windows APIやWindowsドライバーを利用した取得方法は無いものかと軽く探してみたのですが、見当たりませんでした。Windowsに関してはかなり昔に同じトピックで一度探してみたことがあるのですが、依然としてプログラムインターフェース上でも公開されていないものと思われます。
104
+
105
+ ※Windowsドライバーに関しては、丁寧にリファレンスを探すと見つかるのかもしれません。