[Armadillo:07396] Re: ソケット通信においてSO_REUSEADDRオプションが効かない

Shin-ya Koga email@hidden
2011年 7月 13日 (水) 11:24:16 JST


サムシングプレシャスの古賀です。

この件、Armadillo Linux というよりは、Linux の TCP/IP スタッ
ク一般の話になると思いますが・・・

杉谷さん([Armadillo:07395]):
>追加の情報です。
> 
>iTronとwindowsでTCPヘッダのオプションに相違がありました。
>iTronでは、TCPヘッダのオプションを使用せずに通信を行っております。
>windowsでは、TCPヘッダオプションにTime Stampを設定して通信しております。
>TCPヘッダオプションのTime Stamp有無によってarmadillo linuxの挙動が
>変化することは考えられないでしょうか。

カーネルのソースツリーを眺めてみたところ、Time Stamp の有無で
挙動が変わるようですね。ご指摘の通り、SO_REUSEADDR が指定された
際に、Time Stamp を受け取れていないソケットに対しては、
TIME_WAIT 状態での再利用が行われない実装になっているようです。

以下のソースが、関連個所だと思います:

・/net/ipv4/tcp_ipv4.c
 tcp_twsk_unique()
 tcp_v4_connect()

・/net/ipv4/inet_hashtables.c
 __inet_hash_connect()
 __inet_check_established()

・/include/net/timewait_sock.h
 twsk_unique()


tcp_twsk_unique() では、当該ソケットの直近の Time Stamp が記録
されていない場合は、0 を返すようですが、その結果、
__inet_check_established() 内の not_unique: ラベル部が実行されて
-EADDRNOTAVAIL が戻り値として返され、tcp_v4_connect() における
inet_hash_connect() の呼び出しがエラーとなって失敗する、という
状況ではないかと思います。

--
古賀信哉 (株)サムシングプレシャス



armadillo メーリングリストの案内