arduinoで簡単サーボ制御
続・Tomcat5.5のTCPセッション保持時間って?
はじめに
タイトルからしてそもそもおかしいのですが、チラ裏なんで恥をそのまま晒しておきますw
Tomcatはサーブレットコンテナ兼HTTPサーバなので、TCPからみたらユーザ(ネットワーク層で言うところの上位層)にあたります。
TCPのセッション保持は結局OSのネットワークプロトコルスタックの実装に依るものでいて、Tomcatは関係ありませんね。
Windowsの場合、レジストリをいじることで変更できます。
調べてみた
http://bwind.blog19.fc2.com/blog-entry-41.html の件、必死こいてTomcatを色々調べても出てこなかったでござる。 前の記事に書いた予想が大体当たってたんだけど、 OSのプロトコルスタックの設定でした。試してた環境はWindowsXP。
- クライアントが1回目の通信開始
- 通信が終わる
- サーバはTCPセッションをTIME_WAIT状態で「一定時間」保持(これはTCPの仕様)
- この間クライアントが同じソースポートで2回目(別)の通信開始
- サーバはTIME_WAIT状態のセッションに新たなパケットが来たと思うんだけど、シーケンス番号が違うので破棄 *1
- クライアントは2回目の通信のSYN ACKを受け取れない、接続タイムアウトしたと思う
ということでした。
「一定時間」はRFC793では「最大セグメント生存時間の2倍」で、RFC推奨値は240秒 (最大セグメント生存時間は大体のTCPパケットで120秒だから) Windows2000はきっちり240秒設定だったらしいんだけど、TIME_WAITのセッションがある間は 新しいセッションを当然張れないので、パフォーマンス的にどうよ?ってことになったらしく、 XP以降は120秒になってるらしい。
で、ここは最小値30まで設定可能なので30に変更しておいた。ホントは10秒くらいにしたかったんだけどね。 設定方法はレジストリに値追加して再起動するだけ。参考URLからTcpTimedWaitDelay検索でどうぞ。
参考 http://support.microsoft.com/kb/314053/ja
わざわざこんな対応しなくても、通常は「短い時間に同じsrcポートで別の通信しようとしてくるクライアントがタコです」って言えば済む話だと思いますです。
*1:本来は、通信終了後-CLOSEまでに、ネットワーク上を彷徨ってるパケットをこの間に受け取ることができるようにしておくステート
WinAVRのコマンドがエクスプローラから起動すると上手く動かない
↓続報はこちら
http://bwind.blog19.fc2.com/blog-entry-70.html
こちらの記事は微妙な予想ばっかりだったので、続報だけ見るのが吉かも。
WinAVRとAVRStudioをインストールしまして、SVNにある他人の作ったプロジェクトをチェックアウトしてきて、 ビルド。
winavrさんはコンパイルに gnu make を使うので、他のmakeが間違って使われないように PATHに気をつける。 で、ビルドするためにこさえたbatファイルをエクスプローラからダブルクリックして実行すると、
--- /usr/bin/sh: /c/WinAVR/bin/avr-objcopy: Invalid argument ---
こんなのが出るわけですよ。 今度は、コマンドプロンプトを起動して、このbatファイルを実行すると、今度はエラーが出ずにビルドやら他の 作業をちゃんとやってくれる。
…………??
わけわかめ。 エクスプローラからダブルクリックして起動したコマンドプロンプトは、PC起動時の環境変数を使うので、 PATHがちゃんと通ってなかったか?と思って、再起動しても結果は同じ。
batファイルにpath出力させるようにしたら、両者とも全く同じ、作業フォルダも同じ(batファイルのあるディレクトリ)
※両者
1. エクスプローラからダブルクリックして起動したbatファイル
2. コマンドプロンプトを起動し、batファイルのあるフォルダまで行って、起動したbatファイル
…………??
わけわかめ。 cygwinが入ってるので、なんかそっちのシェルがでしゃばって勝手にパス解決できないプンスコしてるみたいなんだけど、 お前呼んでないから。つかエクスプローラから起動した時だけ出てくるってどういうことよ。
って、X-Finderお前かー!! ファイラにX-Finderを使ってるんだけど、こいつ経由で起動するとどうやらダメらしい。 "Windowsのエクスプローラ"からダブルクリックすると上手くいきました。 さて、X-Finderの設定でも見てみるか…。
(追記) PC再起動したら今度はX-Finderから起動したbatファイルが上手く動いて、Windowsエクスプローラから起動した batファイルが/usr/bin/sh: ~~エラー吐きやがったww これはひどい。
AVRStudioから直接ビルドした場合も、上手くいく場合と上手くいかない場合が再起動毎に発生する。 起動回数が偶数(奇数)の時はなんかが頑張っちゃうのか?ざけんなw
SVSが悪さをしているのか、cygwinが悪さをしているのか、はたまたOSなのかPCなのか…。 これはちょっとしんどそうなので、完全にビルド出来なくなるまでは放置かな…。
(さらに追記) setで環境変数全部出して、ビルドできるときとできないときの差分を見てみたら __COMPAT_LAYER=ElevateCreateProcess というのがある時に失敗する。
batファイルの先頭に set __COMPAT_LAYER= として、この設定を削除してから実行すると、失敗している方の起動方法でもエラーがでなくなった。 うーむ。結局ビスたんのせいだったということか…?