>サーバにSYN信号を送る時のconnectとtcp/ipソフトの係わりが書かれている >(同書43頁)のに、それがサーバ側のtcp/ipソフトに届いた後、 >既に動いているacceptとどう連係をとるのか、書かれた個所が >見付からなかったからです。
『ネットワークはなぜ...』の中では, socket,bind,listen,accept,connect,read,writeといった関数は すべて,Socketライブラリを構成するプログラムであり, それがTCP/IPソフトと一体となって動くものとして解説してあります。 43ページにconnectとTCP/IPの関係が記述してあるとのことですが, ここに書いてあることは,アプリケーションプログラムがconnectを呼び出す動作と, connectの中の動作(つまり,TCP/IPが一体となって動く動作)であって, connectとTCP/IPソフトの関係ではないんです。 connectとTCP/IPソフトは,やはり,一体のものなんです。 そのつもりで,もう一度読み直してみてください。
それから,サーバ側の動作は [335] で説明したとおりですが, acceptに着目すると次のようになります。 (1)サーバ側プログラムがacceptを呼び出す サーバ側プログラムは,socket,bind,listenと順に呼び出して, ソケットの準備を整えたら,その後,acceptを呼び出します。 すると,呼び出したプログラムの実行は停止し,acceptに制御が移ります。 (2)acceptがSYN=1の到着を待つ acceptはSYN=1が到着するまで待ち状態となります。 つまり,実行を停止し,SYN=1のパケットが届くまで,じっと待つわけです。 (3)acceptがSYN=1に応答 SYN=1が到着したらその内容を検査し,接続を許可する場合は, ACK=1,SYN=1を返す (4)acceptがACK=1をの到着を待つ ACK=1,SYN=1を返したら,相手からACK=1が返ってくるはずなのでそれを待ちます。 (5)acceptがACK=1を受信 ACK=1を受信したら,接続動作は完了したものとします。 これでacceptの実行は終わり,制御をサーバ側プログラムに戻します。 (6)サーバ側プログラムの実行再開 acceptを呼び出したプログラムの実行が再開し,次のステップに進みます。
44~45ページにもう少し詳しい説明がありますから, そちらも参照してください。
また,Socketライブラリとアプリケーションプログラムの関係は, OSの機能を呼び出すシステムコールの一種ともいえるので, アプリケーションとOSの関係も勉強してみるとよいかもしれません。 マルチタスキングでのタスクスイッチングも参考になると思います。
More information about text formats
socket,bind,listen,accept,connect,read,writeはSocketの一部
>サーバにSYN信号を送る時のconnectとtcp/ipソフトの係わりが書かれている
>(同書43頁)のに、それがサーバ側のtcp/ipソフトに届いた後、
>既に動いているacceptとどう連係をとるのか、書かれた個所が
>見付からなかったからです。
『ネットワークはなぜ...』の中では,
socket,bind,listen,accept,connect,read,writeといった関数は
すべて,Socketライブラリを構成するプログラムであり,
それがTCP/IPソフトと一体となって動くものとして解説してあります。
43ページにconnectとTCP/IPの関係が記述してあるとのことですが,
ここに書いてあることは,アプリケーションプログラムがconnectを呼び出す動作と,
connectの中の動作(つまり,TCP/IPが一体となって動く動作)であって,
connectとTCP/IPソフトの関係ではないんです。
connectとTCP/IPソフトは,やはり,一体のものなんです。
そのつもりで,もう一度読み直してみてください。
それから,サーバ側の動作は [335] で説明したとおりですが,
acceptに着目すると次のようになります。
(1)サーバ側プログラムがacceptを呼び出す
サーバ側プログラムは,socket,bind,listenと順に呼び出して,
ソケットの準備を整えたら,その後,acceptを呼び出します。
すると,呼び出したプログラムの実行は停止し,acceptに制御が移ります。
(2)acceptがSYN=1の到着を待つ
acceptはSYN=1が到着するまで待ち状態となります。
つまり,実行を停止し,SYN=1のパケットが届くまで,じっと待つわけです。
(3)acceptがSYN=1に応答
SYN=1が到着したらその内容を検査し,接続を許可する場合は,
ACK=1,SYN=1を返す
(4)acceptがACK=1をの到着を待つ
ACK=1,SYN=1を返したら,相手からACK=1が返ってくるはずなのでそれを待ちます。
(5)acceptがACK=1を受信
ACK=1を受信したら,接続動作は完了したものとします。
これでacceptの実行は終わり,制御をサーバ側プログラムに戻します。
(6)サーバ側プログラムの実行再開
acceptを呼び出したプログラムの実行が再開し,次のステップに進みます。
44~45ページにもう少し詳しい説明がありますから,
そちらも参照してください。
また,Socketライブラリとアプリケーションプログラムの関係は,
OSの機能を呼び出すシステムコールの一種ともいえるので,
アプリケーションとOSの関係も勉強してみるとよいかもしれません。
マルチタスキングでのタスクスイッチングも参考になると思います。