2017-01-11 13 views
0

私はjava(Socket)でシンプルなtcpサーバを作成し、telnetで接続しました。すべて正常に動作します。私はちょうどTCPプロトコルについての1つのことを明確にしたい。サーバーを不適切な方法で停止すると(実行中にIntelligIdeaを停止するだけで)、クライアントのプロンプトにメッセージが表示されます。接続が失われました。だから、問題は、サーバーがクラッシュする前にクライアントに情報を送信するかどうかです。または、telnetとserverは、私が何も送っていなくても、接続が存在するかどうかを知るために、いつも互いに知り合わない情報を送信しますか、それともtcpプロトコルと関係していますか?一言で言えば、クライアントはサーバーがクラッシュしたことをどのように知っていますか? 私は新しいので、ここでそれをクリアすることに決めました。前もって感謝します!telnetがtcp接続をどのように閉じるのでしょうか?

答えて

0

接続はTCPで実行されます。 TCPプロトコルは、接続がどのように閉じられるかを指定します。

  1. クローズサイド(サーバー)OSは、ソケットを閉じずにプロセスが終了したことを検出し、ソケットクローズプロセスを開始します。
  2. サーバはFINパケットをクライアントに送信します
  3. クライアントプロトコルスタックはFINを受信し、接続が終了したことをソケットユーザ(telnet)に通知し、ACKをサーバに送信します。
  4. サーバはACKを受信し、クライアントがFINを送信するのを待っている状態になります。
  5. クライアントプログラム(telnet)がOSへの終了を確認すると、クライアントプロトコルスタックはFINパケットをサーバーに送信します。
  6. サーバはFINを受信し、接続を終了してクリーンアップし、ACKで応答します。
  7. クライアントはACKを受信し、接続を終了し、その接続面をクリーンアップします。

このすべてが、OSレベルで起こる、JVMまたはクライアントプログラムとソケットが閉じているTelnetクライアントへの通知以外に以下のは、目に見えないです。多くの場所で、Web上のTCPプロトコルに関する詳細を見つけることができます。

+0

#2と残りのほとんどはWindowsでは発生しません。代わりにRSTが発行されます。 #5は 'クライアントプログラム(Telnet)がソケットを閉じるとき'でなければなりません。 「ソケットが閉じていることをクライアントに通知する」は、「接続がピアによって閉じられたことをクライアントに通知する」べきである。クライアントは独自のソケットを閉じます。 – EJP

関連する問題