Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
先に述べたコネクションの切断方法は、先にクライアントがソケットを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年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:53, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members