質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

978閲覧

c socket FIN_WAIT2 のソケットが消える理由

akiyama3284pga

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/08/10 10:13

編集2022/08/10 12:10

いろいろと手を動かしながらソケットの謎を解いているのですがどうしても一つ腑に落ちない点があります。

サーバ側とクライアント側ソケットを一般的にTCPのコードで接続し、
クライアント側"だけ"をclose()した場合、

サーバ側: CLOSE_WAIT
クライアント側: FIN_WAIT2

の状態にそれぞれなります。ここまではわかります。
※因みに、プログラムが終了するとソケットが解除されるので終了前にsleep(10000000)を両方しています。

しかし、
その状態で暫くすると、クライアント側のソケットが消えてしまします。

(クライアント接続し、closeした状態)
sudo netstat -antlp | grep -e 5127 -e 8955
tcp 0 0 127.0.0.1:8955 127.0.0.1:5127 FIN_WAIT2 -
tcp 0 0 127.0.0.1:5127 127.0.0.1:8955 CLOSE_WAIT 42420/./server

(暫くしたあとの状態)
sudo netstat -antlp | grep -e 5127 -e 8955
tcp 0 0 127.0.0.1:5127 127.0.0.1:8955 CLOSE_WAIT 42420/./server

↑FIN_WAIT2 のソケットはなぜ消える??

クライアント側 => 相手のclose()を待っている状態でスリープ
サーバ側 => プログラムがclose()するのを待っている状態でスリープ

という状態なので、消える理由がわかりません。

その上、CLOSE_WAITしているソケットに再度クライアント(クライアントは同ポートでbindしている)が接続しても接続して送受信できてしまします。
これはCLOSE_WAITしているソケットを再利用のような具合で使用しているということなのでしょうか。

何かヒントをいただけましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/08/10 10:25

消える、とは何をどう見て消えると判断してるんでしょうか
akiyama3284pga

2022/08/10 10:44

ありがとうございます。 実はその辺りもはっきりと理解できておりません。 消える、とはディスクプリタの割り当てからそのソケットが解除されることを言うのか、はたまた確保されたメモリを削除することで初めて消えると言えるのか。 全く同じ情報のソケットがメモリ上に存在することが許されるのかどうかというレベルではっきりできていません… なので今はnetstatの結果を見て、 消えたな…と判断しています。
TaichiYanagiya

2022/08/11 02:10

「暫くすると」は tcp_fin_timeout (60秒) ではありませんか?
akiyama3284pga

2022/08/11 02:30

ありがとうございます。 そんなものがあったとは全く知りませんでした... まさに60秒程度で消えていたため、タイムアウトしていたのだと思います。 もしよろしければついでにお聞きできればと思うのですが、 取り残されたCLOSE_WAIT状態のソケットがサーバ側にある状態で再度、クライアント側が先と同じ自ポートにbindしてconnnect()できてしまうのはCLOSE_WAITしているソケットがあるためaccept()がスキップされてそのソケットで継続してやりとりするためなのでしょうか?
TaichiYanagiya

2022/08/11 03:00

再接続について、詳しくないのですが、多分そうなのだと思います。
akiyama3284pga

2022/08/11 03:30 編集

ありがとうございます。 CLOSE_WAITしたものに再度ぶつけ、ぶつける際に今度はどちらもclose()せずにsleep()させますと、 CLOSE_WAIT 68242/./server ↓ ESTABLISHED 68242/./server のように変化するため、プロセスも変化していないため再利用しているのだと考えるようにしたいと 思います。 ありがとうございました。
guest

回答1

0

自己解決

TaichiYanagiya様のご助力で解決することができました。

消える理由 => fin_wait2 にはデフォルトで"タイムアウト"があるため。(それは1分程度)

CLOSE_WAITしているソケットに再度接続できる理由 => 恐らくはそのソケットを"再利用"しているため。

投稿2022/08/11 03:32

編集2022/08/11 03:33
akiyama3284pga

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問