コネクションのshutdown

先に述べたコネクションの切断方法は、先にクライアントがソケットをcloseし通信を停止したのち、サーバがソケットをcloseするという手順を提供する。

shutdownシステムコールは、クライアントがコネクションの切断の主導権を握るが、サーバ側に先にソケットをcloseさせるためのメカニズムである。

tcp_shutdown関数(shutdownシステムコール本体)は、ソケットをTCP_FIN_WAIT1状態に推移(tcp_close_state関数)させ、相手のソケットにFINを送る(tcp_send_fin関数)。少しすると相手からFIN対するACKが返され、TCP_FIN_WAIT2状態に推移(tcp_rcv_state_process関数)する。

tcp_shutdown関数でTCP_FIN_WAIT1、TCP_FIN_WAIT2に推移したソケットは継続して受信(tcp_rcv_state_process関数)可能である。相手のTCP_CLOSE_WAIT状態のソケットから送られて来たパケットを全て受信し、読み出すことができる。

相手のソケットがcloseされるとFINパケットが飛んで来て、それ以降のシーケンス番号のパケットを受け取れなくなる(tcp_rcv_state_process関数)。アプリケーションからは、その後もソケットのreceive_queueにパケットのある間はrecv処理を継続できるが、パケットが無くなった時点でEOFが返される。

あとは、アプリケーションの意志でソケットをcloseするだけある。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1