TCPタイマとソケットタイマの違いを教えて下さい

弊社TCP/IPプロトコルスタック「μNet3」に関するご質問
返信する
アバター
eForce技術担当
記事: 193
登録日時: 2014年4月24日(木) 14:18

TCPタイマとソケットタイマの違いを教えて下さい

投稿記事 by eForce技術担当 » 2015年2月27日(金) 12:10

TCPタイマはTCPのレイヤで作用するタイマで、ソケットタイマはソケットレイヤ(API)で作用するタイマです。
TCPではデータやフラグを送信すると相手からACK応答を得るまで再送します。
このとき再送を止めるまでの時間をTCPのタイマで設定します。
SYN、再送、切断、それぞれのタイマは以下の状況で動作します。

SYNタイムアウト
SYNを送信した(con_soc())時にかかるタイマです。
状態遷移で言うとSYN-RECEIVED(パッシブオープン)もしくはSYN-SENT(アクティブオープン)になります。
このときACKを得るとタイマは停止しESTABLISHED状態に移行します。もしタイマが満了した場合
アクティブオープンならcon_soc()はE_TMOUTを返却します。パッシブオープンならLISTEN状態に
戻りcon_soc()は戻ってきません。(ソケットタイマがexpireしていないことが前提)

再送タイムアウト
データを送信した(snd_soc())時にかかるタイマです。
uNet3のTCPはESTABLISHEDかCLOSE-WAIT状態でしかデータを送信できません。
もしタイマが満了した場合、TCPはRSTを送信してCLOSED状態に戻ります。

切断タイムアウト
FINを送信した(cls_soc())時にかかるタイマです。
状態遷移で言うとFIN-WAIT1(アクティブクローズ)もしくはLAST-ACK(パッシブクローズ)になります。
このときACKを得るとFIN-WAIT2 or CLOSED状態に移行します。
もしタイマが満了した場合TCPはRSTを送信しcls_soc()はE_TMOUTを返却します。(状態はCLOSEDへ)


一方ソケット(API)のタイマはAPIを呼び出した時に待ちが発生する場合に作用します。

snd_socのタイムアウト
送信バッファに空き領域が無い場合に待つ時間を設定します。
TCPのsnd_soc()ではアプリケーションの送信データは送信バッファにコピーしますが
確認応答が取れていない送信データが送信バッファを占有した場合はsnd_soc()は待ち状態になります。
このタイマがexpireした場合、snd_soc()はE_TMOUTを返却しますがTCPの状態は変化しません。

rcv_socのタイムアウト
パケット未受信の場合に待つ時間を設定します。
このタイマがexpireした場合、rcv_soc()はE_TMOUTを返却しますがTCPの状態は変化しません。

con_socのタイムアウト
パッシブオープンの場合、SYNを受信するまでの待ち時間を設定します。
このタイマがexpireした場合、con_soc()はE_TMOUTを返却しTCPの状態はLISTENからCLOSEDに移行します。
アクティブオープンの場合、SYN/ACKを受信するまでの待ち時間を設定します。
このタイマがexpireした場合、con_soc()はE_TMOUTを返却しTCPはSYNの再送を停止して状態は
SYN-SENTからCLOSEDに移行します。

cls_socのタイムアウト
アクティブクローズの場合、FINを受信するまでの待ち時間を設定します。
パッシブクローズの場合、送信したFINに対するACKを受信するまでの待ち時間を設定します。
このタイマがexpireした場合、cls_soc()はE_TMOUTを返却しTCPはRSTを送信して状態はCLOSEDに移行します。
シャットダウンの場合は待ちになりません。

返信する