TCPサーバプログラムの改修(SO_LINGERオプションの利用)

目安時間:約 4分

TCPのサーバ側プログラムを改修する機会があった。

 

時々ではあるが、アプリケーション起動時に、サーバ側プログラムで

 

2分ほどの待ちが発生するとのこと。

 

TCPの知識はほとんどなかったため、この機会に勉強をした。

 

以下のサイトが分かりやすかった。

 

http://www.ne.jp/asahi/hishidama/home/tech/socket/tcp.html

 

このサイトは、以前JavaやScalaの学習をした際にもお世話になっている。

 

サイトの作者は相当熱心な勉強家であることがうかがえる。

 

技術者として尊敬している。

 

 

そちらに下記のように書かれている。

 

 

たしかに今回サーバー側から先に切断しており、サーバー側がアクティブクローズ側になっている。

 

そしてサーバー側でnetstatコマンドで調べてみると、

 

利用しているポートがTIME_WAIT状態になっていた。

 

 

そしてその対策として、

 

とのこと。

 

SO_LINGERオプションにより、強制的にclose状態にできるようだ。

 

だが、筆者も書いている通り、あまりよい方法とは言えないようだ。

 

以下のサイトなども、SO_LINGERオプションは推奨された方法ではなく、

 

本来あるべき姿は、クライアント側から切断するようなアーキテクチャにすることとのこと。

 

https://code.i-harness.com/ja/q/3954e9

 

 

 

ただ、すぐにでも解消したかったので、

 

今回は、とりあえずSO_LINGERオプションを使ってみることにした。

 

下記のサイトを参考に実装。

 

https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/setopt.htm

 

その際に、LINGERを以下のように設定した。

 

 

SO_LINGERをONにして、タイムアウトを0にした。

 

その結果、確かにTIME_WAIT状態に遷移しなくなりました!!!!

 

 

副作用がないのか心配ですが、とりあえずSO_LINGERオプションをONにして

 

様子をみたいと思います。

タグ: 

カテゴリ:TCP/IP  [コメント:0]

この記事に関連する記事一覧

コメントフォーム

名前

メールアドレス

URL

コメント

トラックバックURL: 

ページの先頭へ