(toppers-users 2919) Re: TINET による PPP 接続時の切断について

阿部 司 abe @ jo.tomakomai-ct.ac.jp
2009年 4月 3日 (金) 17:07:57 JST


田辺様

苫小牧高専の阿部です。

>>> 1.再接続すると TCP の通信が出来ない
>>>
>>>  tcp_sht_cep() と tcp_cls_cep() で閉じたソケットと同じ ID で
>>> 再度、tcp_con_cep() を用いて接続しようとすると、
>>> モデムは再発信を行い、PPP の接続までは完了しているようなのですが、
>>> tcp_con_cep() から制御が戻ってきません。何故でしょう?
>>>
>>>  シーケンスの流れとしては、
>>>
>>> ・TCP_CRE_CEP() で受付口の作成
>>> ・tcp_con_cep(TMO_FEVR) でサーバに接続
>>> ・接続後、tcp_snd_dat(TMO_FEVR)、tcp_rcv_dat(TMO_FEVR) で通信
>>> ・tcp_sht_cep(TMO_FEVR) でデータ送信終了
>>> ・tcp_cls_cep(TMO_FEVR) で通信端点のクローズ
>>> ・tcp_con_cep(TMO_FEVR) でサーバに再接続 ← ここで制御が戻ってこない
>>>
>>>  tcp_con_cep() 関数中の、
>>> 	error = twai_flg(cep->est_flgid, (CEP_EVT_CLOSED |
>>> 			CEP_EVT_ESTABLISHED), TWF_ORW, &flag, tmout);
>>> でブロックされているようです。
>>>
>>>  もしや、tcp_con_cep() を呼び出してはいけない?
>>> 若しくは、動的 APIの tcp_cre_cep() を使わないといけない?
>> サンプルプログラムの nserv 等では、特に問題はありませんが、
>> サーバの設定なのでしょうか
>> TRACE を有効にして、TCP のセグメントの送受信を見るのも有効かもしれません。
>> TRACE については、tinet.pdf の 19ページ
>>
>> 「5.6 TCP ヘッダのトレース出力機能」
>>
>> を参照してください。
> 
>  TCP ヘッダのトレースをしてみました。結果、
> 
> <初回接続時>
> =O     1.385=c: 1 s:SS f:02000:-----S- s: 344690855 a:         0 w:  512 l:   0>
> =O    53.099=c: 1 s:SS f:02000:-----S- s: 344690855 a:         0 w:  512 l:   0>
> <I    53.476=c: 1 s:SS f:02000:--A--S- a: 344690856 s:5434720702 w:64240 l:   0=
> =O    53.530=c: 1 s:ES f:02001:--A---- s:         1 a:         1 w:  512 l:   0>
> <I    53.974=c: 1 s:ES f:02000:--AP--- a:         1 s:         1 w:64240 l:  33=
> =O    54.036=c: 1 s:ES f:02002:--AP--- s:         1 a:        34 w:  512 l:  19>
> <I    54.457=c: 1 s:ES f:02000:--A---- a:        20 s:        34 w:64240 l:   0=
> <I    54.652=c: 1 s:ES f:02000:--AP--- a:        20 s:        34 w:64240 l: 104=
> 
> <2回目接続時>
> =O    74.014=c: 1 s:SS f:02000:-----S- s: 358593605 a:         0 w:  512 l:   0>
> =O   166.706=c: 1 s:SS f:02001:-----S- s: 358593605 a:         0 w:  512 l:   0>
> =O   230.706=c: 1 s:SS f:02001:-----S- s: 358593605 a:         0 w:  512 l:   0>
> 
> となりました。2回目の最初のパケットは通信端点の状態が 0x02000 ですが、
> ダイアル後、送信される時は 0x02001 になっています。この辺が原因でしょうか?

tinet/netinet/tcp_var.h の 460行目ぐらいに TCP 通信端点の状態フラグが
定義されています。

0x00000001 は、直ちに相手に ACK を送る。
0x00002000 は、生成済みで有効な通信端点。

という意味ですので、今回には関係ないと思います。

二回目接続時の状態から見ると、こちらからサーバに、
コネクション確立要求を送っていますが、サーバから応答がないと推測されます。
なお、送信した PPP フレームがエラーで破棄され、サーバに届いていないか、
サーバからの PPP フレームがエラーで破棄されている可能性もありますので、
プロトコルアナライザー等でフレームを見て判断するしか方法は無いようですね。

>  また、折角乱数?で初期化したと思われるシーケンス番号が
> 途中でリセットされています。正しくは、
> 
> =O     1.385=c: 1 s:SS f:02000:-----S- s: 344690855 a:         0 w:  512 l:   0>
> =O    53.099=c: 1 s:SS f:02000:-----S- s: 344690855 a:         0 w:  512 l:   0>
> <I    53.476=c: 1 s:SS f:02000:--A--S- a: 344690856 s:5434720702 w:64240 l:   0=
> =O    53.530=c: 1 s:ES f:02001:--A---- s: 344690856 a:5434720703 w:  512 l:   0>
> 
> と続くはずなのではないですか?
> リセットしてもいいという仕様が有ったらすいません。。。

tinet.pdf の「5.6 TCP ヘッダのトレース出力機能」にもありますが、
4行目以降は、コネクション確立時からの相対値です。

よろしくお願いします。

-- 
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" 〒059-1275 北海道苫小牧市字錦岡443番地
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp  TEL/FAX: 0144-67-8937