2014-11-08 53 views
0

如果它不在兩個方向關閉,它會永遠關閉 - 無論過期定時器? - 它可以半關閉,但如果只有一個啓動close(),tcp連接可以終止嗎?在tcp連接終止

換句話說: 在TCP連接終止中 - 當只有客戶端啓動關閉但服務器不關閉時,能否完全關閉連接? 或者可以通過兩種方式獨立關閉tcp連接?

+1

請詳細說明,我不清楚。 – peterh 2014-11-08 20:20:42

+0

您正在使用很多在上下文中不清楚的術語。例如,當你說「在兩個方向上關閉」時,你的意思是每一方都調用'close'?或者你的意思是每個TCP連接的兩個方向(這是一個雙向流,對吧?)關機?當你說「半封閉」時,你的意思是一方封閉了流的兩個方向?或者你的意思是一方關閉了發送方向,但接收方向仍然打開?你的問題充滿了模糊的術語,使你無法理解你在問什麼。 – 2014-11-08 20:26:11

+0

而且,更模糊的術語「啓動關閉」意味着它稱爲「關閉」?還是意味着它調用'shutdown'來表明它不會再發送?或者是其他東西? – 2014-11-08 20:27:46

回答

1

每個對等體可以獨立於另一個關閉TCP連接,並且對等體在嘗試從對等體讀取時獲取EOF(例如,沒有更多字節),或者在嘗試寫入到對等體時獲得ECONNRESET或EPIPE連接被對等關閉,但只有當套接字知道對方不想接收更多數據時,請參見下文。

關閉連接實際上是兩個部分組成:

  • 應用不會發送任何數據:shutdown(sock,SHUT_WR)。在這種情況下,內核將向對等體發送一個FIN,以表明不再有數據會跟隨。從對等體讀取將返回EOF。
  • 應用程序不想接收更多數據:shutdown(sock,SHUT_RD)。在這種情況下,最初不會將信息發送給對等方,但是如果從對等方接收到數據,它們將被RST拒絕。

close()的呼叫因此等同於關閉連接的兩側同時(SHUT_RDWR)。