Show page source of internal22-293-コネクションのshutdown #22761

{{{ comment
h2w-title:コネクションのshutdown
}}}

== コネクションのshutdown == #SECTION07884000000000000000

先に述べたコネクションの切断方法は、先にクライアントがソケットを 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 [[BR]]2000年06月11日 (日) 22時29分57秒 JST''