質問

サーバーアプリケーションにはJava Serversocketクラスを使用しています。 Accept()メソッドはTCP/IPハンドシェイクに参加しますか?

TCP/IPダンプとコマンドNetStatからわかるように、クライアントは受理前のメソッドとの接続を確立し、ソケットオブジェクトを返します。

それはJavaの問題ですか、それとも私はAccept()セマンティクスを理解していませんか?

役に立ちましたか?

解決

通常、UNIXでは、Socketを聴取()でマークすると、オペレーティングシステムが接続の受け入れを開始します。 Accept()関数を呼び出すと、オペレーティングシステムは、すでに開いている接続を単純に渡します。聞くパラメーターを使用して、OSが許可する「受け入れられていない」オープン接続の数を指定できます(つまり、キューのサイズ)。

他のヒント

accept メソッドは、それ自体、握手に積極的に参加しません。メッセージの送信と受信は、通常はOSカーネルスペースにTCP/IPプロトコルスタックに実装されます。

しかし accept() メソッドは、TCP/IPスタックがSyn-ackメッセージを送信するという意味で関与しています。 accept() 関連するIPアドレスとポートでバインドされたソケットをアクティブに呼び出します。 3方向の握手が完了すると、 accept() メソッドコールが完了します。

プロセスが呼び出されない場合 accept() やがて、着信Synメッセージがカーネルによって削除され、リモートクライアントは最終的に接続の試みをタイムアウトします。 (一方、IPアドレス /ポートがバインドされていない場合、カーネルは最初に応答する可能性が高く、リモートクライアントには「接続が拒否された」が表示されます。)

クライアントとサーバーが接続された後にのみ返品を受け入れます(ハンドシェイクなど)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top