2017-01-11 128 views
0

我在java(Socket)中編寫了一個簡單的tcp服務器,並通過telnet連接到它。一切正常。我只想澄清關於tcp協議的一件事。如果我以不正確的方式停止服務器(只需在執行期間按下IntelligIdea中的停止按鈕),我會在客戶端提示中看到一條消息:連接丟失。所以,問題是:服務器在崩潰之前是否向客戶端發送任何信息?或者,telnet和服務器一直髮送一些我不知道的信息,以確保連接存在,即使我不發送任何東西?或者它與tcp協議有關?簡而言之:客戶如何知道服務器崩潰? 我是新手,所以決定在這裏清除它。先謝謝你!telnet如何關閉tcp連接?

回答

0

連接在TCP上運行。 TCP協議指定連接如何關閉。

  1. 關閉端(服務器)操作系統檢測到該進程在沒有關閉套接字的情況下結束,並啓動套接字關閉進程。
  2. 服務器向客戶端發送FIN數據包
  3. 客戶端協議棧收到FIN並通知套接字用戶(telnet)該連接正在關閉,並向服務器發送ACK。
  4. 服務器收到ACK並進入等待客戶端發送FIN的狀態。
  5. 當客戶端程序(telnet)確認關閉操作系統時,客戶端協議棧會向服務器發送FIN數據包。
  6. 服務器接收到FIN並終止並清理其連接側,並用ACK進行響應。
  7. 客戶端收到ACK並終止並清除其連接的一側。

所有這一切都發生在操作系統級別,比通知Telnet客戶端的插座關閉JVM或客戶端程序等下面,是看不見的。在許多地方,您可以在Web上找到有關TCP協議的更多詳細信息。

+0

#2並且其餘的大部分都不會在Windows中發生:取而代之的是發佈RST。當客戶端程序(Telnet)關閉套接字時,#5應該是'。 '向客戶端通知套接字正在關閉'應該是'通知客戶端連接已經被對等關閉'。客戶端關閉它自己的套接字。 – EJP